int ctdb_ctrl_write_record(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *mem_ctx, uint32_t dbid, TDB_DATA key, TDB_DATA data)
{
- int ret, len;
+ struct ctdb_write_record *wr;
TDB_DATA indata, outdata;
int32_t res;
- unsigned char *ptr;
+ int ret, len;
+
+ len = offsetof(struct ctdb_write_record, blob)+key.dsize+data.dsize;
+ wr = (struct ctdb_write_record *)talloc_zero_size(mem_ctx, len);
+ wr->dbid = dbid;
+ wr->keylen = key.dsize;
+ wr->datalen = data.dsize;
+ memcpy(&wr->blob[0], &key.dptr[0], key.dsize);
+ memcpy(&wr->blob[key.dsize], &data.dptr[0], data.dsize);
- len = 4; /* dbid */
- len += 4; /* keylen */
- len += (key.dsize+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1);
- len += 4; /* datalen */
- len += (data.dsize+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1);
indata.dsize = len;
- indata.dptr = (unsigned char *)talloc_array(mem_ctx, uint8_t, len);
- ptr = indata.dptr;
- *((uint32_t *)ptr) = dbid;
- ptr += 4;
-
- *((uint32_t *)ptr) = key.dsize;
- ptr += 4;
- memcpy(ptr, key.dptr, key.dsize);
- ptr += (key.dsize+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1);
-
- *((uint32_t *)ptr) = data.dsize;
- ptr += 4;
- memcpy(ptr, data.dptr, data.dsize);
- ptr += (data.dsize+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1);
+ indata.dptr = (unsigned char *)wr;
ret = ctdb_control(ctdb, destnode, 0,
CTDB_CONTROL_WRITE_RECORD, 0, indata,
return 0;
}
- case CTDB_CONTROL_WRITE_RECORD: {
- uint32_t dbid;
- struct ctdb_db_context *ctdb_db;
- unsigned char *ptr;
- TDB_DATA key, data;
- struct ctdb_ltdb_header header;
- int ret;
-
- outdata->dsize = 0;
- outdata->dptr = NULL;
-
- dbid = ((uint32_t *)(&indata.dptr[0]))[0];
- ctdb_db = find_ctdb_db(ctdb, dbid);
- if (!ctdb_db) {
- DEBUG(0,(__location__ " Unknown db 0x%08x\n",dbid));
- return -1;
- }
-
- ptr = &indata.dptr[4];
-
- key.dsize = *((uint32_t *)(ptr));
- ptr += 4;
- key.dptr = ptr;
- ptr += (key.dsize+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1);
-
- data.dsize = *((uint32_t *)(ptr));
- ptr += 4;
- data.dptr = ptr;
- ptr += (data.dsize+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1);
-
- ret = ctdb_ltdb_lock(ctdb_db, key);
- if (ret != 0) {
- DEBUG(0, (__location__ "Unable to lock db\n"));
- return -1;
- }
- ret = ctdb_ltdb_fetch(ctdb_db, key, &header, outdata, NULL);
- if (ret != 0) {
- DEBUG(0, (__location__ "Unable to fetch record\n"));
- ctdb_ltdb_unlock(ctdb_db, key);
- return -1;
- }
- header.rsn++;
-
- ret = ctdb_ltdb_store(ctdb_db, key, &header, data);
- if (ret != 0) {
- DEBUG(0, (__location__ "Unable to store record\n"));
- ctdb_ltdb_unlock(ctdb_db, key);
- return -1;
- }
- ctdb_ltdb_unlock(ctdb_db, key);
-
- return 0;
- }
+ case CTDB_CONTROL_WRITE_RECORD:
+ return ctdb_control_writerecord(ctdb, opcode, indata, outdata);
case CTDB_CONTROL_SET_RECMODE: {
ctdb->recovery_mode = ((uint32_t *)(&indata.dptr[0]))[0];
return 0;
}
+
+int
+ctdb_control_writerecord(struct ctdb_context *ctdb, uint32_t opcode, TDB_DATA indata, TDB_DATA *outdata)
+{
+ struct ctdb_write_record *wr;
+ struct ctdb_db_context *ctdb_db;
+ struct ctdb_ltdb_header header;
+ TDB_DATA key, data;
+ int ret;
+
+ outdata->dsize = 0;
+ outdata->dptr = NULL;
+
+ wr = (struct ctdb_write_record *)indata.dptr;
+
+ ctdb_db = find_ctdb_db(ctdb, wr->dbid);
+ if (!ctdb_db) {
+ DEBUG(0,(__location__ " Unknown db 0x%08x\n", wr->dbid));
+ return -1;
+ }
+
+ key.dsize = wr->keylen;
+ key.dptr = (unsigned char *)talloc_memdup(outdata, &wr->blob[0], wr->keylen);
+
+ data.dsize = wr->datalen;
+ data.dptr = (unsigned char *)talloc_memdup(outdata, &wr->blob[wr->keylen], wr->datalen);
+
+
+ ret = ctdb_ltdb_lock(ctdb_db, key);
+ if (ret != 0) {
+ DEBUG(0, (__location__ "Unable to lock db\n"));
+ return -1;
+ }
+ ret = ctdb_ltdb_fetch(ctdb_db, key, &header, outdata, NULL);
+ if (ret != 0) {
+ DEBUG(0, (__location__ "Unable to fetch record\n"));
+ ctdb_ltdb_unlock(ctdb_db, key);
+ return -1;
+ }
+ header.rsn++;
+
+ ret = ctdb_ltdb_store(ctdb_db, key, &header, data);
+ if (ret != 0) {
+ DEBUG(0, (__location__ "Unable to store record\n"));
+ ctdb_ltdb_unlock(ctdb_db, key);
+ return -1;
+ }
+ ctdb_ltdb_unlock(ctdb_db, key);
+
+ return 0;
+}
uint32_t map[1];
};
+/* a structure that contains the elements required for the write record
+ control
+*/
+struct ctdb_write_record {
+ uint32_t dbid;
+ uint32_t keylen;
+ uint32_t datalen;
+ unsigned char blob[1];
+};
+
/* main state of the ctdb daemon */
struct ctdb_context {
struct event_context *ev;
int ctdb_control_setvnnmap(struct ctdb_context *ctdb, uint32_t opcode, TDB_DATA indata, TDB_DATA *outdata);
int ctdb_control_getdbmap(struct ctdb_context *ctdb, uint32_t opcode, TDB_DATA indata, TDB_DATA *outdata);
int ctdb_control_getnodemap(struct ctdb_context *ctdb, uint32_t opcode, TDB_DATA indata, TDB_DATA *outdata);
+int ctdb_control_writerecord(struct ctdb_context *ctdb, uint32_t opcode, TDB_DATA indata, TDB_DATA *outdata);
#endif