??>> can you catch a backtrace? it seems to be quite relevant here

LPP>  6: (LAMBDA NIL)
LPP>     At
LPP> /home/sky/projects/mystic/hg.beta1/packages/elephant/src/db-postmodern
LPP> /pm-sql.lisp:1577: (LAMBDA NIL)
LPP>     At
LPP> /home/sky/projects/mystic/hg.beta1/packages/elephant/src/db-postmodern
LPP> /pm-btree.lisp:2638: (SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION
LPP> (DB-POSTMODERN::POSTMODERN-STORE-CONTROLLER
LPP>  T))
LPP>     At
LPP> /home/sky/projects/mystic/hg.beta1/packages/elephant/src/db-postmodern
LPP> /pm-transaction.lisp: 60
LPP>     Local variables:
LPP>       ARG-0 = 8
LPP>       ARG-3 = #<POSTMODERN-STORE-CONTROLLER (POSTGRESQL 127.0.0.1
LPP> mystic-world mystic mystic PORT
LPP> 5433)>
LPP>       ARG-4 = #<CLOSURE (LAMBDA NIL) {BA0738D}>
LPP>  9: (SB-PCL::FAST-METHOD (SETF DB-POSTMODERN::INTERNAL-GET-VALUE) (T T
LPP> DB-POSTMODERN::PM-BTREE))

it seems you didn't wrap your code into explicit transaction.

transaction was started implicitly by (setf internal-get-value) before writing to database, but cache update was done outside transaction, so it was not initialized properly. fix is quite simple -- moving all txn functions inside that implicit transactions.

but if you do not start your transactions explicitly, enclosing as many operations as posible, global-sync-cache absolutely makes no sense -- it takes more effort to synchornize changes than to actually load value from database, if that's just a single value.

so, maybe, if cache is set into global sync mode, it should signal error if there is no explicit transactions -- because that would be misuse of global sync cache, leading to significant overhead. or you think it makes sense to allow such behaviour? it might make sense in REPL, for example..


_______________________________________________
elephant-devel site list
elephant-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/elephant-devel

Reply via email to