mirror of
https://github.com/samba-team/samba.git
synced 2025-01-10 01:18:15 +03:00
tdb: add TDB_DISALLOW_NESTING and make TDB_ALLOW_NESTING the default behavior
We need to keep TDB_ALLOW_NESTING as default behavior, so that existing code continues to work. However we may change the default together with a major version number change in future. metze
This commit is contained in:
parent
436b55db1f
commit
3b9f19ed91
@ -202,6 +202,23 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
|
||||
tdb->flags &= ~TDB_CLEAR_IF_FIRST;
|
||||
}
|
||||
|
||||
if ((tdb->flags & TDB_ALLOW_NESTING) &&
|
||||
(tdb->flags & TDB_DISALLOW_NESTING)) {
|
||||
tdb->ecode = TDB_ERR_NESTING;
|
||||
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_open_ex: "
|
||||
"allow_nesting and disallow_nesting are not allowed together!"));
|
||||
errno = EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* TDB_ALLOW_NESTING is the default behavior.
|
||||
* Note: this may change in future versions!
|
||||
*/
|
||||
if (!(tdb->flags & TDB_DISALLOW_NESTING)) {
|
||||
tdb->flags |= TDB_ALLOW_NESTING;
|
||||
}
|
||||
|
||||
/* internal databases don't mmap or lock, and start off cleared */
|
||||
if (tdb->flags & TDB_INTERNAL) {
|
||||
tdb->flags |= (TDB_NOLOCK | TDB_NOMMAP);
|
||||
|
@ -730,11 +730,41 @@ int tdb_get_flags(struct tdb_context *tdb)
|
||||
|
||||
void tdb_add_flags(struct tdb_context *tdb, unsigned flags)
|
||||
{
|
||||
if ((flags & TDB_ALLOW_NESTING) &&
|
||||
(flags & TDB_DISALLOW_NESTING)) {
|
||||
tdb->ecode = TDB_ERR_NESTING;
|
||||
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_add_flags: "
|
||||
"allow_nesting and disallow_nesting are not allowed together!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (flags & TDB_ALLOW_NESTING) {
|
||||
tdb->flags &= ~TDB_DISALLOW_NESTING;
|
||||
}
|
||||
if (flags & TDB_DISALLOW_NESTING) {
|
||||
tdb->flags &= ~TDB_ALLOW_NESTING;
|
||||
}
|
||||
|
||||
tdb->flags |= flags;
|
||||
}
|
||||
|
||||
void tdb_remove_flags(struct tdb_context *tdb, unsigned flags)
|
||||
{
|
||||
if ((flags & TDB_ALLOW_NESTING) &&
|
||||
(flags & TDB_DISALLOW_NESTING)) {
|
||||
tdb->ecode = TDB_ERR_NESTING;
|
||||
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_remove_flags: "
|
||||
"allow_nesting and disallow_nesting are not allowed together!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (flags & TDB_ALLOW_NESTING) {
|
||||
tdb->flags |= TDB_DISALLOW_NESTING;
|
||||
}
|
||||
if (flags & TDB_DISALLOW_NESTING) {
|
||||
tdb->flags |= TDB_ALLOW_NESTING;
|
||||
}
|
||||
|
||||
tdb->flags &= ~flags;
|
||||
}
|
||||
|
||||
|
@ -86,12 +86,20 @@
|
||||
fsync/msync calls are made.
|
||||
|
||||
- if TDB_ALLOW_NESTING is passed to flags in tdb open, or added using
|
||||
tdb_add_flags() transaction is enabled.
|
||||
The default is that transaction nesting is not allowed and an attempt
|
||||
to create a nested transaction will fail with TDB_ERR_NESTING.
|
||||
tdb_add_flags() transaction nesting is enabled.
|
||||
It resets the TDB_DISALLOW_NESTING flag, as both cannot be used together.
|
||||
The default is that transaction nesting is allowed.
|
||||
Note: this default may change in future versions of tdb.
|
||||
|
||||
Beware. when transactions are nested a transaction successfully
|
||||
completed with tdb_transaction_commit() can be silently unrolled later.
|
||||
|
||||
- if TDB_DISALLOW_NESTING is passed to flags in tdb open, or added using
|
||||
tdb_add_flags() transaction nesting is disabled.
|
||||
It resets the TDB_ALLOW_NESTING flag, as both cannot be used together.
|
||||
An attempt create a nested transaction will fail with TDB_ERR_NESTING.
|
||||
The default is that transaction nesting is allowed.
|
||||
Note: this default may change in future versions of tdb.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -69,6 +69,10 @@ TDB_CONTEXT *tdb_open(char *name, int hash_size, int tdb_flags,
|
||||
TDB_NOLOCK - don't do any locking
|
||||
TDB_NOMMAP - don't use mmap
|
||||
TDB_NOSYNC - don't synchronise transactions to disk
|
||||
TDB_SEQNUM - maintain a sequence number
|
||||
TDB_VOLATILE - activate the per-hashchain freelist, default 5
|
||||
TDB_ALLOW_NESTING - allow transactions to nest
|
||||
TDB_DISALLOW_NESTING - disallow transactions to nest
|
||||
|
||||
----------------------------------------------------------------------
|
||||
TDB_CONTEXT *tdb_open_ex(char *name, int hash_size, int tdb_flags,
|
||||
|
@ -49,6 +49,7 @@ extern "C" {
|
||||
#define TDB_SEQNUM 128 /* maintain a sequence number */
|
||||
#define TDB_VOLATILE 256 /* Activate the per-hashchain freelist, default 5 */
|
||||
#define TDB_ALLOW_NESTING 512 /* Allow transactions to nest */
|
||||
#define TDB_DISALLOW_NESTING 1024 /* Disallow transactions to nest */
|
||||
|
||||
/* error codes */
|
||||
enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK,
|
||||
|
Loading…
Reference in New Issue
Block a user