1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-28 07:21:54 +03:00
samba-mirror/lib/tdb/ABI/tdb-1.2.3.sigs
Rusty Russell 11ab43084b tdb: workaround starvation problem in locking entire database.
We saw tdb_lockall() take 71 seconds under heavy load; this is because Linux
(at least) doesn't prevent new small locks being obtained while we're waiting
for a big log.

The workaround is to do divide and conquer using non-blocking chainlocks: if
we get down to a single chain we block.  Using a simple test program where
children did "hold lock for 100ms, sleep for 1 second" the time to do
tdb_lockall() dropped signifiantly.  There are ln(hashsize) locks taken in
the contended case, but that's slow anyway.

More analysis is given in my blog at http://rusty.ozlabs.org/?p=120

This may also help transactions, though in that case it's the initial
read lock which uses this gradual locking routine; the update-to-write-lock
code is separate and still tries to update in one go.

Even though ABI doesn't change, minor version bumped so behavior change
can be easily detected.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2010-08-14 02:31:22 +09:30

61 lines
3.1 KiB
Plaintext

tdb_add_flags: void (struct tdb_context *, unsigned int)
tdb_append: int (struct tdb_context *, TDB_DATA, TDB_DATA)
tdb_chainlock: int (struct tdb_context *, TDB_DATA)
tdb_chainlock_mark: int (struct tdb_context *, TDB_DATA)
tdb_chainlock_nonblock: int (struct tdb_context *, TDB_DATA)
tdb_chainlock_read: int (struct tdb_context *, TDB_DATA)
tdb_chainlock_unmark: int (struct tdb_context *, TDB_DATA)
tdb_chainunlock: int (struct tdb_context *, TDB_DATA)
tdb_chainunlock_read: int (struct tdb_context *, TDB_DATA)
tdb_check: int (struct tdb_context *, int (*)(TDB_DATA, TDB_DATA, void *), void *)
tdb_close: int (struct tdb_context *)
tdb_delete: int (struct tdb_context *, TDB_DATA)
tdb_dump_all: void (struct tdb_context *)
tdb_enable_seqnum: void (struct tdb_context *)
tdb_error: enum TDB_ERROR (struct tdb_context *)
tdb_errorstr: const char *(struct tdb_context *)
tdb_exists: int (struct tdb_context *, TDB_DATA)
tdb_fd: int (struct tdb_context *)
tdb_fetch: TDB_DATA (struct tdb_context *, TDB_DATA)
tdb_firstkey: TDB_DATA (struct tdb_context *)
tdb_freelist_size: int (struct tdb_context *)
tdb_get_flags: int (struct tdb_context *)
tdb_get_logging_private: void *(struct tdb_context *)
tdb_get_seqnum: int (struct tdb_context *)
tdb_hash_size: int (struct tdb_context *)
tdb_increment_seqnum_nonblock: void (struct tdb_context *)
tdb_lockall: int (struct tdb_context *)
tdb_lockall_mark: int (struct tdb_context *)
tdb_lockall_nonblock: int (struct tdb_context *)
tdb_lockall_read: int (struct tdb_context *)
tdb_lockall_read_nonblock: int (struct tdb_context *)
tdb_lockall_unmark: int (struct tdb_context *)
tdb_log_fn: tdb_log_func (struct tdb_context *)
tdb_map_size: size_t (struct tdb_context *)
tdb_name: const char *(struct tdb_context *)
tdb_nextkey: TDB_DATA (struct tdb_context *, TDB_DATA)
tdb_null: dptr = 0xXXXX, dsize = 0
tdb_open: struct tdb_context *(const char *, int, int, int, mode_t)
tdb_open_ex: struct tdb_context *(const char *, int, int, int, mode_t, const struct tdb_logging_context *, tdb_hash_func)
tdb_parse_record: int (struct tdb_context *, TDB_DATA, int (*)(TDB_DATA, TDB_DATA, void *), void *)
tdb_printfreelist: int (struct tdb_context *)
tdb_remove_flags: void (struct tdb_context *, unsigned int)
tdb_reopen: int (struct tdb_context *)
tdb_reopen_all: int (int)
tdb_repack: int (struct tdb_context *)
tdb_set_logging_function: void (struct tdb_context *, const struct tdb_logging_context *)
tdb_set_max_dead: void (struct tdb_context *, int)
tdb_setalarm_sigptr: void (struct tdb_context *, volatile sig_atomic_t *)
tdb_store: int (struct tdb_context *, TDB_DATA, TDB_DATA, int)
tdb_transaction_cancel: int (struct tdb_context *)
tdb_transaction_commit: int (struct tdb_context *)
tdb_transaction_prepare_commit: int (struct tdb_context *)
tdb_transaction_start: int (struct tdb_context *)
tdb_transaction_start_nonblock: int (struct tdb_context *)
tdb_traverse: int (struct tdb_context *, tdb_traverse_func, void *)
tdb_traverse_read: int (struct tdb_context *, tdb_traverse_func, void *)
tdb_unlockall: int (struct tdb_context *)
tdb_unlockall_read: int (struct tdb_context *)
tdb_validate_freelist: int (struct tdb_context *, int *)
tdb_wipe_all: int (struct tdb_context *)