ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/BDB/BDB.pm
(Generate patch)

Comparing BDB/BDB.pm (file contents):
Revision 1.48 by root, Tue Jul 29 03:33:16 2008 UTC vs.
Revision 1.53 by root, Tue Oct 21 02:21:25 2008 UTC

111use base 'Exporter'; 111use base 'Exporter';
112 112
113our $VERSION; 113our $VERSION;
114 114
115BEGIN { 115BEGIN {
116 $VERSION = '1.71'; 116 $VERSION = '1.81';
117 117
118 our @BDB_REQ = qw( 118 our @BDB_REQ = qw(
119 db_env_open db_env_close db_env_txn_checkpoint db_env_lock_detect 119 db_env_open db_env_close db_env_txn_checkpoint db_env_lock_detect
120 db_env_memp_sync db_env_memp_trickle db_env_dbrename db_env_dbremove 120 db_env_memp_sync db_env_memp_trickle db_env_dbrename db_env_dbremove
121 db_env_log_archive
121 db_open db_close db_compact db_sync db_upgrade 122 db_open db_close db_compact db_sync db_upgrade
122 db_put db_exists db_get db_pget db_del db_key_range 123 db_put db_exists db_get db_pget db_del db_key_range
123 db_txn_commit db_txn_abort db_txn_finish 124 db_txn_commit db_txn_abort db_txn_finish
124 db_c_close db_c_count db_c_put db_c_get db_c_pget db_c_del 125 db_c_close db_c_count db_c_put db_c_get db_c_pget db_c_del
125 db_sequence_open db_sequence_close 126 db_sequence_open db_sequence_close
135 136
136 require XSLoader; 137 require XSLoader;
137 XSLoader::load ("BDB", $VERSION); 138 XSLoader::load ("BDB", $VERSION);
138} 139}
139 140
140=head2 WIN32 FILENAMES/DATABASE NAME MESS
141
142Perl on Win32 supports only ASCII filenames (the reason is that it abuses
143an internal flag to store wether a filename is Unicode or ANSI, but that
144flag is used for somethign else in the perl core, so there is no way to
145detect wether a filename is ANSI or Unicode-encoded). The BDB module
146tries to work around this issue by assuming that the filename is an ANSI
147filename and BDB was built for unicode support.
148
149=head2 BERKELEYDB FUNCTIONS 141=head1 BERKELEYDB FUNCTIONS
150 142
151All of these are functions. The create functions simply return a new 143All of these are functions. The create functions simply return a new
152object and never block. All the remaining functions take an optional 144object and never block. All the remaining functions take an optional
153callback as last argument. If it is missing, then the function will be 145callback as last argument. If it is missing, then the function will be
154executed synchronously. In both cases, C<$!> will reflect the return value 146executed synchronously. In both cases, C<$!> will reflect the return value
193 185
194 db_env_txn_checkpoint $db_env, 0, 0, 0, undef; 186 db_env_txn_checkpoint $db_env, 0, 0, 0, undef;
195 db_env_txn_checkpoint $db_env, 0, 0, 0; 187 db_env_txn_checkpoint $db_env, 0, 0, 0;
196 db_env_txn_checkpoint $db_env, 0; 188 db_env_txn_checkpoint $db_env, 0;
197 189
198=head3 BDB functions 190=head2 BDB functions
199 191
200Functions in the BDB namespace, exported by default: 192Functions in the BDB namespace, exported by default:
201 193
202 $env = db_env_create (U32 env_flags = 0) 194 $env = db_env_create (U32 env_flags = 0)
203 flags: RPCCLIENT 195 flags: RPCCLIENT
211 atype: LOCK_DEFAULT LOCK_EXPIRE LOCK_MAXLOCKS LOCK_MAXWRITE LOCK_MINLOCKS LOCK_MINWRITE LOCK_OLDEST LOCK_RANDOM LOCK_YOUNGEST 203 atype: LOCK_DEFAULT LOCK_EXPIRE LOCK_MAXLOCKS LOCK_MAXWRITE LOCK_MINLOCKS LOCK_MINWRITE LOCK_OLDEST LOCK_RANDOM LOCK_YOUNGEST
212 db_env_memp_sync (DB_ENV *env, SV *dummy = 0, SV *callback = &PL_sv_undef) 204 db_env_memp_sync (DB_ENV *env, SV *dummy = 0, SV *callback = &PL_sv_undef)
213 db_env_memp_trickle (DB_ENV *env, int percent, SV *dummy = 0, SV *callback = &PL_sv_undef) 205 db_env_memp_trickle (DB_ENV *env, int percent, SV *dummy = 0, SV *callback = &PL_sv_undef)
214 db_env_dbremove (DB_ENV *env, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, U32 flags = 0, SV *callback = &PL_sv_undef) 206 db_env_dbremove (DB_ENV *env, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, U32 flags = 0, SV *callback = &PL_sv_undef)
215 db_env_dbrename (DB_ENV *env, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, bdb_filename newname, U32 flags = 0, SV *callback = &PL_sv_undef) 207 db_env_dbrename (DB_ENV *env, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, bdb_filename newname, U32 flags = 0, SV *callback = &PL_sv_undef)
208 db_env_log_archive (DB_ENV *env, SV *listp, U32 flags = 0, SV *callback = &PL_sv_undef)
216 209
217 $db = db_create (DB_ENV *env = 0, U32 flags = 0) 210 $db = db_create (DB_ENV *env = 0, U32 flags = 0)
218 flags: XA_CREATE 211 flags: XA_CREATE
219 212
220 db_open (DB *db, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef) 213 db_open (DB *db, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef)
253 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) 246 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)
254 flags: TXN_NOSYNC 247 flags: TXN_NOSYNC
255 db_sequence_remove (DB_SEQUENCE *seq, DB_TXN_ornull *txnid = 0, U32 flags = 0, SV *callback = &PL_sv_undef) 248 db_sequence_remove (DB_SEQUENCE *seq, DB_TXN_ornull *txnid = 0, U32 flags = 0, SV *callback = &PL_sv_undef)
256 flags: TXN_NOSYNC 249 flags: TXN_NOSYNC
257 250
258=head4 db_txn_finish (DB_TXN *txn, U32 flags = 0, SV *callback = &PL_sv_undef) 251=head3 db_txn_finish (DB_TXN *txn, U32 flags = 0, SV *callback = &PL_sv_undef)
259 252
260This is not actually a Berkeley DB function but a BDB module 253This is not actually a Berkeley DB function but a BDB module
261extension. The background for this exytension is: It is very annoying to 254extension. The background for this exytension is: It is very annoying to
262have to check every single BDB function for error returns and provide a 255have to check every single BDB function for error returns and provide a
263codepath out of your transaction. While the BDB module still makes this 256codepath out of your transaction. While the BDB module still makes this
289 282
290You can use the C<< $txn->failed >> method to check wether a transaction 283You can use the C<< $txn->failed >> method to check wether a transaction
291has failed in this way and abort further processing (excluding 284has failed in this way and abort further processing (excluding
292C<db_txn_finish>). 285C<db_txn_finish>).
293 286
294=head3 DB_ENV/database environment methods 287=head2 DB_ENV/database environment methods
295 288
296Methods available on DB_ENV/$env handles: 289Methods available on DB_ENV/$env handles:
297 290
298 DESTROY (DB_ENV_ornull *env) 291 DESTROY (DB_ENV_ornull *env)
299 CODE: 292 CODE:
329 322
330 $txn = $env->txn_begin (DB_TXN_ornull *parent = 0, U32 flags = 0) 323 $txn = $env->txn_begin (DB_TXN_ornull *parent = 0, U32 flags = 0)
331 flags: READ_COMMITTED READ_UNCOMMITTED TXN_NOSYNC TXN_NOWAIT TXN_SNAPSHOT TXN_SYNC TXN_WAIT TXN_WRITE_NOSYNC 324 flags: READ_COMMITTED READ_UNCOMMITTED TXN_NOSYNC TXN_NOWAIT TXN_SNAPSHOT TXN_SYNC TXN_WAIT TXN_WRITE_NOSYNC
332 $txn = $env->cdsgroup_begin; (v4.5) 325 $txn = $env->cdsgroup_begin; (v4.5)
333 326
334=head4 Example: 327=head3 Example:
335 328
336 use AnyEvent; 329 use AnyEvent;
337 use BDB; 330 use BDB;
338 331
339 our $FH; open $FH, "<&=" . BDB::poll_fileno; 332 our $FH; open $FH, "<&=" . BDB::poll_fileno;
351 0600; 344 0600;
352 345
353 $env->set_flags (BDB::AUTO_COMMIT | BDB::TXN_NOSYNC, 1); 346 $env->set_flags (BDB::AUTO_COMMIT | BDB::TXN_NOSYNC, 1);
354 347
355 348
356=head3 DB/database methods 349=head2 DB/database methods
357 350
358Methods available on DB/$db handles: 351Methods available on DB/$db handles:
359 352
360 DESTROY (DB_ornull *db) 353 DESTROY (DB_ornull *db)
361 CODE: 354 CODE:
387 380
388 $dbc = $db->cursor (DB_TXN_ornull *txn = 0, U32 flags = 0) 381 $dbc = $db->cursor (DB_TXN_ornull *txn = 0, U32 flags = 0)
389 flags: READ_COMMITTED READ_UNCOMMITTED WRITECURSOR TXN_SNAPSHOT 382 flags: READ_COMMITTED READ_UNCOMMITTED WRITECURSOR TXN_SNAPSHOT
390 $seq = $db->sequence (U32 flags = 0) 383 $seq = $db->sequence (U32 flags = 0)
391 384
392=head4 Example: 385=head3 Example:
393 386
394 my $db = db_create $env; 387 my $db = db_create $env;
395 db_open $db, undef, "table", undef, BDB::BTREE, BDB::AUTO_COMMIT | BDB::CREATE | BDB::READ_UNCOMMITTED, 0600; 388 db_open $db, undef, "table", undef, BDB::BTREE, BDB::AUTO_COMMIT | BDB::CREATE | BDB::READ_UNCOMMITTED, 0600;
396 389
397 for (1..1000) { 390 for (1..1000) {
404 db_del $db, undef, "key $_" for 1..1000; 397 db_del $db, undef, "key $_" for 1..1000;
405 398
406 db_sync $db; 399 db_sync $db;
407 400
408 401
409=head3 DB_TXN/transaction methods 402=head2 DB_TXN/transaction methods
410 403
411Methods available on DB_TXN/$txn handles: 404Methods available on DB_TXN/$txn handles:
412 405
413 DESTROY (DB_TXN_ornull *txn) 406 DESTROY (DB_TXN_ornull *txn)
414 CODE: 407 CODE:
420 413
421 $bool = $txn->failed 414 $bool = $txn->failed
422 # see db_txn_finish documentation, above 415 # see db_txn_finish documentation, above
423 416
424 417
425=head3 DBC/cursor methods 418=head2 DBC/cursor methods
426 419
427Methods available on DBC/$dbc handles: 420Methods available on DBC/$dbc handles:
428 421
429 DESTROY (DBC_ornull *dbc) 422 DESTROY (DBC_ornull *dbc)
430 CODE: 423 CODE:
431 if (dbc) 424 if (dbc)
432 dbc->c_close (dbc); 425 dbc->c_close (dbc);
433 426
434 $int = $cursor->set_priority ($priority = PRIORITY_*) (v4.6) 427 $int = $cursor->set_priority ($priority = PRIORITY_*) (v4.6)
435 428
436=head4 Example: 429=head3 Example:
437 430
438 my $c = $db->cursor; 431 my $c = $db->cursor;
439 432
440 for (;;) { 433 for (;;) {
441 db_c_get $c, my $key, my $data, BDB::NEXT; 434 db_c_get $c, my $key, my $data, BDB::NEXT;
444 } 437 }
445 438
446 db_c_close $c; 439 db_c_close $c;
447 440
448 441
449=head3 DB_SEQUENCE/sequence methods 442=head2 DB_SEQUENCE/sequence methods
450 443
451Methods available on DB_SEQUENCE/$seq handles: 444Methods available on DB_SEQUENCE/$seq handles:
452 445
453 DESTROY (DB_SEQUENCE_ornull *seq) 446 DESTROY (DB_SEQUENCE_ornull *seq)
454 CODE: 447 CODE:
459 $int = $seq->set_cachesize (U32 size) 452 $int = $seq->set_cachesize (U32 size)
460 $int = $seq->set_flags (U32 flags) 453 $int = $seq->set_flags (U32 flags)
461 flags: SEQ_DEC SEQ_INC SEQ_WRAP 454 flags: SEQ_DEC SEQ_INC SEQ_WRAP
462 $int = $seq->set_range (db_seq_t min, db_seq_t max) 455 $int = $seq->set_range (db_seq_t min, db_seq_t max)
463 456
464=head4 Example: 457=head3 Example:
465 458
466 my $seq = $db->sequence; 459 my $seq = $db->sequence;
467 460
468 db_sequence_open $seq, undef, "seq", BDB::CREATE; 461 db_sequence_open $seq, undef, "seq", BDB::CREATE;
469 db_sequence_get $seq, undef, 1, my $value; 462 db_sequence_get $seq, undef, 1, my $value;
470 463
471 464
472=head2 SUPPORT FUNCTIONS 465=head1 SUPPORT FUNCTIONS
473 466
474=head3 EVENT PROCESSING AND EVENT LOOP INTEGRATION 467=head2 EVENT PROCESSING AND EVENT LOOP INTEGRATION
475 468
476=over 4 469=over 4
477 470
478=item $msg = BDB::strerror [$errno] 471=item $msg = BDB::strerror [$errno]
479 472
566 BDB::poll_wait, BDB::poll_cb 559 BDB::poll_wait, BDB::poll_cb
567 while BDB::nreqs; 560 while BDB::nreqs;
568 561
569=back 562=back
570 563
571=head3 VERSION CHECKING 564=head2 VERSION CHECKING
572 565
573BerkeleyDB comes in various versions, many of them have minor 566BerkeleyDB comes in various versions, many of them have minor
574incompatibilities. This means that traditional "at least version x.x" 567incompatibilities. This means that traditional "at least version x.x"
575checks are often not sufficient. 568checks are often not sufficient.
576 569
632 625
633 VERSION_v 626 VERSION_v
634 } 627 }
635} 628}
636 629
637=head3 CONTROLLING THE NUMBER OF THREADS 630=head2 CONTROLLING THE NUMBER OF THREADS
638 631
639=over 4 632=over 4
640 633
641=item BDB::min_parallel $nthreads 634=item BDB::min_parallel $nthreads
642 635
703 696
704You can still queue as many requests as you want. Therefore, 697You can still queue as many requests as you want. Therefore,
705C<max_oustsanding> is mainly useful in simple scripts (with low values) or 698C<max_oustsanding> is mainly useful in simple scripts (with low values) or
706as a stop gap to shield against fatal memory overflow (with large values). 699as a stop gap to shield against fatal memory overflow (with large values).
707 700
708=item BDB::set_sync_prepare $cb 701=item $old_cb = BDB::set_sync_prepare $cb
709 702
710Sets a callback that is called whenever a request is created without an 703Sets a callback that is called whenever a request is created without an
711explicit callback. It has to return two code references. The first is used 704explicit callback. It has to return two code references. The first is used
712as the request callback (it should save the return status), and the second 705as the request callback (it should save the return status), and the second
713is called to wait until the first callback has been called (it must set 706is called to wait until the first callback has been called (it must set
714C<$!> to the return status). 707C<$!> to the return status).
715 708
716This mechanism can be used to include BDB into other event mechanisms, 709This mechanism can be used to include BDB into other event mechanisms,
717such as L<AnyEvent::BDB> or L<Coro::BDB>. 710such as L<Coro::BDB>.
718 711
719The default implementation works like this: 712To allow other, callback-based, events to be executed while callback-less
713ones are run, you could use this sync prepare function:
720 714
721 sub { 715 sub {
722 my $status; 716 my $status;
723 ( 717 (
724 sub { $status = $! }, 718 sub { $status = $! },
725 sub { BDB::poll while !defined $status; $! = $status }, 719 sub { BDB::poll while !defined $status; $! = $status },
726 ) 720 )
727 } 721 }
728 722
729It simply blocks the process till the request has finished and then sets 723It works by polling for results till the request has finished and then
730C<$!> to the return value. This means that if you don't use a callback, 724sets C<$!> to the return value. This means that if you don't use a
731BDB will simply fall back to synchronous operations. 725callback, BDB would simply fall back to synchronous operations.
726
727By default, or if the sync prepare function is set to C<undef>, is to
728execute callback-less BDB requests in the foreground thread, setting C<$!>
729to the return value, without polling for other events.
732 730
733=back 731=back
734 732
735=head3 STATISTICAL INFORMATION 733=head2 STATISTICAL INFORMATION
736 734
737=over 4 735=over 4
738 736
739=item BDB::nreqs 737=item BDB::nreqs
740 738
758 756
759=back 757=back
760 758
761=cut 759=cut
762 760
763set_sync_prepare { 761set_sync_prepare (undef);
764 my $status;
765 (
766 sub {
767 $status = $!;
768 },
769 sub {
770 BDB::poll while !defined $status;
771 $! = $status;
772 },
773 )
774};
775 762
776min_parallel 8; 763min_parallel 8;
777 764
778END { flush } 765END { flush }
779 766
7801; 7671;
781 768
769=head1 COMMON PITFALLS
770
771=head2 Unexpected Crashes
772
773Remember that, by default, BDB will execute requests in parallel, in
774somewhat random order. That means that it is easy to run a C<db_get>
775request on thesa me database as a concurrent C<db_close> request, leading
776to a crash, silent data corruption, eventually the next world war on
777terrorism.
778
779If you only ever use foreground requests (without a callback), this will
780not be an issue.
781
782=head2 Unexpected Freezes or Deadlocks
783
784Remember that, by default, BDB will execute requests in parallel, which
785easily leads to deadlocks (even concurrent put's on the same database can
786deadlock).
787
788You either need to run deadlock detection (and handle the resulting
789errors), or make sure only one process ever updates the database, ine one
790thread, e.g. by using only foreground requests (without a callback).
791
782=head2 FORK BEHAVIOUR 792=head1 FORK BEHAVIOUR
783 793
784This module should do "the right thing" when the process using it forks: 794This module should do "the right thing" when the process using it forks:
785 795
786Before the fork, BDB enters a quiescent state where no requests 796Before the fork, BDB enters a quiescent state where no requests
787can be added in other threads and no results will be processed. After 797can be added in other threads and no results will be processed. After
797 807
798Win32 note: there is no fork on win32, and perls emulation of it is too 808Win32 note: there is no fork on win32, and perls emulation of it is too
799broken to be supported, so do not use BDB in a windows pseudo-fork, better 809broken to be supported, so do not use BDB in a windows pseudo-fork, better
800yet, switch to a more capable platform. 810yet, switch to a more capable platform.
801 811
802=head2 MEMORY USAGE 812=head1 MEMORY USAGE
803 813
804Per-request usage: 814Per-request usage:
805 815
806Each aio request uses - depending on your architecture - around 100-200 816Each aio request uses - depending on your architecture - around 100-200
807bytes of memory. In addition, stat requests need a stat buffer (possibly 817bytes of memory. In addition, stat requests need a stat buffer (possibly
816 826
817In the execution phase, some aio requests require more memory for 827In the execution phase, some aio requests require more memory for
818temporary buffers, and each thread requires a stack and other data 828temporary buffers, and each thread requires a stack and other data
819structures (usually around 16k-128k, depending on the OS). 829structures (usually around 16k-128k, depending on the OS).
820 830
831=head1 WIN32 FILENAMES/DATABASE NAME MESS
832
833Perl on Win32 supports only ASCII filenames (the reason is that it abuses
834an internal flag to store wether a filename is Unicode or ANSI, but that
835flag is used for somethign else in the perl core, so there is no way to
836detect wether a filename is ANSI or Unicode-encoded). The BDB module
837tries to work around this issue by assuming that the filename is an ANSI
838filename and BDB was built for unicode support.
839
821=head1 KNOWN BUGS 840=head1 KNOWN BUGS
822 841
823Known bugs will be fixed in the next release, except: 842Known bugs will be fixed in the next release, except:
824 843
825 If you use a transaction in any request, and the request returns 844 If you use a transaction in any request, and the request returns

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines