------------------------------------------------------------
revno: 276
revision-id: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Andrew Tridgell <[EMAIL PROTECTED]>
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: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Ronnie Sahlberg <[EMAIL PROTECTED]>
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: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Ronnie Sahlberg <[EMAIL PROTECTED]>
branch nick: ctdb
timestamp: Fri 2007-05-11 05:40:11 +1000
message:
make ctdb_control catdb work again
------------------------------------------------------------
revno: 197.1.98
merged: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Ronnie Sahlberg <[EMAIL PROTECTED]>
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);