[Scons-dev] fix for partial reads from cache

Bill Deegan bill at baddogconsulting.com
Tue Oct 27 16:09:11 EDT 2020


Any chance you can make a pull request for this?

On Tue, Oct 27, 2020 at 1:02 PM Raven Kopelman <raven.kopelman at safe.com>
wrote:

> Looks like attachment is not easy to access; here's plaintext patch
>
> diff -ru -x '*.pyc' SCons.orig/CacheDir.py
> /usr/local/lib/python2.7/dist-packages/scons/SCons/CacheDir.py
> --- SCons.orig/CacheDir.py 2020-10-23 16:12:44.773349285 -0700
> +++ /usr/local/lib/python2.7/dist-packages/scons/SCons/CacheDir.py
> 2020-10-23 16:19:48.676570382 -0700
> @@ -56,7 +56,20 @@
>          if fs.islink(cachefile):
>              fs.symlink(fs.readlink(cachefile), t.get_internal_path())
>          else:
> -            env.copy_from_cache(cachefile, t.get_internal_path())
> +            try:
> +                env.copy_from_cache(cachefile, t.get_internal_path())
> +            except:
> +                try:
> +                    # In case file was partially retrieved (and now
> corrupt)
> +                    # delete it to avoid poisoning commands like 'ar' that
> +                    # read from the initial state of the file they are
> writing
> +                    # to.
> +                    t.fs.unlink(t.get_internal_path())
> +                except:
> +                    pass
> +
> +                raise
> +
>              try:
>                  os.utime(cachefile, None)
>              except OSError:
> @@ -71,7 +84,7 @@
>      cd = env.get_CacheDir()
>      cachedir, cachefile = cd.cachepath(t)
>      if t.fs.exists(cachefile):
> -        return "Retrieved `%s' from cache" % t.get_internal_path()
> +        return "Retrieving `%s' from cache" % t.get_internal_path()
>      return None
>
>  CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc,
> CacheRetrieveString)
> diff -ru -x '*.pyc' SCons.orig/Taskmaster.py
> /usr/local/lib/python2.7/dist-packages/scons/SCons/Taskmaster.py
> --- SCons.orig/Taskmaster.py 2020-10-23 16:12:44.785349378 -0700
> +++ /usr/local/lib/python2.7/dist-packages/scons/SCons/Taskmaster.py
> 2020-10-23 15:55:41.521758762 -0700
> @@ -243,10 +243,13 @@
>                  cached_targets.append(t)
>              if len(cached_targets) < len(self.targets):
>                  # Remove targets before building. It's possible that we
> -                # partially retrieved targets from the cache, leaving
> -                # them in read-only mode. That might cause the command
> +                # retrieved a subset of targets from the cache, leaving
> +                # them in an inconsistent state. That might cause the
> command
>                  # to fail.
>                  #
> +                # Note that retrieve_from_cache() ensures no single
> target can
> +                # be partially retrieved (file left in corrupt state).
> +                #
>                  for t in cached_targets:
>                      try:
>                          t.fs.unlink(t.get_internal_path())
>
> --
> *Raven Kopelman* | Team Lead, Senior Developer
>
> Safe Software Inc.
> *T* 604.501.9985 x 331 | *F* 604.501.9965
> raven.kopelman at safe.com | www.safe.com
>
> <http://www.safe.com/emailsignature>
>
>
> On Tue, Oct 27, 2020 at 1:00 PM Raven Kopelman <raven.kopelman at safe.com>
> wrote:
>
>> Hi scons devs,
>>
>> Here's a fix to clean up reads from the cache that fail part way
>> through.  Absolutely experienced by us in production (non-local shared
>> cache).  This may be what my last UUID temp name fix was really trying to
>> address, but I can imagine edge cases that the UUID fix could still improve.
>>
>> This could also have been fixed in Taskmaster.py near my comment change,
>> but the reasons for cleanup seemed different enough to keep them distinct.
>>
>> Also cleaned up the logged message tense, as message is logged before the
>> cache retrieval begins.
>>
>> Thanks!
>> --
>> *Raven Kopelman* | Team Lead, Senior Developer
>>
>> Safe Software Inc.
>> *T* 604.501.9985 x 331 | *F* 604.501.9965
>> raven.kopelman at safe.com | www.safe.com
>>
>> <http://www.safe.com/emailsignature>
>>
> _______________________________________________
> Scons-dev mailing list
> Scons-dev at scons.org
> https://pairlist2.pair.net/mailman/listinfo/scons-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist2.pair.net/pipermail/scons-dev/attachments/20201027/592a5c10/attachment-0001.html>


More information about the Scons-dev mailing list