1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-03 13:47:25 +03:00

s3:idmap_autorid: use less transactions

reduce the amount of transactions that are mostly unnecessary because no
updates were done, only reads

Autobuild-User: Christian Ambach <ambi@samba.org>
Autobuild-Date: Fri Dec 16 20:18:37 CET 2011 on sn-devel-104
This commit is contained in:
Christian Ambach 2011-12-16 18:41:54 +01:00
parent 411d498b8a
commit 75b8a24a42

View File

@ -55,7 +55,7 @@ struct autorid_domain_config {
/* handle to the tdb storing domain <-> range assignments */
static struct db_context *autorid_db;
static NTSTATUS idmap_autorid_get_domainrange(struct db_context *db,
static NTSTATUS idmap_autorid_get_domainrange_action(struct db_context *db,
void *private_data)
{
NTSTATUS ret;
@ -65,8 +65,13 @@ static NTSTATUS idmap_autorid_get_domainrange(struct db_context *db,
cfg = (struct autorid_domain_config *)private_data;
ret = dbwrap_fetch_uint32(db, cfg->sid, &domainnum);
if (!NT_STATUS_IS_OK(ret)) {
ret = dbwrap_fetch_uint32(db, cfg->sid, &(cfg->domainnum));
if (NT_STATUS_IS_OK(ret)) {
/* entry is already present*/
return ret;
}
DEBUG(10, ("Acquiring new range for domain %s\n", cfg->sid));
/* fetch the current HWM */
@ -94,7 +99,7 @@ static NTSTATUS idmap_autorid_get_domainrange(struct db_context *db,
}
/* store away the new mapping in both directions */
ret = dbwrap_trans_store_uint32(db, cfg->sid, domainnum);
ret = dbwrap_store_uint32(db, cfg->sid, domainnum);
if (!NT_STATUS_IS_OK(ret)) {
DEBUG(1, ("Fatal error while storing new "
"domain->range assignment!\n"));
@ -107,7 +112,7 @@ static NTSTATUS idmap_autorid_get_domainrange(struct db_context *db,
goto error;
}
ret = dbwrap_trans_store_bystring(db, numstr,
ret = dbwrap_store_bystring(db, numstr,
string_term_tdb_data(cfg->sid), TDB_INSERT);
talloc_free(numstr);
@ -118,18 +123,37 @@ static NTSTATUS idmap_autorid_get_domainrange(struct db_context *db,
}
DEBUG(5, ("Acquired new range #%d for domain %s\n",
domainnum, cfg->sid));
}
DEBUG(10, ("Using range #%d for domain %s\n", domainnum, cfg->sid));
cfg->domainnum = domainnum;
return NT_STATUS_OK;
error:
error:
return ret;
}
static NTSTATUS idmap_autorid_get_domainrange(struct autorid_domain_config *dom)
{
NTSTATUS ret;
/*
* try to find mapping without locking the database,
* if it is not found create a mapping in a transaction
*/
ret = dbwrap_fetch_uint32(autorid_db, dom->sid, &(dom->domainnum));
if (!NT_STATUS_IS_OK(ret)) {;
ret = dbwrap_trans_do(autorid_db,
idmap_autorid_get_domainrange_action, dom);
}
DEBUG(10, ("Using range #%d for domain %s\n", dom->domainnum,
dom->sid));
return ret;
}
static NTSTATUS idmap_autorid_id_to_sid(struct autorid_global_config *cfg,
struct id_map *map)
{
@ -318,9 +342,7 @@ static NTSTATUS idmap_autorid_sids_to_unixids(struct idmap_domain *dom,
domaincfg.globalcfg = global;
sid_to_fstring(domaincfg.sid, &domainsid);
ret = dbwrap_trans_do(autorid_db,
idmap_autorid_get_domainrange,
&domaincfg);
ret = idmap_autorid_get_domainrange(&domaincfg);
if (!NT_STATUS_IS_OK(ret)) {
DEBUG(3, ("Could not determine range for domain, "
@ -617,9 +639,8 @@ static NTSTATUS idmap_autorid_allocate_id(struct idmap_domain *dom,
domaincfg.globalcfg = globalcfg;
fstrcpy(domaincfg.sid, ALLOC_RANGE);
ret = dbwrap_trans_do(autorid_db,
idmap_autorid_get_domainrange,
&domaincfg);
ret = idmap_autorid_get_domainrange(&domaincfg);
if (!NT_STATUS_IS_OK(ret)) {
DEBUG(3, ("Could not determine range for allocation pool, "
"check previous messages for reason\n"));