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