[elephant-devel] Dropping DB connection during writes
Ian Eslick
eslick at media.mit.edu
Thu Nov 20 23:38:15 UTC 2008
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 , at body)
> (with-open-store (citycouncil-config:*citycouncil-store-spec*)
> ;; removing with-transaction doesn't have much effect
> (with-transaction ()
> , at 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 at common-lisp.net
> http://common-lisp.net/mailman/listinfo/elephant-devel
More information about the elephant-devel
mailing list