> For example, in BDB, the primitive is the page.  BTree nodes are layed
> out in one or more pages, each page has some binary metadata
> explaining it's type and organization (free list, etc).  A short key
> value is written directly into the page, a long one is written into an
> overflow page, etc.

InnoDB also uses this approach.


> - new keys and values of differing or less length are written in
> place, otherwise new
>    space is allocated at the end of the file.

Okay, but maybe let the user reserve extent space.


> - transactions simply keep track of the primitive operations on the
> database and the associated data in a memory queue and write those ops
> to disk as part of the txn commit process.  The pages and key/value
> pairs that will be touched in that operation are also stored in that
> txn log.
> - when a transaction commits, it replays the log to write everything
> to disk appropriately.  The list of touched data is then passed up the
> commit chain to invalidate any pending transactions that have a
> conflict.  Everything is speculative in this case, but we don't have
> to deal with locking.

I like this approach.


> A big decision is:
> - Use cffi/uffi and do much of the serialization & btree
> implementation in C/static memory

IME this FFI stuff can be quite hard to debug.


> I lean towards using cffi to manipulate static data, just because it's
> going to be easier to get performance via that method and it's also
> going to be much easier to do a multi-process implementation (by
> operating on static memory and primitive locks in a shared memory
> region).

I cannot estimate the performance trade-offs involved here,
but in general I'm in favor of a Lisp-based approach...


>    - the binary pages could be stored in static data

I don't think I understand this. What does "static" mean here
(and above)?


> and the primitives btree ops
>      could directly manipulate data within the page?  We pass a C
> function that
>      directly sorts binary sequences rather than having to deserialize
> to sort.  We'd
>      need to write that in lisp to operate on static data or on lisp
> arrays.  Deserializing
>      on each key comparison is too expensive.

Yes.


> A nice auxiliary hack would be:
> - rewrite memutils to entirely use uffi/cffi to manipulate static data
> rather
>    than calling out to C to do it.  Maintains efficiency but removes
> the compilation
>    build step except for users of BDB

I have looked at memutils/the serializer, but it's very hard for me
to replace it by something else, because I'm not sure what would be
required of a replacement.

The partial conclusion to which I came was that memutils just models
a bivalent stream so the backend can communicate with the serializer.

The data format is hard to figure out for me, however, because of
all the UFFI stuff involved...

  Leslie

_______________________________________________
elephant-devel site list
elephant-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/elephant-devel

Reply via email to