Rev 276: - merge from ronnie in http://samba.org/~tridge/ctdb
tridge at samba.org
tridge at samba.org
Fri May 11 00:33:44 GMT 2007
------------------------------------------------------------
revno: 276
revision-id: tridge at samba.org-20070511003343-mdcfsv1todutp5mz
parent: tridge at samba.org-20070510074345-gp2mm5z8rqhytnvu
parent: sahlberg at ronnie-20070510200817-cd0cc3a541930600
committer: Andrew Tridgell <tridge at samba.org>
branch nick: tridge
timestamp: Fri 2007-05-11 10:33:43 +1000
message:
- merge from ronnie
- increment rsn only in become_dmaster
- add torture check for rsn regression in ctdb_ltdb_store
modified:
common/ctdb_call.c ctdb_call.c-20061128065342-to93h6eejj5kon81-1
common/ctdb_client.c ctdb_client.c-20070411010216-3kd8v37k61steeya-1
common/ctdb_ltdb.c ctdb_ltdb.c-20061128065342-to93h6eejj5kon81-2
------------------------------------------------------------
revno: 197.1.100
merged: sahlberg at ronnie-20070510200817-cd0cc3a541930600
parent: sahlberg at ronnie-20070510194011-4b6a20e4195d6b18
committer: Ronnie Sahlberg <sahlberg at ronnie>
branch nick: ctdb
timestamp: Fri 2007-05-11 06:08:17 +1000
message:
we must bump the rsn everytime we do a REQ_DMASTER or a REPLY_DMASTER
to make sure that the "merge records based on rsn during recovery" will
merge correctly.
this is extra important since samba3 never bumps the record when it
writes new data to it !
------------------------------------------------------------
revno: 197.1.99
merged: sahlberg at ronnie-20070510194011-4b6a20e4195d6b18
parent: sahlberg at ronnie-20070510075951-10d944d8d76842c0
committer: Ronnie Sahlberg <sahlberg at ronnie>
branch nick: ctdb
timestamp: Fri 2007-05-11 05:40:11 +1000
message:
make ctdb_control catdb work again
------------------------------------------------------------
revno: 197.1.98
merged: sahlberg at ronnie-20070510075951-10d944d8d76842c0
parent: sahlberg at ronnie-20070510001058-a7ac6eddce1344a8
parent: tridge at samba.org-20070510074345-gp2mm5z8rqhytnvu
committer: Ronnie Sahlberg <sahlberg at ronnie>
branch nick: ctdb
timestamp: Thu 2007-05-10 17:59:51 +1000
message:
merge from tridge
=== modified file 'common/ctdb_call.c'
--- a/common/ctdb_call.c 2007-05-10 07:43:45 +0000
+++ b/common/ctdb_call.c 2007-05-11 00:33:43 +0000
@@ -295,7 +295,7 @@
DEBUG(2,("vnn %u dmaster response %08x\n", ctdb->vnn, ctdb_hash(&key)));
ZERO_STRUCT(header);
- header.rsn = rsn;
+ header.rsn = rsn + 1;
header.dmaster = ctdb->vnn;
if (ctdb_ltdb_store(ctdb_db, key, &header, data) != 0) {
=== modified file 'common/ctdb_client.c'
--- a/common/ctdb_client.c 2007-05-10 07:43:45 +0000
+++ b/common/ctdb_client.c 2007-05-10 19:40:11 +0000
@@ -1037,17 +1037,16 @@
{
int i, ret;
TDB_DATA indata, outdata;
+ struct ctdb_control_pulldb pull;
+ struct ctdb_control_pulldb_reply *reply;
+ struct ctdb_rec_data *rec;
int32_t res;
- unsigned char *ptr;
-
- DEBUG(0,("ronnie to fix!\n"));
- return -1;
-
- indata.dsize = 2*sizeof(uint32_t);
- indata.dptr = (unsigned char *)talloc_array(mem_ctx, uint32_t, 2);
-
- ((uint32_t *)(&indata.dptr[0]))[0] = dbid;
- ((uint32_t *)(&indata.dptr[0]))[1] = lmaster;
+
+ pull.db_id = dbid;
+ pull.lmaster = lmaster;
+
+ indata.dsize = sizeof(struct ctdb_control_pulldb);
+ indata.dptr = (unsigned char *)&pull;
ret = ctdb_control(ctdb, destnode, 0,
CTDB_CONTROL_PULL_DB, 0, indata,
@@ -1058,45 +1057,34 @@
}
- keys->dbid = ((uint32_t *)(&outdata.dptr[0]))[0];
- keys->num = ((uint32_t *)(&outdata.dptr[0]))[1];
- keys->keys =talloc_array(mem_ctx, TDB_DATA, keys->num);
- keys->headers=talloc_array(mem_ctx, struct ctdb_ltdb_header, keys->num);
- keys->lmasters=talloc_array(mem_ctx, uint32_t, keys->num);
- keys->data=talloc_array(mem_ctx, TDB_DATA, keys->num);
-
- /* loop over all key/data pairs */
- ptr=&outdata.dptr[8];
- for(i=0;i<keys->num;i++){
- TDB_DATA *key, *data;
-
- keys->lmasters[i] = *((uint32_t *)ptr);
- ptr += 4;
-
- key = &keys->keys[i];
- key->dsize = *((uint32_t *)ptr);
- key->dptr = talloc_size(mem_ctx, key->dsize);
- ptr += 4;
-
- data = &keys->data[i];
- data->dsize = *((uint32_t *)ptr);
- data->dptr = talloc_size(mem_ctx, data->dsize);
- ptr += 4;
-
- ptr = outdata.dptr+(((ptr-outdata.dptr)+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1));
- memcpy(key->dptr, ptr, key->dsize);
- ptr += key->dsize;
-
- ptr = outdata.dptr+(((ptr-outdata.dptr)+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1));
- memcpy(&keys->headers[i], ptr, sizeof(struct ctdb_ltdb_header));
- ptr += sizeof(struct ctdb_ltdb_header);
-
- ptr = outdata.dptr+(((ptr-outdata.dptr)+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1));
- memcpy(data->dptr, ptr, data->dsize);
- ptr += data->dsize;
-
- ptr = outdata.dptr+(((ptr-outdata.dptr)+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1));
- }
+ reply = (struct ctdb_control_pulldb_reply *)outdata.dptr;
+ keys->dbid = reply->db_id;
+ keys->num = reply->count;
+
+ keys->keys = talloc_array(mem_ctx, TDB_DATA, keys->num);
+ keys->headers = talloc_array(mem_ctx, struct ctdb_ltdb_header, keys->num);
+ keys->lmasters = talloc_array(mem_ctx, uint32_t, keys->num);
+ keys->data = talloc_array(mem_ctx, TDB_DATA, keys->num);
+
+ rec = (struct ctdb_rec_data *)&reply->data[0];
+
+ for (i=0;i<reply->count;i++) {
+ keys->keys[i].dptr = talloc_memdup(mem_ctx, &rec->data[0], rec->keylen);
+ keys->keys[i].dsize = rec->keylen;
+
+ keys->data[i].dptr = talloc_memdup(mem_ctx, &rec->data[keys->keys[i].dsize], rec->datalen);
+ keys->data[i].dsize = rec->datalen;
+
+ if (keys->data[i].dsize < sizeof(struct ctdb_ltdb_header)) {
+ DEBUG(0,(__location__ " bad ltdb record\n"));
+ return -1;
+ }
+ memcpy(&keys->headers[i], keys->data[i].dptr, sizeof(struct ctdb_ltdb_header));
+ keys->data[i].dptr += sizeof(struct ctdb_ltdb_header);
+ keys->data[i].dsize -= sizeof(struct ctdb_ltdb_header);
+
+ rec = (struct ctdb_rec_data *)(rec->length + (uint8_t *)rec);
+ }
return 0;
}
=== modified file 'common/ctdb_ltdb.c'
--- a/common/ctdb_ltdb.c 2007-05-10 07:43:45 +0000
+++ b/common/ctdb_ltdb.c 2007-05-11 00:33:43 +0000
@@ -145,6 +145,17 @@
TDB_DATA rec;
int ret;
+ if (ctdb->flags & CTDB_FLAG_TORTURE) {
+ struct ctdb_ltdb_header *h2;
+ rec = tdb_fetch(ctdb_db->ltdb->tdb, key);
+ h2 = (struct ctdb_ltdb_header *)rec.dptr;
+ if (rec.dptr && rec.dsize >= sizeof(h2) && h2->rsn > header->rsn) {
+ DEBUG(0,("RSN regression! %llu %llu\n",
+ (unsigned long long)h2->rsn, (unsigned long long)header->rsn));
+ }
+ if (rec.dptr) free(rec.dptr);
+ }
+
rec.dsize = sizeof(*header) + data.dsize;
rec.dptr = talloc_size(ctdb, rec.dsize);
CTDB_NO_MEMORY(ctdb, rec.dptr);
More information about the samba-cvs
mailing list