mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +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;
|
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 */
|
/* internal databases don't mmap or lock, and start off cleared */
|
||||||
if (tdb->flags & TDB_INTERNAL) {
|
if (tdb->flags & TDB_INTERNAL) {
|
||||||
tdb->flags |= (TDB_NOLOCK | TDB_NOMMAP);
|
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)
|
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;
|
tdb->flags |= flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tdb_remove_flags(struct tdb_context *tdb, unsigned 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;
|
tdb->flags &= ~flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,12 +86,20 @@
|
|||||||
fsync/msync calls are made.
|
fsync/msync calls are made.
|
||||||
|
|
||||||
- if TDB_ALLOW_NESTING is passed to flags in tdb open, or added using
|
- if TDB_ALLOW_NESTING is passed to flags in tdb open, or added using
|
||||||
tdb_add_flags() transaction is enabled.
|
tdb_add_flags() transaction nesting is enabled.
|
||||||
The default is that transaction nesting is not allowed and an attempt
|
It resets the TDB_DISALLOW_NESTING flag, as both cannot be used together.
|
||||||
to 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.
|
||||||
|
|
||||||
Beware. when transactions are nested a transaction successfully
|
Beware. when transactions are nested a transaction successfully
|
||||||
completed with tdb_transaction_commit() can be silently unrolled later.
|
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_NOLOCK - don't do any locking
|
||||||
TDB_NOMMAP - don't use mmap
|
TDB_NOMMAP - don't use mmap
|
||||||
TDB_NOSYNC - don't synchronise transactions to disk
|
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,
|
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_SEQNUM 128 /* maintain a sequence number */
|
||||||
#define TDB_VOLATILE 256 /* Activate the per-hashchain freelist, default 5 */
|
#define TDB_VOLATILE 256 /* Activate the per-hashchain freelist, default 5 */
|
||||||
#define TDB_ALLOW_NESTING 512 /* Allow transactions to nest */
|
#define TDB_ALLOW_NESTING 512 /* Allow transactions to nest */
|
||||||
|
#define TDB_DISALLOW_NESTING 1024 /* Disallow transactions to nest */
|
||||||
|
|
||||||
/* error codes */
|
/* error codes */
|
||||||
enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK,
|
enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK,
|
||||||
|
Loading…
Reference in New Issue
Block a user