Author: tridge Date: 2007-10-18 02:03:21 +0000 (Thu, 18 Oct 2007) New Revision: 25690
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25690 Log: - only use a readonly traverse in ldb_search when not in a transaction. When we are in a transaction then we could be in a top level modify operation (such as rename), so we must use a writeable traverse so that the async callbacks can do the modifies while the search is progressing. - don't do the lockall operation on the tdb during a ldb search if in a transaction, as this would prevent modifies by callbacks as well Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_search.c branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.h Changeset: Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_search.c =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_search.c 2007-10-18 01:37:46 UTC (rev 25689) +++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_search.c 2007-10-18 02:03:21 UTC (rev 25690) @@ -253,7 +253,10 @@ static int ltdb_lock_read(struct ldb_module *module) { struct ltdb_private *ltdb = (struct ltdb_private *)module->private_data; - return tdb_lockall_read(ltdb->tdb); + if (ltdb->in_transaction == 0) { + return tdb_lockall_read(ltdb->tdb); + } + return 0; } /* @@ -262,7 +265,10 @@ static int ltdb_unlock_read(struct ldb_module *module) { struct ltdb_private *ltdb = (struct ltdb_private *)module->private_data; - return tdb_unlockall_read(ltdb->tdb); + if (ltdb->in_transaction == 0) { + return tdb_unlockall_read(ltdb->tdb); + } + return 0; } /* @@ -442,7 +448,11 @@ struct ltdb_private *ltdb = talloc_get_type(ac->module->private_data, struct ltdb_private); int ret; - ret = tdb_traverse_read(ltdb->tdb, search_func, handle); + if (ltdb->in_transaction != 0) { + ret = tdb_traverse(ltdb->tdb, search_func, handle); + } else { + ret = tdb_traverse_read(ltdb->tdb, search_func, handle); + } if (ret == -1) { handle->status = LDB_ERR_OPERATIONS_ERROR; Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c 2007-10-18 01:37:46 UTC (rev 25689) +++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c 2007-10-18 02:03:21 UTC (rev 25690) @@ -907,6 +907,8 @@ return ltdb_err_map(tdb_error(ltdb->tdb)); } + ltdb->in_transaction++; + return LDB_SUCCESS; } @@ -915,6 +917,8 @@ struct ltdb_private *ltdb = talloc_get_type(module->private_data, struct ltdb_private); + ltdb->in_transaction--; + if (tdb_transaction_commit(ltdb->tdb) != 0) { return ltdb_err_map(tdb_error(ltdb->tdb)); } @@ -927,6 +931,8 @@ struct ltdb_private *ltdb = talloc_get_type(module->private_data, struct ltdb_private); + ltdb->in_transaction--; + if (tdb_transaction_cancel(ltdb->tdb) != 0) { return ltdb_err_map(tdb_error(ltdb->tdb)); } Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.h =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.h 2007-10-18 01:37:46 UTC (rev 25689) +++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.h 2007-10-18 02:03:21 UTC (rev 25690) @@ -27,6 +27,8 @@ int flags; } last_attribute; } *cache; + + int in_transaction; }; /*
