[elephant-devel] Re: Postmodern, Act II
Alex Mizrahi
killerstorm at newmail.ru
Mon May 5 13:15:43 UTC 2008
LPP> you explained that global-sync cache mode only works within a txn.
LPP> I thought that per-transaction cache mode does this, and that global
LPP> sync extends this behaviour so transactions/threads can share the
LPP> cache?
LPP> If not, what's the difference between them?
both modes rely on transactional semantics -- assumption that transactions
are isolated and changes from one transaction do not (and should not)
propagate into other one.
and both use transaction boundaries -- begin/commit -- to their
initialization/finalization.
in per-transaction mode cache is created on beginning of transaction and is
abandoned on commit.
global-sync mode extends it reusing cache between transaction. when
transactions starts, it checks if there are existing cache instances in a
pool and takes one if it exists, or creates new one.
if existing cache instance is used, it gets synchronized on first use -- and
once within a single transaction. synchronization is actually reading what's
changed and wiping those entries, however it is somewhat complicated to pull
only changes _since_ last update.
when transaction commits successfully, cache is returned into the pool and
can be re-used later.
sidenote: "global-sync" actually means "globally synchronized" that sort of
means that all writes in all processes/threads are tracked and cache entries
are invalidated (synchronized) accordingly, that allows us to re-use cache
between transactions.
so, both modes only makes sense when there is considerable amount of
database reads within each transaction: per-transaction mode for obvious
reasons, and sync cache because synchronization (that must be done inside
each transaction) requires at least few database commands and it is not
feasible to synchronize if it's only going to save single read command.
interaction of global-sync cache and threads is another question --
currently it does not share data among concurrently running threads. if you
have 10 threads running in parallel, you'll have 10 independent cache
instances.
cache pool is global though, so if you create new thread for each event, it
won't be a problem -- it will take first cache in pool if available.
it might seem like this behaviour is suboptimal -- it sharing cache among
threads will save space.
but it is a tradeoff -- shared cache will require some sort of locking, and
that might reduce performance. so it actually depends on database usage
patterns which scheme is prefered.
as cache sharing is considerably more complex to implement, only isolated
thing is implemented for now.
More information about the elephant-devel
mailing list