1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

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
This commit is contained in:
Michael Adam 2009-03-04 21:46:32 +01:00
parent f9636b0c01
commit 0945789031

View File

@ -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;
}
}
}