diff options
author | Gregor Beck <gbeck@sernet.de> | 2011-08-01 15:27:46 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2011-08-08 15:27:07 +0200 |
commit | 356ed8644c0099a70ece5b7d5104662454d03ef8 (patch) | |
tree | f74f3763b3167d197adc5a74ab511672218a470c /source3/registry/reg_backend_db.c | |
parent | db06b61a1d3d38140578c004eb9d6cb3243d2870 (diff) | |
download | samba-356ed8644c0099a70ece5b7d5104662454d03ef8.tar.gz samba-356ed8644c0099a70ece5b7d5104662454d03ef8.tar.bz2 samba-356ed8644c0099a70ece5b7d5104662454d03ef8.zip |
s3:registry avoid updating keys which are going to be deleted in
reg_deletekey_recursive
this changes the complexity from O(n^2) to O(n) and reduces the time of
a 'net conf drop' with 10000 shares from 6min to 1.5s
Signed-off-by: Michael Adam <obnox@samba.org>
Diffstat (limited to 'source3/registry/reg_backend_db.c')
-rw-r--r-- | source3/registry/reg_backend_db.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 62d482069c..57d6d3980c 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1287,6 +1287,7 @@ struct regdb_delete_subkey_context { const char *key; const char *subkey; const char *path; + bool lazy; }; static NTSTATUS regdb_delete_subkey_action(struct db_context *db, @@ -1302,6 +1303,10 @@ static NTSTATUS regdb_delete_subkey_action(struct db_context *db, werr = regdb_delete_key_lists(db, delete_ctx->path); W_ERROR_NOT_OK_GOTO_DONE(werr); + if (delete_ctx->lazy) { + goto done; + } + werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO_DONE(werr); @@ -1323,7 +1328,7 @@ done: return werror_to_ntstatus(werr); } -static WERROR regdb_delete_subkey(const char *key, const char *subkey) +static WERROR regdb_delete_subkey(const char *key, const char *subkey, bool lazy) { WERROR werr; char *path; @@ -1349,6 +1354,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) delete_ctx.key = key; delete_ctx.subkey = subkey; delete_ctx.path = path; + delete_ctx.lazy = lazy; werr = ntstatus_to_werror(dbwrap_trans_do(regdb, regdb_delete_subkey_action, |