BDB
view release on metacpan or search on metacpan
somewhat random order. That means that it is easy to run a "db_get"
request on the same database as a concurrent "db_close" request, leading
to a crash, silent data corruption, eventually the next world war on
terrorism.
If you only ever use foreground requests (without a callback), this will
not be an issue (unless you use threads).
Unexpected Freezes or Deadlocks
Remember that, by default, BDB will execute requests in parallel, which
easily leads to deadlocks (even concurrent put's on the same database
can deadlock).
You either need to run deadlock detection (and handle the resulting
errors), or make sure only one process ever updates the database, ine
one thread, e.g. by using only foreground requests (without a callback).
FORK BEHAVIOUR
This module should do "the right thing" when the process using it forks:
Before the fork, BDB enters a quiescent state where no requests can be
added in other threads and no results will be processed. After the fork
the parent simply leaves the quiescent state and continues
request/result processing, while the child frees the request/result
queue (so that the requests started before the fork will only be handled
in the parent). Threads will be started on demand until the limit set in
the parent process has been reached again.
In short: the parent will, after a short pause, continue as if fork had
not been called, while the child will act as if BDB has not been used
yet.
Win32 note: there is no fork on win32, and perls emulation of it is too
broken to be supported, so do not use BDB in a windows pseudo-fork,
better yet, switch to a more capable platform.
MEMORY USAGE
Per-request usage:
Each aio request uses - depending on your architecture - around 100-200
bytes of memory. In addition, stat requests need a stat buffer (possibly
a few hundred bytes), readdir requires a result buffer and so on. Perl
scalars and other data passed into aio requests will also be locked and
will consume memory till the request has entered the done state.
This is not awfully much, so queuing lots of requests is not usually a
problem.
Per-thread usage:
In the execution phase, some aio requests require more memory for
temporary buffers, and each thread requires a stack and other data
structures (usually around 16k-128k, depending on the OS).
WIN32 FILENAMES/DATABASE NAME MESS
Perl on Win32 supports only ASCII filenames (the reason is that it
abuses an internal flag to store wether a filename is Unicode or ANSI,
but that flag is used for somethign else in the perl core, so there is
no way to detect wether a filename is ANSI or Unicode-encoded). The BDB
module tries to work around this issue by assuming that the filename is
an ANSI filename and BDB was built for unicode support.
KNOWN BUGS
Known bugs will be fixed in the next release, except:
If you use a transaction in any request, and the request returns
with an operating system error or DB_LOCK_NOTGRANTED, the internal
TXN_DEADLOCK flag will be set on the transaction. See C<db_txn_finish>,
above.
SEE ALSO
AnyEvent::BDB (event loop integration), Coro::BDB (more natural syntax),
IO::AIO (nice to have).
AUTHOR
Marc Lehmann <schmorp@schmorp.de>
http://home.schmorp.de/
( run in 1.588 second using v1.01-cache-2.11-cpan-39bf76dae61 )