On 20.2.13 21:36, Jukka Zitting wrote:

The problem is that SessionDelegate.needsRefresh() requires clean up after
the "real" method returns.

We could refactor the code so that such clean up is not needed.

AFAICT the mechanism is currently used to avoid repeated refreshing of
the session from nested operations.

The problem is actually more subtle than that. The mechanism avoids refresh being called from reentrant calls to any session scoped operation (that's the reason for using a counter in perform). Otherwise we risk that a session is refreshed while we are in the middle of a session scoped operation. This can lead to very unpredictable test failures and bugs.


An alternative design would be to
turn needsRefresh to a flag in SessionDelegate that could be raised by
observation and other things like that. The enter() method would then
trigger a refresh and clear the flag, which would prevent further
nested operations from repeatedly refreshing until the flag gets
raised again.

This would already work using ObservationManagerImpl.hasEvents(), which is exactly such a flag. However, it does not prevent us from the reentrant case I described above.


[...] This will at the same time address the
issue I brought up at our last meeting that implementing JCR method in terms
of each others will result in the preconditions being checked multiple times
instead of just once.

The delegate pattern should allow us to avoid these cases. Instead of
JCR methods calling each other, they could be calling the relevant
delegate methods directly.

Yes and it would also solve the reentrance problem. It would however mean that we need to strictly disallow for any JCR session scoped method to call any JCR session scoped method. I'm not sure how to reliable communicate this since not adhering to it wouldn't immediately fail but rather show up in some unpredictable behaviour probably much later.

Michael

Reply via email to