svn commit: samba r21219 - in branches: SAMBA_3_0/source/registry
SAMBA_3_0_25/source/registry
vlendec at samba.org
vlendec at samba.org
Wed Feb 7 13:26:14 GMT 2007
Author: vlendec
Date: 2007-02-07 13:26:13 +0000 (Wed, 07 Feb 2007)
New Revision: 21219
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21219
Log:
Speed up the initial startup time of smbd on systems with loaded disk
subsystems. See the comment in the diff.
Volker
Modified:
branches/SAMBA_3_0/source/registry/reg_db.c
branches/SAMBA_3_0_25/source/registry/reg_db.c
Changeset:
Modified: branches/SAMBA_3_0/source/registry/reg_db.c
===================================================================
--- branches/SAMBA_3_0/source/registry/reg_db.c 2007-02-07 12:16:23 UTC (rev 21218)
+++ branches/SAMBA_3_0/source/registry/reg_db.c 2007-02-07 13:26:13 UTC (rev 21219)
@@ -98,6 +98,20 @@
int i;
const char *p, *p2;
UNISTR2 data;
+
+ /*
+ * There are potentially quite a few store operations which are all
+ * indiviually wrapped in tdb transactions. Wrapping them in a single
+ * transaction gives just a single transaction_commit() to actually do
+ * its fsync()s. See tdb/common/transaction.c for info about nested
+ * transaction behaviour.
+ */
+
+ if ( tdb_transaction_start( tdb_reg ) == -1 ) {
+ DEBUG(0, ("init_registry_data: tdb_transaction_start "
+ "failed\n"));
+ return False;
+ }
/* loop over all of the predefined paths and add each component */
@@ -137,14 +151,14 @@
if ( !(subkeys = TALLOC_ZERO_P( NULL, REGSUBKEY_CTR )) ) {
DEBUG(0,("talloc() failure!\n"));
- return False;
+ goto fail;
}
regdb_fetch_keys( base, subkeys );
if ( *subkeyname )
regsubkey_ctr_addkey( subkeys, subkeyname );
if ( !regdb_store_keys( base, subkeys ))
- return False;
+ goto fail;
TALLOC_FREE( subkeys );
}
@@ -155,7 +169,7 @@
for ( i=0; builtin_registry_values[i].path != NULL; i++ ) {
if ( !(values = TALLOC_ZERO_P( NULL, REGVAL_CTR )) ) {
DEBUG(0,("talloc() failure!\n"));
- return False;
+ goto fail;
}
regdb_fetch_values( builtin_registry_values[i].path, values );
@@ -192,7 +206,22 @@
TALLOC_FREE( values );
}
+ if (tdb_transaction_commit( tdb_reg ) == -1) {
+ DEBUG(0, ("init_registry_data: Could not commit "
+ "transaction\n"));
+ return False;
+ }
+
return True;
+
+ fail:
+
+ if (tdb_transaction_cancel( tdb_reg ) == -1) {
+ smb_panic("init_registry_data: tdb_transaction_cancel "
+ "failed\n");
+ }
+
+ return False;
}
/***********************************************************************
Modified: branches/SAMBA_3_0_25/source/registry/reg_db.c
===================================================================
--- branches/SAMBA_3_0_25/source/registry/reg_db.c 2007-02-07 12:16:23 UTC (rev 21218)
+++ branches/SAMBA_3_0_25/source/registry/reg_db.c 2007-02-07 13:26:13 UTC (rev 21219)
@@ -96,6 +96,20 @@
int i;
const char *p, *p2;
UNISTR2 data;
+
+ /*
+ * There are potentially quite a few store operations which are all
+ * indiviually wrapped in tdb transactions. Wrapping them in a single
+ * transaction gives just a single transaction_commit() to actually do
+ * its fsync()s. See tdb/common/transaction.c for info about nested
+ * transaction behaviour.
+ */
+
+ if ( tdb_transaction_start( tdb_reg ) == -1 ) {
+ DEBUG(0, ("init_registry_data: tdb_transaction_start "
+ "failed\n"));
+ return False;
+ }
/* loop over all of the predefined paths and add each component */
@@ -135,14 +149,14 @@
if ( !(subkeys = TALLOC_ZERO_P( NULL, REGSUBKEY_CTR )) ) {
DEBUG(0,("talloc() failure!\n"));
- return False;
+ goto fail;
}
regdb_fetch_keys( base, subkeys );
if ( *subkeyname )
regsubkey_ctr_addkey( subkeys, subkeyname );
if ( !regdb_store_keys( base, subkeys ))
- return False;
+ goto fail;
TALLOC_FREE( subkeys );
}
@@ -153,7 +167,7 @@
for ( i=0; builtin_registry_values[i].path != NULL; i++ ) {
if ( !(values = TALLOC_ZERO_P( NULL, REGVAL_CTR )) ) {
DEBUG(0,("talloc() failure!\n"));
- return False;
+ goto fail;
}
regdb_fetch_values( builtin_registry_values[i].path, values );
@@ -190,7 +204,22 @@
TALLOC_FREE( values );
}
+ if (tdb_transaction_commit( tdb_reg ) == -1) {
+ DEBUG(0, ("init_registry_data: Could not commit "
+ "transaction\n"));
+ return False;
+ }
+
return True;
+
+ fail:
+
+ if (tdb_transaction_cancel( tdb_reg ) == -1) {
+ smb_panic("init_registry_data: tdb_transaction_cancel "
+ "failed\n");
+ }
+
+ return False;
}
/***********************************************************************
More information about the samba-cvs
mailing list