make tdbbackup use transactions
authorAndrew Tridgell <tridge@samba.org>
Tue, 16 Dec 2008 03:36:56 +0000 (14:36 +1100)
committerAndrew Tridgell <tridge@samba.org>
Tue, 16 Dec 2008 03:36:56 +0000 (14:36 +1100)
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

lib/tdb/tools/tdbbackup.c

index 6f3ca48314f0ccbb0b48bcecf1637e0e3f628290..83c0e16399e1e1792559882e7dec73ca623e32ee 100644 (file)
@@ -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) {