summaryrefslogtreecommitdiffstats
path: root/source/registry
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2007-02-07 13:26:13 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:17:48 -0500
commit92fdb1193de8e7c857603e4fcd4a92b9a0a0f3bd (patch)
treead4e4afe1fa74c69fecd95d6cde59e118854008c /source/registry
parent5b25ce30022b5968717691223d065a8e0770c6e3 (diff)
downloadsamba-92fdb1193de8e7c857603e4fcd4a92b9a0a0f3bd.tar.gz
samba-92fdb1193de8e7c857603e4fcd4a92b9a0a0f3bd.tar.xz
samba-92fdb1193de8e7c857603e4fcd4a92b9a0a0f3bd.zip
r21219: Speed up the initial startup time of smbd on systems with loaded disk
subsystems. See the comment in the diff. Volker
Diffstat (limited to 'source/registry')
-rw-r--r--source/registry/reg_db.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/source/registry/reg_db.c b/source/registry/reg_db.c
index 345193716e1..57a8e6ce0d6 100644
--- a/source/registry/reg_db.c
+++ b/source/registry/reg_db.c
@@ -98,6 +98,20 @@ static BOOL init_registry_data( void )
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 @@ static BOOL init_registry_data( void )
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 @@ static BOOL init_registry_data( void )
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 @@ static BOOL init_registry_data( void )
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;
}
/***********************************************************************