summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2008-12-16 14:36:56 +1100
committerAndrew Tridgell <tridge@samba.org>2008-12-16 14:36:56 +1100
commit2e4247782bd5812bc8e7ea24194c8436748bb2fa (patch)
treea063d38c805dde2840ab028d73045fbe4d9fcd6e
parentf448fde4e35e56508ad93be8de9f60d88e8b8dcd (diff)
downloadsamba-2e4247782bd5812bc8e7ea24194c8436748bb2fa.tar.gz
samba-2e4247782bd5812bc8e7ea24194c8436748bb2fa.tar.bz2
samba-2e4247782bd5812bc8e7ea24194c8436748bb2fa.zip
make tdbbackup use transactions
tdbbackup was originally written before we had transactions, and it attempted to use its own fsync() calls to make it safe. Now that we have transactions we can do it in a much safer (and faster!) fashion
-rw-r--r--lib/tdb/tools/tdbbackup.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/lib/tdb/tools/tdbbackup.c b/lib/tdb/tools/tdbbackup.c
index 6f3ca48314..83c0e16399 100644
--- a/lib/tdb/tools/tdbbackup.c
+++ b/lib/tdb/tools/tdbbackup.c
@@ -126,9 +126,17 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size)
return 1;
}
- /* lock the old tdb */
- if (tdb_lockall(tdb) != 0) {
- fprintf(stderr,"Failed to lock %s\n", old_name);
+ if (tdb_transaction_start(tdb) != 0) {
+ printf("Failed to start transaction on old tdb\n");
+ tdb_close(tdb);
+ tdb_close(tdb_new);
+ unlink(tmp_name);
+ free(tmp_name);
+ return 1;
+ }
+
+ if (tdb_transaction_start(tdb_new) != 0) {
+ printf("Failed to start transaction on new tdb\n");
tdb_close(tdb);
tdb_close(tdb_new);
unlink(tmp_name);
@@ -152,6 +160,14 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size)
/* close the old tdb */
tdb_close(tdb);
+ if (tdb_transaction_commit(tdb_new) != 0) {
+ fprintf(stderr, "Failed to commit new tdb\n");
+ tdb_close(tdb_new);
+ unlink(tmp_name);
+ free(tmp_name);
+ return 1;
+ }
+
/* close the new tdb and re-open read-only */
tdb_close(tdb_new);
tdb_new = tdb_open(tmp_name, 0, TDB_DEFAULT, O_RDONLY, 0);
@@ -173,9 +189,6 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size)
return 1;
}
- /* make sure the new tdb has reached stable storage */
- fsync(tdb_fd(tdb_new));
-
/* close the new tdb and rename it to .bak */
tdb_close(tdb_new);
if (rename(tmp_name, new_name) != 0) {