[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-test-1967-geaba373

Andrew Tridgell tridge at samba.org
Thu Feb 7 12:08:33 GMT 2008


The branch, v3-2-test has been updated
       via  eaba373747e7de5f911b25952ee396ab1bae75d9 (commit)
      from  2bcc01fd134ceff1a45311dec73a5db9397033f9 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit eaba373747e7de5f911b25952ee396ab1bae75d9
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Feb 7 23:08:11 2008 +1100

    merge growing tdb for tdb_wipe_all() fix from ctdb

-----------------------------------------------------------------------

Summary of changes:
 source/lib/tdb/common/tdb.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/lib/tdb/common/tdb.c b/source/lib/tdb/common/tdb.c
index ea5d9cc..a25c3e7 100644
--- a/source/lib/tdb/common/tdb.c
+++ b/source/lib/tdb/common/tdb.c
@@ -696,11 +696,31 @@ int tdb_wipe_all(struct tdb_context *tdb)
 	int i;
 	tdb_off_t offset = 0;
 	ssize_t data_len;
+	tdb_off_t recovery_head;
+	tdb_len_t recovery_size = 0;
 
 	if (tdb_lockall(tdb) != 0) {
 		return -1;
 	}
 
+	/* see if the tdb has a recovery area, and remember its size
+	   if so. We don't want to lose this as otherwise each
+	   tdb_wipe_all() in a transaction will increase the size of
+	   the tdb by the size of the recovery area */
+	if (tdb_ofs_read(tdb, TDB_RECOVERY_HEAD, &recovery_head) == -1) {
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_wipe_all: failed to read recovery head\n"));
+		goto failed;
+	}
+
+	if (recovery_head != 0) {
+		struct list_struct rec;
+		if (tdb->methods->tdb_read(tdb, recovery_head, &rec, sizeof(rec), DOCONV()) == -1) {
+			TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_wipe_all: failed to read recovery record\n"));
+			return -1;
+		}	
+		recovery_size = rec.rec_len + sizeof(rec);
+	}
+
 	/* wipe the hashes */
 	for (i=0;i<tdb->header.hash_size;i++) {
 		if (tdb_ofs_write(tdb, TDB_HASH_TOP(i), &offset) == -1) {
@@ -722,6 +742,11 @@ int tdb_wipe_all(struct tdb_context *tdb)
 
 	/* add all the rest of the file to the freelist */
 	data_len = (tdb->map_size - TDB_DATA_START(tdb->header.hash_size)) - sizeof(struct list_struct);
+	if (data_len < recovery_size+sizeof(tdb_off_t)) {
+		recovery_size = 0;
+	} else {
+		data_len -= recovery_size;
+	}
 	if (data_len > 0) {
 		struct list_struct rec;
 		memset(&rec,'\0',sizeof(rec));
@@ -732,6 +757,24 @@ int tdb_wipe_all(struct tdb_context *tdb)
 		}
 	}
 
+	/* possibly add the recovery record */
+	if (recovery_size != 0) {
+		struct list_struct rec;
+		
+		recovery_head = tdb->map_size - recovery_size;
+
+		ZERO_STRUCT(rec);
+		rec.rec_len = recovery_size - sizeof(rec);
+		if (tdb_rec_write(tdb, recovery_head, &rec) != 0) {
+			TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_wipe_all: failed to add recovery record\n"));
+			goto failed;
+		}
+		if (tdb_ofs_write(tdb, TDB_RECOVERY_HEAD, &recovery_head) == -1) {
+			TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_wipe_all: failed to write recovery head\n"));
+			goto failed;		
+		}
+	}
+
 	if (tdb_unlockall(tdb) != 0) {
 		TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_wipe_all: failed to unlock\n"));
 		goto failed;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list