diff options
author | Michael Adam <obnox@samba.org> | 2009-02-24 10:54:13 +0100 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2009-02-26 11:05:23 +0100 |
commit | 42b8d6b3084e235beb8e4ed4215b5973e769ada3 (patch) | |
tree | 989aba1c258cfad71337dc9b366a3e53cec233e4 /source3/utils | |
parent | bd121b532cf5a6728b7605072f725cc9c6d47f48 (diff) | |
download | samba-42b8d6b3084e235beb8e4ed4215b5973e769ada3.tar.gz samba-42b8d6b3084e235beb8e4ed4215b5973e769ada3.tar.bz2 samba-42b8d6b3084e235beb8e4ed4215b5973e769ada3.zip |
s3:net: wrap net conf import into one big transaction
This speeds up "net conf import" of a file with 2000 shares
from 11 minutest to 1m50s on my box.
Michael
Diffstat (limited to 'source3/utils')
-rw-r--r-- | source3/utils/net_conf.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/source3/utils/net_conf.c b/source3/utils/net_conf.c index 0c2cd24fb2..05b552c00d 100644 --- a/source3/utils/net_conf.c +++ b/source3/utils/net_conf.c @@ -331,6 +331,12 @@ static int net_conf_import(struct net_context *c, struct smbconf_ctx *conf_ctx, "would import the following configuration:\n\n"); } + werr = smbconf_transaction_start(conf_ctx); + if (!W_ERROR_IS_OK(werr)) { + d_printf("error starting transaction: %s\n", win_errstr(werr)); + goto done; + } + if (servicename != NULL) { struct smbconf_service *service = NULL; @@ -338,11 +344,11 @@ static int net_conf_import(struct net_context *c, struct smbconf_ctx *conf_ctx, servicename, &service); if (!W_ERROR_IS_OK(werr)) { - goto done; + goto cancel; } werr = import_process_service(c, conf_ctx, service); if (!W_ERROR_IS_OK(werr)) { - goto done; + goto cancel; } } else { struct smbconf_service **services = NULL; @@ -352,24 +358,39 @@ static int net_conf_import(struct net_context *c, struct smbconf_ctx *conf_ctx, &num_shares, &services); if (!W_ERROR_IS_OK(werr)) { - goto done; + goto cancel; } if (!c->opt_testmode) { werr = smbconf_drop(conf_ctx); if (!W_ERROR_IS_OK(werr)) { - goto done; + goto cancel; } } for (sidx = 0; sidx < num_shares; sidx++) { werr = import_process_service(c, conf_ctx, services[sidx]); if (!W_ERROR_IS_OK(werr)) { - goto done; + goto cancel; } } } - ret = 0; + werr = smbconf_transaction_commit(conf_ctx); + if (!W_ERROR_IS_OK(werr)) { + d_printf("error committing transaction: %s\n", + win_errstr(werr)); + } else { + ret = 0; + } + + goto done; + +cancel: + werr = smbconf_transaction_cancel(conf_ctx); + if (!W_ERROR_IS_OK(werr)) { + d_printf("error cancelling transaction: %s\n", + win_errstr(werr)); + } done: TALLOC_FREE(mem_ctx); |