ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/BDB/README
Revision: 1.3
Committed: Tue Dec 4 10:14:34 2007 UTC (16 years, 5 months ago) by root
Branch: MAIN
CVS Tags: rel-1_2
Changes since 1.2: +558 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.3 NAME
2     BDB - Asynchronous Berkeley DB access
3    
4     SYNOPSIS
5     use BDB;
6    
7     DESCRIPTION
8     See the BerkeleyDB documentation
9     (<http://www.oracle.com/technology/documentation/berkeley-db/db/index.ht
10     ml>). The BDB API is very similar to the C API (the translation has been
11     very faithful).
12    
13     See also the example sections in the document below and possibly the eg/
14     subdirectory of the BDB distribution. Last not least see the IO::AIO
15     documentation, as that module uses almost the same asynchronous request
16     model as this module.
17    
18     I know this is woefully inadequate documentation. Send a patch!
19    
20     REQUEST ANATOMY AND LIFETIME
21     Every request method creates a request. which is a C data structure not
22     directly visible to Perl.
23    
24     During their existance, bdb requests travel through the following
25     states, in order:
26    
27     ready
28     Immediately after a request is created it is put into the ready
29     state, waiting for a thread to execute it.
30    
31     execute
32     A thread has accepted the request for processing and is currently
33     executing it (e.g. blocking in read).
34    
35     pending
36     The request has been executed and is waiting for result processing.
37    
38     While request submission and execution is fully asynchronous, result
39     processing is not and relies on the perl interpreter calling
40     "poll_cb" (or another function with the same effect).
41    
42     result
43     The request results are processed synchronously by "poll_cb".
44    
45     The "poll_cb" function will process all outstanding aio requests by
46     calling their callbacks, freeing memory associated with them and
47     managing any groups they are contained in.
48    
49     done
50     Request has reached the end of its lifetime and holds no resources
51     anymore (except possibly for the Perl object, but its connection to
52     the actual aio request is severed and calling its methods will
53     either do nothing or result in a runtime error).
54    
55     BERKELEYDB FUNCTIONS
56     All of these are functions. The create functions simply return a new
57     object and never block. All the remaining functions all take an optional
58     callback as last argument. If it is missing, then the fucntion will be
59     executed synchronously.
60    
61     BDB functions that cannot block (mostly functions that manipulate
62     settings) are method calls on the relevant objects, so the rule of thumb
63     is: if its a method, its not blocking, if its a function, it takes a
64     callback as last argument.
65    
66     In the following, $int signifies an integer return value, "octetstring"
67     is a "binary string" (i.e. a perl string with no character indices
68     >255), "U32" is an unsigned 32 bit integer, "int" is some integer, "NV"
69     is a floating point value.
70    
71     The "SV *" types are generic perl scalars (for input and output of data
72     values), and the "SV *callback" is the optional callback function to
73     call when the request is completed.
74    
75     The various "DB_ENV" etc. arguments are handles return by
76     "db_env_create", "db_create", "txn_begin" and so on. If they have an
77     appended "_ornull" this means they are optional and you can pass "undef"
78     for them, resulting a NULL pointer on the C level.
79    
80     BDB functions
81     Functions in the BDB namespace, exported by default:
82    
83     $env = db_env_create (U32 env_flags = 0)
84     flags: RPCCLIENT
85    
86     db_env_open (DB_ENV *env, octetstring db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef)
87     open_flags: INIT_CDB INIT_LOCK INIT_LOG INIT_MPOOL INIT_REP INIT_TXN RECOVER RECOVER_FATAL USE_ENVIRON USE_ENVIRON_ROOT CREATE LOCKDOWN PRIVATE REGISTER SYSTEM_MEM
88     db_env_close (DB_ENV *env, U32 flags = 0, SV *callback = &PL_sv_undef)
89     db_env_txn_checkpoint (DB_ENV *env, U32 kbyte = 0, U32 min = 0, U32 flags = 0, SV *callback = &PL_sv_undef)
90     flags: FORCE
91     db_env_lock_detect (DB_ENV *env, U32 flags = 0, U32 atype = DB_LOCK_DEFAULT, SV *dummy = 0, SV *callback = &PL_sv_undef)
92     atype: LOCK_DEFAULT LOCK_EXPIRE LOCK_MAXLOCKS LOCK_MAXWRITE LOCK_MINLOCKS LOCK_MINWRITE LOCK_OLDEST LOCK_RANDOM LOCK_YOUNGEST
93     db_env_memp_sync (DB_ENV *env, SV *dummy = 0, SV *callback = &PL_sv_undef)
94     db_env_memp_trickle (DB_ENV *env, int percent, SV *dummy = 0, SV *callback = &PL_sv_undef)
95    
96     $db = db_create (DB_ENV *env = 0, U32 flags = 0)
97     flags: XA_CREATE
98    
99     db_open (DB *db, DB_TXN_ornull *txnid, octetstring file, octetstring database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef)
100     flags: AUTO_COMMIT CREATE EXCL MULTIVERSION NOMMAP RDONLY READ_UNCOMMITTED THREAD TRUNCATE
101     db_close (DB *db, U32 flags = 0, SV *callback = &PL_sv_undef)
102     flags: DB_NOSYNC
103     db_compact (DB *db, DB_TXN_ornull *txn = 0, SV *start = 0, SV *stop = 0, SV *unused1 = 0, U32 flags = DB_FREE_SPACE, SV *unused2 = 0, SV *callback = &PL_sv_undef)
104     flags: FREELIST_ONLY FREE_SPACE
105     db_sync (DB *db, U32 flags = 0, SV *callback = &PL_sv_undef)
106     db_key_range (DB *db, DB_TXN_ornull *txn, SV *key, SV *key_range, U32 flags = 0, SV *callback = &PL_sv_undef)
107     db_put (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
108     flags: APPEND NODUPDATA NOOVERWRITE
109     db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
110     flags: CONSUME CONSUME_WAIT GET_BOTH SET_RECNO MULTIPLE READ_COMMITTED READ_UNCOMMITTED RMW
111     db_pget (DB *db, DB_TXN_ornull *txn, SV *key, SV *pkey, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
112     flags: CONSUME CONSUME_WAIT GET_BOTH SET_RECNO MULTIPLE READ_COMMITTED READ_UNCOMMITTED RMW
113     db_del (DB *db, DB_TXN_ornull *txn, SV *key, U32 flags = 0, SV *callback = &PL_sv_undef)
114     db_txn_commit (DB_TXN *txn, U32 flags = 0, SV *callback = &PL_sv_undef)
115     flags: TXN_NOSYNC TXN_SYNC
116     db_txn_abort (DB_TXN *txn, SV *callback = &PL_sv_undef)
117    
118     db_c_close (DBC *dbc, SV *callback = &PL_sv_undef)
119     db_c_count (DBC *dbc, SV *count, U32 flags = 0, SV *callback = &PL_sv_undef)
120     db_c_put (DBC *dbc, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
121     flags: AFTER BEFORE CURRENT KEYFIRST KEYLAST NODUPDATA
122     db_c_get (DBC *dbc, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
123     flags: CURRENT FIRST GET_BOTH GET_BOTH_RANGE GET_RECNO JOIN_ITEM LAST NEXT NEXT_DUP NEXT_NODUP PREV PREV_DUP PREV_NODUP SET SET_RANGE SET_RECNO READ_UNCOMMITTED MULTIPLE MULTIPLE_KEY RMW
124     db_c_pget (DBC *dbc, SV *key, SV *pkey, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
125     db_c_del (DBC *dbc, U32 flags = 0, SV *callback = &PL_sv_undef)
126    
127     db_sequence_open (DB_SEQUENCE *seq, DB_TXN_ornull *txnid, SV *key, U32 flags = 0, SV *callback = &PL_sv_undef)
128     flags: CREATE EXCL
129     db_sequence_close (DB_SEQUENCE *seq, U32 flags = 0, SV *callback = &PL_sv_undef)
130     db_sequence_get (DB_SEQUENCE *seq, DB_TXN_ornull *txnid, int delta, SV *seq_value, U32 flags = DB_TXN_NOSYNC, SV *callback = &PL_sv_undef)
131     flags: TXN_NOSYNC
132     db_sequence_remove (DB_SEQUENCE *seq, DB_TXN_ornull *txnid = 0, U32 flags = 0, SV *callback = &PL_sv_undef)
133     flags: TXN_NOSYNC
134    
135     db_txn_finish (DB_TXN *txn, U32 flags = 0, SV *callback = &PL_sv_undef)
136     This is not actually a Berkeley DB function but a BDB module extension.
137     The background for this exytension is: It is very annoying to have to
138     check every single BDB function for error returns and provide a codepath
139     out of your transaction. While the BDB module still makes this possible,
140     it contains the following extensions:
141    
142     When a transaction-protected function returns any operating system error
143     (errno > 0), BDB will set the "TXN_DEADLOCK" flag on the transaction.
144     This flag is also set by Berkeley DB functions themselves when an
145     operation fails with LOCK_DEADLOCK, and it causes all further operations
146     on that transaction (including "db_txn_commit") to fail.
147    
148     The "db_txn_finish" request will look at this flag, and, if it is set,
149     will automatically call "db_txn_abort" (setting errno to "LOCK_DEADLOCK"
150     if it isn't set to something else yet). If it isn't set, it will call
151     "db_txn_commit" and return the error normally.
152    
153     How to use this? Easy: just write your transaction normally:
154    
155     my $txn = $db_env->txn_begin;
156     db_get $db, $txn, "key", my $data;
157     db_put $db, $txn, "key", $data + 1 unless $! == BDB::NOTFOUND;
158     db_txn_finish $txn;
159     die "transaction failed" if $!;
160    
161     That is, handle only the expected errors. If something unexpected
162     happens (EIO, LOCK_NOTGRANTED or a deadlock in either db_get or db_put),
163     then the remaining requests (db_put in this case) will simply be skipped
164     (they will fail with LOCK_DEADLOCK) and the transaction will be aborted.
165    
166     You can use the "$txn->failed" method to check wether a transaction has
167     failed in this way and abort further processing (excluding
168     "db_txn_finish").
169    
170     DB_ENV/database environment methods
171     Methods available on DB_ENV/$env handles:
172    
173     DESTROY (DB_ENV_ornull *env)
174     CODE:
175     if (env)
176     env->close (env, 0);
177    
178     $int = $env->set_data_dir (const char *dir)
179     $int = $env->set_tmp_dir (const char *dir)
180     $int = $env->set_lg_dir (const char *dir)
181     $int = $env->set_shm_key (long shm_key)
182     $int = $env->set_cachesize (U32 gbytes, U32 bytes, int ncache = 0)
183     $int = $env->set_flags (U32 flags, int onoff)
184     $env->set_errfile (FILE *errfile = 0)
185     $env->set_msgfile (FILE *msgfile = 0)
186     $int = $env->set_verbose (U32 which, int onoff = 1)
187     $int = $env->set_encrypt (const char *password, U32 flags = 0)
188     $int = $env->set_timeout (NV timeout_seconds, U32 flags = SET_TXN_TIMEOUT)
189     $int = $env->set_mp_max_openfd (int maxopenfd);
190     $int = $env->set_mp_max_write (int maxwrite, int maxwrite_sleep);
191     $int = $env->set_mp_mmapsize (int mmapsize_mb)
192     $int = $env->set_lk_detect (U32 detect = DB_LOCK_DEFAULT)
193     $int = $env->set_lk_max_lockers (U32 max)
194     $int = $env->set_lk_max_locks (U32 max)
195     $int = $env->set_lk_max_objects (U32 max)
196     $int = $env->set_lg_bsize (U32 max)
197     $int = $env->set_lg_max (U32 max)
198    
199     $txn = $env->txn_begin (DB_TXN_ornull *parent = 0, U32 flags = 0)
200     flags: READ_COMMITTED READ_UNCOMMITTED TXN_NOSYNC TXN_NOWAIT TXN_SNAPSHOT TXN_SYNC TXN_WAIT TXN_WRITE_NOSYNC
201    
202     Example:
203     use AnyEvent;
204     use BDB;
205    
206     our $FH; open $FH, "<&=" . BDB::poll_fileno;
207     our $WATCHER = AnyEvent->io (fh => $FH, poll => 'r', cb => \&BDB::poll_cb);
208    
209     BDB::min_parallel 8;
210    
211     my $env = db_env_create;
212    
213     mkdir "bdtest", 0700;
214     db_env_open
215     $env,
216     "bdtest",
217     BDB::INIT_LOCK | BDB::INIT_LOG | BDB::INIT_MPOOL | BDB::INIT_TXN | BDB::RECOVER | BDB::USE_ENVIRON | BDB::CREATE,
218     0600;
219    
220     $env->set_flags (BDB::AUTO_COMMIT | BDB::TXN_NOSYNC, 1);
221    
222     DB/database methods
223     Methods available on DB/$db handles:
224    
225     DESTROY (DB_ornull *db)
226     CODE:
227     if (db)
228     {
229     SV *env = (SV *)db->app_private;
230     db->close (db, 0);
231     SvREFCNT_dec (env);
232     }
233    
234     $int = $db->set_cachesize (U32 gbytes, U32 bytes, int ncache = 0)
235     $int = $db->set_flags (U32 flags)
236     flags: CHKSUM ENCRYPT TXN_NOT_DURABLE
237     Btree: DUP DUPSORT RECNUM REVSPLITOFF
238     Hash: DUP DUPSORT
239     Queue: INORDER
240     Recno: RENUMBER SNAPSHOT
241    
242     $int = $db->set_encrypt (const char *password, U32 flags)
243     $int = $db->set_lorder (int lorder)
244     $int = $db->set_bt_minkey (U32 minkey)
245     $int = $db->set_re_delim (int delim)
246     $int = $db->set_re_pad (int re_pad)
247     $int = $db->set_re_source (char *source)
248     $int = $db->set_re_len (U32 re_len)
249     $int = $db->set_h_ffactor (U32 h_ffactor)
250     $int = $db->set_h_nelem (U32 h_nelem)
251     $int = $db->set_q_extentsize (U32 extentsize)
252    
253     $dbc = $db->cursor (DB_TXN_ornull *txn = 0, U32 flags = 0)
254     flags: READ_COMMITTED READ_UNCOMMITTED WRITECURSOR TXN_SNAPSHOT
255     $seq = $db->sequence (U32 flags = 0)
256    
257     Example:
258     my $db = db_create $env;
259     db_open $db, undef, "table", undef, BDB::BTREE, BDB::AUTO_COMMIT | BDB::CREATE | BDB::READ_UNCOMMITTED, 0600;
260    
261     for (1..1000) {
262     db_put $db, undef, "key $_", "data $_";
263    
264     db_key_range $db, undef, "key $_", my $keyrange;
265     my ($lt, $eq, $gt) = @$keyrange;
266     }
267    
268     db_del $db, undef, "key $_" for 1..1000;
269    
270     db_sync $db;
271    
272     DB_TXN/transaction methods
273     Methods available on DB_TXN/$txn handles:
274    
275     DESTROY (DB_TXN_ornull *txn)
276     CODE:
277     if (txn)
278     txn->abort (txn);
279    
280     $int = $txn->set_timeout (NV timeout_seconds, U32 flags = SET_TXN_TIMEOUT)
281     flags: SET_LOCK_TIMEOUT SET_TXN_TIMEOUT
282    
283     $bool = $txn->failed
284     # see db_txn_finish documentation, above
285    
286     DBC/cursor methods
287     Methods available on DBC/$dbc handles:
288    
289     DESTROY (DBC_ornull *dbc)
290     CODE:
291     if (dbc)
292     dbc->c_close (dbc);
293    
294     Example:
295     my $c = $db->cursor;
296    
297     for (;;) {
298     db_c_get $c, my $key, my $data, BDB::NEXT;
299     warn "<$!,$key,$data>";
300     last if $!;
301     }
302    
303     db_c_close $c;
304    
305     DB_SEQUENCE/sequence methods
306     Methods available on DB_SEQUENCE/$seq handles:
307    
308     DESTROY (DB_SEQUENCE_ornull *seq)
309     CODE:
310     if (seq)
311     seq->close (seq, 0);
312    
313     $int = $seq->initial_value (db_seq_t value)
314     $int = $seq->set_cachesize (U32 size)
315     $int = $seq->set_flags (U32 flags)
316     flags: SEQ_DEC SEQ_INC SEQ_WRAP
317     $int = $seq->set_range (db_seq_t min, db_seq_t max)
318    
319     Example:
320     my $seq = $db->sequence;
321    
322     db_sequence_open $seq, undef, "seq", BDB::CREATE;
323     db_sequence_get $seq, undef, 1, my $value;
324    
325     SUPPORT FUNCTIONS
326     EVENT PROCESSING AND EVENT LOOP INTEGRATION
327     $fileno = BDB::poll_fileno
328     Return the *request result pipe file descriptor*. This filehandle
329     must be polled for reading by some mechanism outside this module
330     (e.g. Event or select, see below or the SYNOPSIS). If the pipe
331     becomes readable you have to call "poll_cb" to check the results.
332    
333     See "poll_cb" for an example.
334    
335     BDB::poll_cb
336     Process some outstanding events on the result pipe. You have to call
337     this regularly. Returns the number of events processed. Returns
338     immediately when no events are outstanding. The amount of events
339     processed depends on the settings of "BDB::max_poll_req" and
340     "BDB::max_poll_time".
341    
342     If not all requests were processed for whatever reason, the
343     filehandle will still be ready when "poll_cb" returns.
344    
345     Example: Install an Event watcher that automatically calls
346     BDB::poll_cb with high priority:
347    
348     Event->io (fd => BDB::poll_fileno,
349     poll => 'r', async => 1,
350     cb => \&BDB::poll_cb);
351    
352     BDB::max_poll_reqs $nreqs
353     BDB::max_poll_time $seconds
354     These set the maximum number of requests (default 0, meaning
355     infinity) that are being processed by "BDB::poll_cb" in one call,
356     respectively the maximum amount of time (default 0, meaning
357     infinity) spent in "BDB::poll_cb" to process requests (more
358     correctly the mininum amount of time "poll_cb" is allowed to use).
359    
360     Setting "max_poll_time" to a non-zero value creates an overhead of
361     one syscall per request processed, which is not normally a problem
362     unless your callbacks are really really fast or your OS is really
363     really slow (I am not mentioning Solaris here). Using
364     "max_poll_reqs" incurs no overhead.
365    
366     Setting these is useful if you want to ensure some level of
367     interactiveness when perl is not fast enough to process all requests
368     in time.
369    
370     For interactive programs, values such as 0.01 to 0.1 should be fine.
371    
372     Example: Install an Event watcher that automatically calls
373     BDB::poll_cb with low priority, to ensure that other parts of the
374     program get the CPU sometimes even under high AIO load.
375    
376     # try not to spend much more than 0.1s in poll_cb
377     BDB::max_poll_time 0.1;
378    
379     # use a low priority so other tasks have priority
380     Event->io (fd => BDB::poll_fileno,
381     poll => 'r', nice => 1,
382     cb => &BDB::poll_cb);
383    
384     BDB::poll_wait
385     If there are any outstanding requests and none of them in the result
386     phase, wait till the result filehandle becomes ready for reading
387     (simply does a "select" on the filehandle. This is useful if you
388     want to synchronously wait for some requests to finish).
389    
390     See "nreqs" for an example.
391    
392     BDB::poll
393     Waits until some requests have been handled.
394    
395     Returns the number of requests processed, but is otherwise strictly
396     equivalent to:
397    
398     BDB::poll_wait, BDB::poll_cb
399    
400     BDB::flush
401     Wait till all outstanding AIO requests have been handled.
402    
403     Strictly equivalent to:
404    
405     BDB::poll_wait, BDB::poll_cb
406     while BDB::nreqs;
407    
408     CONTROLLING THE NUMBER OF THREADS
409     BDB::min_parallel $nthreads
410     Set the minimum number of AIO threads to $nthreads. The current
411     default is 8, which means eight asynchronous operations can execute
412     concurrently at any one time (the number of outstanding requests,
413     however, is unlimited).
414    
415     BDB starts threads only on demand, when an AIO request is queued and
416     no free thread exists. Please note that queueing up a hundred
417     requests can create demand for a hundred threads, even if it turns
418     out that everything is in the cache and could have been processed
419     faster by a single thread.
420    
421     It is recommended to keep the number of threads relatively low, as
422     some Linux kernel versions will scale negatively with the number of
423     threads (higher parallelity => MUCH higher latency). With current
424     Linux 2.6 versions, 4-32 threads should be fine.
425    
426     Under most circumstances you don't need to call this function, as
427     the module selects a default that is suitable for low to moderate
428     load.
429    
430     BDB::max_parallel $nthreads
431     Sets the maximum number of AIO threads to $nthreads. If more than
432     the specified number of threads are currently running, this function
433     kills them. This function blocks until the limit is reached.
434    
435     While $nthreads are zero, aio requests get queued but not executed
436     until the number of threads has been increased again.
437    
438     This module automatically runs "max_parallel 0" at program end, to
439     ensure that all threads are killed and that there are no outstanding
440     requests.
441    
442     Under normal circumstances you don't need to call this function.
443    
444     BDB::max_idle $nthreads
445     Limit the number of threads (default: 4) that are allowed to idle
446     (i.e., threads that did not get a request to process within 10
447     seconds). That means if a thread becomes idle while $nthreads other
448     threads are also idle, it will free its resources and exit.
449    
450     This is useful when you allow a large number of threads (e.g. 100 or
451     1000) to allow for extremely high load situations, but want to free
452     resources under normal circumstances (1000 threads can easily
453     consume 30MB of RAM).
454    
455     The default is probably ok in most situations, especially if thread
456     creation is fast. If thread creation is very slow on your system you
457     might want to use larger values.
458    
459     $oldmaxreqs = BDB::max_outstanding $maxreqs
460     This is a very bad function to use in interactive programs because
461     it blocks, and a bad way to reduce concurrency because it is
462     inexact: Better use an "aio_group" together with a feed callback.
463    
464     Sets the maximum number of outstanding requests to $nreqs. If you to
465     queue up more than this number of requests, the next call to the
466     "poll_cb" (and "poll_some" and other functions calling "poll_cb")
467     function will block until the limit is no longer exceeded.
468    
469     The default value is very large, so there is no practical limit on
470     the number of outstanding requests.
471    
472     You can still queue as many requests as you want. Therefore,
473     "max_oustsanding" is mainly useful in simple scripts (with low
474     values) or as a stop gap to shield against fatal memory overflow
475     (with large values).
476    
477     BDB::set_sync_prepare $cb
478     Sets a callback that is called whenever a request is created without
479     an explicit callback. It has to return two code references. The
480     first is used as the request callback, and the second is called to
481     wait until the first callback has been called. The default
482     implementation works like this:
483    
484     sub {
485     my $status;
486     (
487     sub { $status = $! },
488     sub { BDB::poll while !defined $status; $! = $status },
489     )
490     }
491    
492     STATISTICAL INFORMATION
493     BDB::nreqs
494     Returns the number of requests currently in the ready, execute or
495     pending states (i.e. for which their callback has not been invoked
496     yet).
497    
498     Example: wait till there are no outstanding requests anymore:
499    
500     BDB::poll_wait, BDB::poll_cb
501     while BDB::nreqs;
502    
503     BDB::nready
504     Returns the number of requests currently in the ready state (not yet
505     executed).
506    
507     BDB::npending
508     Returns the number of requests currently in the pending state
509     (executed, but not yet processed by poll_cb).
510    
511     FORK BEHAVIOUR
512     This module should do "the right thing" when the process using it forks:
513    
514     Before the fork, IO::AIO enters a quiescent state where no requests can
515     be added in other threads and no results will be processed. After the
516     fork the parent simply leaves the quiescent state and continues
517     request/result processing, while the child frees the request/result
518     queue (so that the requests started before the fork will only be handled
519     in the parent). Threads will be started on demand until the limit set in
520     the parent process has been reached again.
521    
522     In short: the parent will, after a short pause, continue as if fork had
523     not been called, while the child will act as if IO::AIO has not been
524     used yet.
525    
526     MEMORY USAGE
527     Per-request usage:
528    
529     Each aio request uses - depending on your architecture - around 100-200
530     bytes of memory. In addition, stat requests need a stat buffer (possibly
531     a few hundred bytes), readdir requires a result buffer and so on. Perl
532     scalars and other data passed into aio requests will also be locked and
533     will consume memory till the request has entered the done state.
534    
535     This is not awfully much, so queuing lots of requests is not usually a
536     problem.
537    
538     Per-thread usage:
539    
540     In the execution phase, some aio requests require more memory for
541     temporary buffers, and each thread requires a stack and other data
542     structures (usually around 16k-128k, depending on the OS).
543    
544     KNOWN BUGS
545     Known bugs will be fixed in the next release, except:
546    
547     If you use a transaction in any request, and the request returns
548     with an operating system error or DB_LOCK_NOTGRANTED, the internal
549     TXN_DEADLOCK flag will be set on the transaction. See C<db_txn_finish>,
550     above.
551    
552     SEE ALSO
553     Coro::AIO.
554    
555     AUTHOR
556     Marc Lehmann <schmorp@schmorp.de>
557     http://home.schmorp.de/
558