Sat Mar 27 18:00:37 CET 2010

RP: race conditions

So, what happens when a pull and a push interfere?  Or can't they?  

It seems they can; i.e. invalidation can take a ``different branch''
compared to a parallel evaluation step.

Suppose the computation needs to evaluate:

        a + b

which both depend on a common value c which is about to be
invalidated, but the invalidation is interleaved with the evaluation
like this:

        force: cache   a  x
        inval: clear   a
        inval: clear   b
        force: compute b  x

then the value a, b seen by the force correspond to different
histories, leading to possibly inconsistent data.

Another problem is that concurrent evaluations might interfere.
I.e. a two threads might start re-evaluations in parallel.

The same goes for concurrent invalidation.

How to solve these problems?

It seems like synchronization on both sides separately isn't much of a
problem: node locking should be enough.  However, for push/pull sync I
don't see how to do this except for locking the whole network.