mirror of
https://github.com/samba-team/samba.git
synced 2025-11-20 08:23:50 +03:00
allowing searches to proceed while another process is in a transaction, then only upgrading the transaction lock to a write lock on commit. The solution is: - split tdb_traverse() into two calls, called tdb_traverse() and tdb_traverse_read(). The _read() version only gets read locks, and will fail any write operations made in the callback from the traverse. - the normal tdb_traverse() call allows for read or write operations in the callback, but gets the transaction lock, preventing transastions from starting inside the traverse In addition we enforce the following rule that you may not start a transaction within a traverse callback, although you can start a traverse within a transaction With these rules in place I believe all the deadlock possibilities are removed, and we can now allow for searches to happen in parallel with transactions
59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
|
|
trivial database library
|
|
|
|
Copyright (C) Andrew Tridgell 1999-2005
|
|
Copyright (C) Paul `Rusty' Russell 2000
|
|
Copyright (C) Jeremy Allison 2000-2003
|
|
|
|
** NOTE! The following LGPL license applies to the tdb
|
|
** library. This does NOT imply that all of Samba is released
|
|
** under the LGPL
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "tdb_private.h"
|
|
|
|
enum TDB_ERROR tdb_error(struct tdb_context *tdb)
|
|
{
|
|
return tdb->ecode;
|
|
}
|
|
|
|
static struct tdb_errname {
|
|
enum TDB_ERROR ecode; const char *estring;
|
|
} emap[] = { {TDB_SUCCESS, "Success"},
|
|
{TDB_ERR_CORRUPT, "Corrupt database"},
|
|
{TDB_ERR_IO, "IO Error"},
|
|
{TDB_ERR_LOCK, "Locking error"},
|
|
{TDB_ERR_OOM, "Out of memory"},
|
|
{TDB_ERR_EXISTS, "Record exists"},
|
|
{TDB_ERR_NOLOCK, "Lock exists on other keys"},
|
|
{TDB_ERR_EINVAL, "Invalid parameter"},
|
|
{TDB_ERR_NOEXIST, "Record does not exist"},
|
|
{TDB_ERR_RDONLY, "write not permitted"} };
|
|
|
|
/* Error string for the last tdb error */
|
|
const char *tdb_errorstr(struct tdb_context *tdb)
|
|
{
|
|
u32 i;
|
|
for (i = 0; i < sizeof(emap) / sizeof(struct tdb_errname); i++)
|
|
if (tdb->ecode == emap[i].ecode)
|
|
return emap[i].estring;
|
|
return "Invalid error code";
|
|
}
|
|
|