[Scons-users] MD5-timestamp decider overrides csigs from SConsign incorrectly
Andrew C. Morrow
andrew.c.morrow at gmail.com
Tue Feb 23 12:08:22 EST 2016
If that is in fact the underlying issue, and with the qualification that I
really don't want to re-ignite an old controversy, I would be very happy to
see that issue addressed.
Thanks,
Andrew
On Thu, Jan 14, 2016 at 8:14 PM, William Blevins <wblevins001 at gmail.com>
wrote:
> See if this looks like your topic:
> http://scons.tigris.org/issues/show_bug.cgi?id=2980
>
> On Fri, Jan 15, 2016 at 1:09 AM, William Blevins <wblevins001 at gmail.com>
> wrote:
>
>> This has already been reported I believe; let me lookup the issue.
>>
>> On Fri, Jan 15, 2016 at 12:44 AM, Sean Houghton <sean.houghton at gmail.com>
>> wrote:
>>
>>> We’ve been having a difficult-to-track-down issue which we believe boils
>>> down to the behavior of the MD5-timestamp decider when the list of
>>> dependencies has changed between current runs and previous runs.
>>>
>>>
>>>
>>> The main Node.changed function calls the decider function for every
>>> input to a node in all cases (called out by a comment “Note that we now
>>> *always* check every dependency”). The inputs are determined by zip()ing
>>> together two lists: a list of current children and a list of previous
>>> ninfos. This happens even if the length of the list or the order of
>>> dependencies in the list has changed:
>>>
>>>
>>>
>>> diff = len(children) - len(then)
>>>
>>> if diff:
>>>
>>> # The old and new dependency lists are different lengths.
>>>
>>> # This always indicates that the Node must be rebuilt.
>>>
>>> # We also extend the old dependency list with enough None
>>>
>>> # entries to equal the new dependency list, for the benefit
>>>
>>> # of the loop below that updates node information.
>>>
>>> then.extend([None] * diff)
>>>
>>> if t: Trace(': old %s new %s' % (len(then), len(children)))
>>>
>>> result = True
>>>
>>>
>>>
>>> for child, prev_ni in zip(children, then):
>>>
>>> if child.changed_since_last_build(self, prev_ni):
>>>
>>> if t: Trace(': %s changed' % child)
>>>
>>> result = True
>>>
>>>
>>>
>>> The implementation of `changed_since_last_build` on FS.File nodes for
>>> MD5-timestamp overwrites the csig of a node whenever the timestamp matches:
>>>
>>>
>>>
>>> def changed_timestamp_then_content(self, target, prev_ni):
>>>
>>> if not self.changed_timestamp_match(target, prev_ni):
>>>
>>> try:
>>>
>>> self.get_ninfo().csig = prev_ni.csig
>>>
>>> except AttributeError:
>>>
>>> pass
>>>
>>> return False
>>>
>>> return self.changed_content(target, prev_ni)
>>>
>>>
>>>
>>> If `prev_ni` does not correspond to the current node, the timestamps are
>>> checked anyway. If the timestamps happen to match (one second granularity
>>> is easily coarse enough for this to be possible), then the node’s current
>>> csig is blindly overwritten by the csig pulled from `prev_ni`--even if it
>>> belongs to a completely different node!
>>>
>>>
>>>
>>> In our setup, which uses CacheDir, this led to bad csigs and a bad
>>> “cachedir_bsig”, which led to retrieving the wrong file from the cache
>>> directory when the set of dependencies for a node changed.
>>>
>>>
>>>
>>> Can someone confirm this a SCons bug? We're switching back to the basic
>>> MD5 decider for now. We'll also spend some time and attempt to fix it as
>>> soon as possible. (Note that we’re on 2.3.6, but I checked the BitBucket
>>> repo and the current version appears to have the same issue.)
>>>
>>>
>>>
>>> _______________________________________________
>>> Scons-users mailing list
>>> Scons-users at scons.org
>>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>>>
>>>
>>
>
> _______________________________________________
> Scons-users mailing list
> Scons-users at scons.org
> https://pairlist4.pair.net/mailman/listinfo/scons-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist4.pair.net/pipermail/scons-users/attachments/20160223/2c3745da/attachment-0001.html>
More information about the Scons-users
mailing list