[elephant-devel] Postmodern backend; are values ever removed from the blob table

Robert Synnott rsynnott at gmail.com
Thu Dec 11 04:12:13 UTC 2008


2008/12/10 Ian Eslick <eslick at media.mit.edu>:
> Have you updated from elephant-unstable recently?  I found a bug where
> indices were not properly updated that I think was in the core
> elephant code.  However there may be a bug specific to postmodern.
>
> Ian
>

Nope, this isn't the problem, or at least I haven't seen this happening.

My problem is that blobs never seem to get deleted. The postmodern
backend appears to store all slot values (and btree values, etc) in a
great big table called blob. So, if I do something like, say,
(defpclass myclass ()
 ((slot1 :accessor slot1 :initarg :slot1)))

(defvar *lots-of-objects* (with-transaction ()
                                      (loop for i from 1 to 10000
                                              collect (make-instance
'myclass :slot1 i))))

(loop for i in *lots-of-objects*
  do
   (drop-pobject i))

then the slot definitions in the slot table are removed, but the
actual slot _values_, which live in the blob table, are retained. Is
this intended behaviour? It has become a problem for me, as I'm left
with a huge blob table full mostly of things which have been deleted
or replaced; (setf (slot1 myobject) 4) has the same effect where slot1
in myobject already has a value.

I realise I could migrate to free up space, but I'd really like to
avoid the downtime if at all possible. One thing that did occur to me
was that I could record the current maximum bid in the blob table,
then go through each tree table, including root, and also the slots
table, recording blob id references in each one. Then take the entire
set of bids from the blob table; anything present in the blob table
but not referred to in any of the trees or slots table, and with bid
less than or equal to the maximum bid when the procedure was started,
should be obsolete, and deleting it should be safe. Does this sound
reasonable, or am I missing something? I already tried it on a
non-production database, and it seemed to work; I couldn't find any
problems afterwards, but I'd like to be sure I'm not doing anything
silly.

Thanks
Rob




More information about the elephant-devel mailing list