[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