summaryrefslogtreecommitdiff
path: root/source3/utils/net_conf.c
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2009-03-04 21:46:32 +0100
committerMichael Adam <obnox@samba.org>2009-03-04 22:49:24 +0100
commit094578903184e2702d2a5000bf448a89954acf95 (patch)
tree7fd97a22d0f91fa16636a0c73057ae743627265e /source3/utils/net_conf.c
parentf9636b0c01b962d2915895ef7125eed955423ded (diff)
downloadsamba-094578903184e2702d2a5000bf448a89954acf95.tar.gz
samba-094578903184e2702d2a5000bf448a89954acf95.tar.bz2
samba-094578903184e2702d2a5000bf448a89954acf95.zip
s3:net conf: reduce memory usage of "net conf import".
"net conf import" was wrapped in one big transaction. This lead to MAX_TALLOC_SIZE being exceeded at roughly 1500 shares. This patch resolves that problem by limiting the top level transactions in "net conf import" to 100 shares. Michael
Diffstat (limited to 'source3/utils/net_conf.c')
-rw-r--r--source3/utils/net_conf.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/source3/utils/net_conf.c b/source3/utils/net_conf.c
index 05b552c00d..38a2553e53 100644
--- a/source3/utils/net_conf.c
+++ b/source3/utils/net_conf.c
@@ -331,12 +331,6 @@ 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;
@@ -366,12 +360,45 @@ static int net_conf_import(struct net_context *c, struct smbconf_ctx *conf_ctx,
goto cancel;
}
}
+
+ /*
+ * Wrap the importing of shares into a transaction,
+ * but only 100 at a time, in order to serve memory.
+ * The allocated memory accumulates across the actions
+ * within the transaction, and for me, some 1500
+ * imported shares, the MAX_TALLOC_SIZE of 256 MB
+ * was exceeded.
+ */
+ werr = smbconf_transaction_start(conf_ctx);
+ if (!W_ERROR_IS_OK(werr)) {
+ d_printf("error starting transaction: %s\n",
+ win_errstr(werr));
+ goto done;
+ }
+
for (sidx = 0; sidx < num_shares; sidx++) {
werr = import_process_service(c, conf_ctx,
services[sidx]);
if (!W_ERROR_IS_OK(werr)) {
goto cancel;
}
+
+ if (sidx % 100) {
+ continue;
+ }
+
+ werr = smbconf_transaction_commit(conf_ctx);
+ if (!W_ERROR_IS_OK(werr)) {
+ d_printf("error committing transaction: %s\n",
+ win_errstr(werr));
+ goto done;
+ }
+ werr = smbconf_transaction_start(conf_ctx);
+ if (!W_ERROR_IS_OK(werr)) {
+ d_printf("error starting transaction: %s\n",
+ win_errstr(werr));
+ goto done;
+ }
}
}