int ctdb_server_id_pull(uint8_t *buf, size_t buflen,
struct ctdb_server_id *out, size_t *npull);
-size_t ctdb_g_lock_len(struct ctdb_g_lock *lock);
-void ctdb_g_lock_push(struct ctdb_g_lock *lock, uint8_t *buf);
-int ctdb_g_lock_pull(uint8_t *buf, size_t buflen, struct ctdb_g_lock *lock);
+size_t ctdb_g_lock_len(struct ctdb_g_lock *in);
+void ctdb_g_lock_push(struct ctdb_g_lock *in, uint8_t *buf, size_t *npush);
+int ctdb_g_lock_pull(uint8_t *buf, size_t buflen, struct ctdb_g_lock *out,
+ size_t *npull);
size_t ctdb_g_lock_list_len(struct ctdb_g_lock_list *lock_list);
void ctdb_g_lock_list_push(struct ctdb_g_lock_list *lock_list, uint8_t *buf);
return 0;
}
-size_t ctdb_g_lock_len(struct ctdb_g_lock *lock)
+size_t ctdb_g_lock_len(struct ctdb_g_lock *in)
{
- return sizeof(struct ctdb_g_lock);
+ return ctdb_uint32_len(&in->type) +
+ ctdb_padding_len(4) +
+ ctdb_server_id_len(&in->sid);
}
-void ctdb_g_lock_push(struct ctdb_g_lock *lock, uint8_t *buf)
+void ctdb_g_lock_push(struct ctdb_g_lock *in, uint8_t *buf, size_t *npush)
{
- memcpy(buf, lock, sizeof(struct ctdb_g_lock));
+ size_t offset = 0, np;
+ uint32_t type;
+
+ type = in->type;
+ ctdb_uint32_push(&type, buf+offset, &np);
+ offset += np;
+
+ ctdb_padding_push(4, buf+offset, &np);
+ offset += np;
+
+ ctdb_server_id_push(&in->sid, buf+offset, &np);
+ offset += np;
+
+ *npush = offset;
}
-int ctdb_g_lock_pull(uint8_t *buf, size_t buflen, struct ctdb_g_lock *lock)
+int ctdb_g_lock_pull(uint8_t *buf, size_t buflen, struct ctdb_g_lock *out,
+ size_t *npull)
{
- if (buflen < sizeof(struct ctdb_g_lock)) {
- return EMSGSIZE;
+ size_t offset = 0, np;
+ int ret;
+ uint32_t type;
+
+ ret = ctdb_uint32_pull(buf+offset, buflen-offset, &type, &np);
+ if (ret != 0) {
+ return ret;
}
+ offset += np;
- memcpy(lock, buf, sizeof(struct ctdb_g_lock));
+ if (type == 0) {
+ out->type = CTDB_G_LOCK_READ;
+ } else if (type == 1) {
+ out->type = CTDB_G_LOCK_WRITE;
+ } else {
+ return EPROTO;
+ }
+
+ ret = ctdb_padding_pull(buf+offset, buflen-offset, 4, &np);
+ if (ret != 0) {
+ return ret;
+ }
+ offset += np;
+
+ ret = ctdb_server_id_pull(buf+offset, buflen-offset, &out->sid, &np);
+ if (ret != 0) {
+ return ret;
+ }
+ offset += np;
+
+ *npull = offset;
return 0;
}
void ctdb_g_lock_list_push(struct ctdb_g_lock_list *lock_list, uint8_t *buf)
{
- size_t offset = 0;
+ size_t offset = 0, np;
int i;
for (i=0; i<lock_list->num; i++) {
- ctdb_g_lock_push(&lock_list->lock[i], &buf[offset]);
- offset += sizeof(struct ctdb_g_lock);
+ ctdb_g_lock_push(&lock_list->lock[i], &buf[offset], &np);
+ offset += np;
}
}
{
struct ctdb_g_lock_list *lock_list;
unsigned count;
- size_t offset;
+ size_t offset, np;
int ret, i;
lock_list = talloc_zero(mem_ctx, struct ctdb_g_lock_list);
offset = 0;
for (i=0; i<count; i++) {
ret = ctdb_g_lock_pull(&buf[offset], buflen-offset,
- &lock_list->lock[i]);
+ &lock_list->lock[i], &np);
if (ret != 0) {
talloc_free(lock_list);
return ret;
}
- offset += sizeof(struct ctdb_g_lock);
+ offset += np;
}
lock_list->num = count;
assert(p1->unique_id == p2->unique_id);
}
-void fill_ctdb_g_lock(TALLOC_CTX *mem_ctx, struct ctdb_g_lock *p)
+void fill_ctdb_g_lock(struct ctdb_g_lock *p)
{
p->type = rand_int(2);
fill_ctdb_server_id(&p->sid);
p->lock = talloc_array(mem_ctx, struct ctdb_g_lock, p->num);
assert(p->lock != NULL);
for (i=0; i<p->num; i++) {
- fill_ctdb_g_lock(mem_ctx, &p->lock[i]);
+ fill_ctdb_g_lock(&p->lock[i]);
}
}
void verify_ctdb_server_id(struct ctdb_server_id *p1,
struct ctdb_server_id *p2);
-void fill_ctdb_g_lock(TALLOC_CTX *mem_ctx, struct ctdb_g_lock *p);
+void fill_ctdb_g_lock(struct ctdb_g_lock *p);
void verify_ctdb_g_lock(struct ctdb_g_lock *p1, struct ctdb_g_lock *p2);
void fill_ctdb_g_lock_list(TALLOC_CTX *mem_ctx, struct ctdb_g_lock_list *p);
return 0;
}
+static size_t ctdb_g_lock_len_old(struct ctdb_g_lock *in)
+{
+ return sizeof(struct ctdb_g_lock);
+}
+
+static void ctdb_g_lock_push_old(struct ctdb_g_lock *in, uint8_t *buf)
+{
+ memcpy(buf, in, sizeof(struct ctdb_g_lock));
+}
+
+static int ctdb_g_lock_pull_old(uint8_t *buf, size_t buflen,
+ struct ctdb_g_lock *out)
+{
+ if (buflen < sizeof(struct ctdb_g_lock)) {
+ return EMSGSIZE;
+ }
+
+ memcpy(out, buf, sizeof(struct ctdb_g_lock));
+ return 0;
+}
+
COMPAT_TYPE3_TEST(struct ctdb_statistics, ctdb_statistics);
COMPAT_TYPE3_TEST(struct ctdb_vnn_map, ctdb_vnn_map);
COMPAT_TYPE3_TEST(struct ctdb_disable_message, ctdb_disable_message);
COMPAT_TYPE1_TEST(struct ctdb_server_id, ctdb_server_id);
+COMPAT_TYPE1_TEST(struct ctdb_g_lock, ctdb_g_lock);
int main(int argc, char *argv[])
{
COMPAT_TEST_FUNC(ctdb_srvid_message)();
COMPAT_TEST_FUNC(ctdb_disable_message)();
COMPAT_TEST_FUNC(ctdb_server_id)();
+ COMPAT_TEST_FUNC(ctdb_g_lock)();
return 0;
}
PROTOCOL_TYPE2_TEST(TDB_DATA, ctdb_tdb_datan);
PROTOCOL_TYPE1_TEST(struct ctdb_latency_counter, ctdb_latency_counter);
-static void test_ctdb_g_lock(void)
-{
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
- struct ctdb_g_lock p1, p2;
- size_t buflen;
- int ret;
-
- fill_ctdb_g_lock(mem_ctx, &p1);
- buflen = ctdb_g_lock_len(&p1);
- ctdb_g_lock_push(&p1, BUFFER);
- ret = ctdb_g_lock_pull(BUFFER, buflen, &p2);
- assert(ret == 0);
- verify_ctdb_g_lock(&p1, &p2);
- talloc_free(mem_ctx);
-}
-
PROTOCOL_TYPE3_TEST(struct ctdb_statistics, ctdb_statistics);
PROTOCOL_TYPE3_TEST(struct ctdb_vnn_map, ctdb_vnn_map);
PROTOCOL_TYPE3_TEST(struct ctdb_dbid, ctdb_dbid);
PROTOCOL_TYPE3_TEST(struct ctdb_srvid_message, ctdb_srvid_message);
PROTOCOL_TYPE3_TEST(struct ctdb_disable_message, ctdb_disable_message);
PROTOCOL_TYPE1_TEST(struct ctdb_server_id, ctdb_server_id);
+PROTOCOL_TYPE1_TEST(struct ctdb_g_lock, ctdb_g_lock);
DEFINE_TEST(struct ctdb_g_lock_list, ctdb_g_lock_list);
static void test_ctdb_rec_buffer_read_write(void)
TEST_FUNC(ctdb_tdb_data)();
TEST_FUNC(ctdb_tdb_datan)();
TEST_FUNC(ctdb_latency_counter)();
- test_ctdb_g_lock();
TEST_FUNC(ctdb_statistics)();
TEST_FUNC(ctdb_vnn_map)();
TEST_FUNC(ctdb_srvid_message)();
TEST_FUNC(ctdb_disable_message)();
TEST_FUNC(ctdb_server_id)();
+ TEST_FUNC(ctdb_g_lock)();
TEST_FUNC(ctdb_g_lock_list)();
test_ctdb_rec_buffer_read_write();