with-open-store closes the store when you're done, null'ing out *store- controller*. With sufficient concurrency you are likely to get a race condition where the if stmt in with-city-store succeeds but the body fails since you aren't locking access to *store-controller*.
Ian On Nov 20, 2008, at 11:16 AM, Tayssir John Gabbour wrote: > Hi! > > With Elephant under both Postmodern and CLSQL, I'm consistently losing > my DB connection. This apparently happens when writing from fairly > simultaneous threads. (Two threads may write to the same btree key at > around the same time.) > > All I do is add objects to a BTree, keyed by their UUID. (And there's > two simple indexes.) No persistent metaclasses or anything; I just use > it as a persistent table. > > Am I doing something terribly wrong? Code and error messages at the > end of this email. > > > All the best, > Tayssir > > > > ;;; How I add stuff to the DB > > (defmethod save-to-db (thing) > (with-city-store > (setf (get-value (moderator-ontology:uuid thing) (my-btree)) > thing))) > > (defmacro with-city-store (&body body) > `(if *store-controller* > (progn ,@body) > (with-open-store (citycouncil-config:*citycouncil-store-spec*) > ;; removing with-transaction doesn't have much effect > (with-transaction () > ,@body)))) > > (defun create-indexes (&key (btree (my-btree))) > (with-city-store > (add-index btree > :index-name *semantic-type-index-name* > :key-form '(lambda (secondary-db primary-key value) > (declare (ignore secondary-db primary-key)) > (values t (type->storage-location value)))) > (add-index btree > :populate t > :index-name *owner-index-name* > :key-form '(lambda (secondary-db primary-key value) > (declare (ignore secondary-db primary-key)) > (if (typep value 'moderator-ontology:icon) > (values t (moderator-ontology:owner > value)) > (values nil nil)))))) > > > > ;;; CLSQL messages > > > Condition CONTROLLER-LOST-ERROR was signalled. > [Condition of type CONTROLLER-LOST-ERROR] > > Restarts: > 0: [CONTINUE] Open a new instance and continue? > 1: [TERMINATE-THREAD] Terminate this thread (#<THREAD > "hunchentoot-worker-204" RUNNING {B90AFB9}>) > > Backtrace: > 0: ((SB-PCL::FAST-METHOD ELEPHANT::GET-CON (PERSISTENT)) #<unused > argument> #<unused argument> #<SQL-BTREE oid:0> #<unused argument>) > Locals: > ELEPHANT::INSTANCE = #<SQL-BTREE oid:0> > 1: ((SB-PCL::FAST-METHOD GET-VALUE (T DB-CLSQL::SQL-BTREE)) > #<unavailable argument> #<unavailable argument> :STORE-2008-06-24 > #<SQL-BTREE oid:0>) > Locals: > SB-DEBUG::ARG-0 = :<NOT-AVAILABLE> > SB-DEBUG::ARG-1 = :<NOT-AVAILABLE> > SB-DEBUG::ARG-2 = :STORE-2008-06-24 > SB-DEBUG::ARG-3 = #<SQL-BTREE oid:0> > 2: ((LAMBDA ())) > [No Locals] > 3: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION > (DB-CLSQL::SQL-STORE-CONTROLLER T)) ..)[:EXTERNAL] > Locals: > SB-DEBUG::ARG-0 = 8 > SB-DEBUG::ARG-1 = :<NOT-AVAILABLE> > SB-DEBUG::ARG-2 = :<NOT-AVAILABLE> > SB-DEBUG::ARG-3 = #<SQL-STORE-CONTROLLER (POSTGRESQL localhost > elephant_test #1=griffie #1# ... > SB-DEBUG::ARG-4 = #<CLOSURE (LAMBDA ()) {AA2988D}> > > > > There is no applicable method for the generic function > #<STANDARD-GENERIC-FUNCTION DB-CLSQL::CONTROLLER-DB (1)> > when called with arguments > (NIL). > [Condition of type SIMPLE-ERROR] > > Restarts: > 0: [TERMINATE-THREAD] Terminate this thread (#<THREAD > "hunchentoot-worker-204" RUNNING {B90AFB9}>) > > Backtrace: > 0: ((LAMBDA (SWANK-BACKEND::DEBUGGER-LOOP-FN)) #<FUNCTION (LAMBDA #) > {ADF2D6D}>) > Locals: > SB-KERNEL:*HANDLER-CLUSTERS* = :<NOT-AVAILABLE> > SWANK-BACKEND::*SLDB-STACK-TOP* = :<NOT-AVAILABLE> > SWANK-BACKEND::DEBUGGER-LOOP-FN = #<FUNCTION (LAMBDA ()) > {ADF2D6D}> > 1: (SWANK::DEBUG-IN-EMACS #<SIMPLE-ERROR {B368FA9}>) > 2: ((LAMBDA (SWANK-BACKEND::HOOK SWANK-BACKEND::FUN)) #<FUNCTION > SWANK:SWANK-DEBUGGER-HOOK> #<CLOSURE (LAMBDA #) {B369205}>) > 3: (SWANK::CALL-WITH-REDIRECTED-IO #<SWANK::CONNECTION {B23A3D9}> > #<CLOSURE (LAMBDA #) {B369215}>) > 4: (SWANK::CALL-WITH-CONNECTION #<SWANK::CONNECTION {B23A3D9}> > #<CLOSURE (LAMBDA #) {B369205}>) > 5: (SWANK:INVOKE-SLIME-DEBUGGER #<SIMPLE-ERROR {B368FA9}>) > 6: ((LAMBDA (SWANK-BACKEND::HOOK SWANK-BACKEND::FUN)) #<FUNCTION > SWANK:SWANK-DEBUGGER-HOOK> #<CLOSURE (LAMBDA #) {B3691E5}>) > 7: (INVOKE-DEBUGGER #<SIMPLE-ERROR {B368FA9}>) > 8: (INVOKE-DEBUGGER #<SIMPLE-ERROR {B368FA9}>)[:EXTERNAL] > 9: ((SB-PCL::FAST-METHOD HUNCHENTOOT:MAYBE-INVOKE-DEBUGGER (T)) > #<unavailable argument> #<unavailable argument> #<SIMPLE-ERROR > {B368FA9}>) > 10: (SIGNAL #<SIMPLE-ERROR {B368FA9}>)[:EXTERNAL] > 11: (ERROR "~@<There is no applicable method for the generic function > ~2I~_~S~\n ~I~_when called with arguments > ~2I~_~S.~:>")[:EXTERNAL] > Locals: > SB-DEBUG::ARG-0 = 3 > SB-DEBUG::ARG-1 = "~@<There is no applicable method for the > generic function ~2I~_~S~\n .. > 12: ((SB-PCL::FAST-METHOD NO-APPLICABLE-METHOD (T)) #<unavailable > argument> #<unavailable argument> #<STANDARD-GENERIC-FUNCTION > DB-CLSQL::CONTROLLER-$ 13: (DB-CLSQL::SQL-GET-FROM-CLCN-NTH 0 > :STORE-2008-06-24 NIL 0) > 14: ((LAMBDA ())) > 15: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION > (DB-CLSQL::SQL-STORE-CONTROLLER T)) ..)[:EXTERNAL] > Locals: > SB-DEBUG::ARG-0 = 8 > SB-DEBUG::ARG-1 = :<NOT-AVAILABLE> > SB-DEBUG::ARG-2 = :<NOT-AVAILABLE> > SB-DEBUG::ARG-3 = #<SQL-STORE-CONTROLLER (POSTGRESQL localhost > elephant_test #1=griffie #1# ... > SB-DEBUG::ARG-4 = #<CLOSURE (LAMBDA ()) {AA2988D}> > 16: ((SB-PCL::FAST-METHOD LOCATE-ICON-BY-OWNER (STRING)) > #<unavailable argument> #<unavailable argument> > "bc3c7276-3a80-0780-23e1-40c33cd1b238") > > > > > > > > > ;;; Postmodern messages > > > > Database error: #<SB-SYS:FD-STREAM for "a socket" {BCC6AB1}> is closed > [Condition of type CL-POSTGRES:DATABASE-SOCKET-ERROR] > > Restarts: > 0: [TERMINATE-THREAD] Terminate this thread (#<THREAD > "artificial-thread" RUNNING {BCA96B9}>) > > Backtrace: > 0: ((LAMBDA ())) > 1: (DB-POSTMODERN::POSTGRES-FORMAT #<MODERATOR-ONTOLOGY:MEETING > {BC9EED1}> :OBJECT) > 2: ((LAMBDA ())) > 3: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION > (DB-POSTMODERN::POSTMODERN-STORE-CONTROLLER T)) ..)[:EXTERNAL] > 4: ((SB-PCL::FAST-METHOD (SETF DB-POSTMODERN::INTERNAL-GET-VALUE) (T > T DB-POSTMODERN::PM-BTREE)) ..) > 5: ((SB-PCL::FAST-METHOD (SETF GET-VALUE) (T T > DB-POSTMODERN::PM-INDEXED-BTREE)) ..) > 6: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION > (DB-POSTMODERN::POSTMODERN-STORE-CONTROLLER T)) ..)[:EXTERNAL] > 7: ((SB-PCL::FAST-METHOD ADD (MODERATOR-ONTOLOGY:UUID-MIXIN)) > #<unavailable argument> #<unavailable argument> > #<MODERATOR-ONTOLOGY:MEETING {BC9EED1}>) > > > > (#<SB-IMPL::HANDLER INPUT on BOGUS descriptor 10: #<CLOSURE # > {BB053AD}>>) has a bad file descriptor. > [Condition of type SIMPLE-ERROR] > > Restarts: > 0: [REMOVE-THEM] Remove bogus handlers. > 1: [RETRY-THEM] Retry bogus handlers. > 2: [CONTINUE] Go on, leaving handlers marked as bogus. > 3: [TERMINATE-THREAD] Terminate this thread (#<THREAD > "artificial-thread" RUNNING {B9E68D9}>) > > Backtrace: > 0: (SB-IMPL::HANDLER-DESCRIPTORS-ERROR) > 1: (SB-IMPL::SUB-SUB-SERVE-EVENT NIL NIL) > 2: (SB-IMPL::SUB-SERVE-EVENT NIL NIL NIL) > 3: (SB-SYS:WAIT-UNTIL-FD-USABLE 10 :INPUT NIL) > 4: (SB-IMPL::REFILL-INPUT-BUFFER #<SB-SYS:FD-STREAM for "a > socket" {B9F8AA1}>) > 5: (SB-IMPL::INPUT-UNSIGNED-8BIT-BYTE #<SB-SYS:FD-STREAM for "a > socket" {B9F8AA1}> T NIL) > 6: (CL-POSTGRES::READ-UINT1 #<unavailable argument>) > 7: (CL-POSTGRES::SEND-EXECUTE #<SB-SYS:FD-STREAM for "a socket" > {B9F8AA1}> #<unavailable argument> #<unavailable argument> > #<unavailable argument>) > 8: ((LABELS #:G303)) > 9: ((LAMBDA ())) > 10: (DB-POSTMODERN::POSTGRES-FORMAT #<MODERATOR-ONTOLOGY:MEETING > {B9D1459}> :OBJECT) > 11: ((LAMBDA ())) > 12: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION > (DB-POSTMODERN::POSTMODERN-STORE-CONTROLLER T)) ..)[:EXTERNAL] > 13: ((SB-PCL::FAST-METHOD (SETF DB-POSTMODERN::INTERNAL-GET-VALUE) (T > T DB-POSTMODERN::PM-BTREE)) ..) > 14: ((SB-PCL::FAST-METHOD (SETF GET-VALUE) (T T > DB-POSTMODERN::PM-INDEXED-BTREE)) ..) > 15: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION > (DB-POSTMODERN::POSTMODERN-STORE-CONTROLLER T)) ..)[:EXTERNAL] > 16: ((SB-PCL::FAST-METHOD ADD (MODERATOR-ONTOLOGY:UUID-MIXIN)) > #<unavailable argument> #<unavailable argument> > #<MODERATOR-ONTOLOGY:MEETING {B9D1459}>) > > > > Database error: Connection to database server lost. > [Condition of type CL-POSTGRES:DATABASE-CONNECTION-LOST] > > Restarts: > 0: [RECONNECT] Try to reconnect. > 1: [TERMINATE-THREAD] Terminate this thread (#<THREAD > "artificial-thread" RUNNING {ACBD271}>) > > Backtrace: > 0: (CL-POSTGRES::ENSURE-CONNECTION #<CL-POSTGRES:DATABASE-CONNECTION > {AD297E9}>) > 1: (CL-POSTGRES:EXEC-QUERY #<CL-POSTGRES:DATABASE-CONNECTION > {AD297E9}> #<unavailable argument> CL-POSTGRES:IGNORE-ROW-READER) > 2: (POSTMODERN:ABORT-TRANSACTION #<POSTMODERN::TRANSACTION-HANDLE > {B221ED9}>) > 3: ((SB-PCL::FAST-METHOD CONTROLLER-ABORT-TRANSACTION > (DB-POSTMODERN::POSTMODERN-STORE-CONTROLLER T)) ..)[:EXTERNAL] > 4: ((FLET #:CLEANUP-FUN-[EXECUTE-TRANSACTION]23))[:CLEANUP] > 5: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION > (DB-POSTMODERN::POSTMODERN-STORE-CONTROLLER T)) ..)[:EXTERNAL] > 6: ((SB-PCL::FAST-METHOD ADD (MODERATOR-ONTOLOGY:UUID-MIXIN)) > #<unavailable argument> #<unavailable argument> > #<MODERATOR-ONTOLOGY:MEETING {ACB0121}>) > 7: ((FLET SB-THREAD::WITH-MUTEX-THUNK)) > > > Condition CONTROLLER-LOST-ERROR was signalled. > [Condition of type CONTROLLER-LOST-ERROR] > > Restarts: > 0: [CONTINUE] Open a new instance and continue? > 1: [TERMINATE-THREAD] Terminate this thread (#<THREAD > "artificial-thread" RUNNING {B7F38D9}>) > > Backtrace: > 0: ((SB-PCL::FAST-METHOD ELEPHANT::GET-CON (PERSISTENT)) #<error > printing object>) > 1: (ELEPHANT::INITIALIZE-PERSISTENT-SLOTS #<unavailable argument> > #<unavailable argument> #<unavailable argument> #<unavailable > argument> #<unavailabl$ 2: ((SB-PCL::FAST-METHOD SHARED-INITIALIZE > :AROUND (PERSISTENT-OBJECT T)) #<unavailable argument> #<unavailable > argument> #<unavailable argument> #<un$ 3: ((LAMBDA (SB-PCL::.PV. > SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-INT:&MORE > SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) #<error print$ > 4: ((SB-PCL::FAST-METHOD MAKE-INSTANCE (CLASS)) #<unavailable > argument> #<unavailable argument> #<PERSISTENT-METACLASS > DB-POSTMODERN::PM-INDEXED-BTREE$ 5: ((FLET DB-POSTMODERN::INIT-ROOT)) > 6: ((SB-PCL::FAST-METHOD ELEPHANT::OPEN-CONTROLLER > (DB-POSTMODERN::POSTMODERN-STORE-CONTROLLER)) ..)[:EXTERNAL] > 7: ((SB-PCL::FAST-METHOD ELEPHANT::OPEN-CONTROLLER :AROUND > (DB-POSTMODERN::POSTMODERN-STORE-CONTROLLER)) ..)[:EXTERNAL] > 8: (OPEN-STORE (:POSTMODERN (:POSTGRESQL "localhost" #1="griffie" > #1# #1# :PORT ...)))[:EXTERNAL] > 9: ((SB-PCL::FAST-METHOD ADD (MODERATOR-ONTOLOGY:UUID-MIXIN)) > #<unavailable argument> #<unavailable argument> > #<MODERATOR-ONTOLOGY:MEETING {B7E6EB1}>) > > _______________________________________________ > elephant-devel site list > elephant-devel@common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel _______________________________________________ elephant-devel site list elephant-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/elephant-devel