mirror of
https://github.com/samba-team/samba.git
synced 2024-12-28 07:21:54 +03:00
11ab43084b
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>
61 lines
3.1 KiB
Plaintext
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 *)
|