}
/*
- Traverse a ctdb database. This uses a kind-of hackish way to open a second
- connection to ctdbd to avoid the hairy recursive and async problems with
- everything in-line.
+ Traverse a ctdb database. "conn" must be an otherwise unused
+ ctdb_connection where no other messages but the traverse ones are
+ expected.
*/
-int ctdbd_traverse(struct ctdbd_connection *master, uint32_t db_id,
+int ctdbd_traverse(struct ctdbd_connection *conn, uint32_t db_id,
void (*fn)(TDB_DATA key, TDB_DATA data,
void *private_data),
void *private_data)
{
- struct ctdbd_connection *conn;
int ret;
TDB_DATA key, data;
struct ctdb_traverse_start t;
int cstatus;
- become_root();
- ret = ctdbd_init_connection(NULL, master->sockname, master->timeout,
- &conn);
- unbecome_root();
- if (ret != 0) {
- DEBUG(0, ("ctdbd_init_connection failed: %s\n",
- strerror(ret)));
- return ret;
- }
-
t.db_id = db_id;
t.srvid = conn->rand_srvid;
t.reqid = ctdbd_next_reqid(conn);
*/
ret = EIO;
}
- TALLOC_FREE(conn);
return ret;
}
if (hdr->operation != CTDB_REQ_MESSAGE) {
DEBUG(0, ("Got operation %u, expected a message\n",
(unsigned)hdr->operation));
- TALLOC_FREE(conn);
return EIO;
}
if (m->datalen < sizeof(uint32_t) || m->datalen != d->length) {
DEBUG(0, ("Got invalid traverse data of length %d\n",
(int)m->datalen));
- TALLOC_FREE(conn);
return EIO;
}
if (key.dsize == 0 && data.dsize == 0) {
/* end of traverse */
- TALLOC_FREE(conn);
return 0;
}
if (data.dsize < sizeof(struct ctdb_ltdb_header)) {
DEBUG(0, ("Got invalid ltdb header length %d\n",
(int)data.dsize));
- TALLOC_FREE(conn);
return EIO;
}
data.dsize -= sizeof(struct ctdb_ltdb_header);
return traverse_persistent_callback(NULL, rec->key, rec->value, data);
}
+static int db_ctdbd_traverse(uint32_t db_id,
+ void (*fn)(TDB_DATA key, TDB_DATA data,
+ void *private_data),
+ void *private_data)
+{
+ struct ctdbd_connection *conn;
+ int ret;
+
+ become_root();
+ ret = ctdbd_init_connection(talloc_tos(), lp_ctdbd_socket(),
+ lp_ctdb_timeout(), &conn);
+ unbecome_root();
+ if (ret != 0) {
+ DBG_WARNING("ctdbd_init_connection failed: %s\n",
+ strerror(ret));
+ return ret;
+ }
+
+ ret = ctdbd_traverse(conn, db_id, fn, private_data);
+ TALLOC_FREE(conn);
+
+ if (ret != 0) {
+ DBG_WARNING("ctdbd_traverse failed: %s\n",
+ strerror(ret));
+ return ret;
+ }
+
+ return 0;
+}
+
static int db_ctdb_traverse(struct db_context *db,
int (*fn)(struct db_record *rec,
return ret;
}
- ret = ctdbd_traverse(messaging_ctdbd_connection(), ctx->db_id,
- traverse_callback, &state);
+ ret = db_ctdbd_traverse(ctx->db_id, traverse_callback, &state);
if (ret != 0) {
return -1;
}
return tdb_traverse_read(ctx->wtdb->tdb, traverse_persistent_callback_read, &state);
}
- ret = ctdbd_traverse(messaging_ctdbd_connection(), ctx->db_id,
- traverse_read_callback, &state);
+ ret = db_ctdbd_traverse(ctx->db_id, traverse_read_callback, &state);
if (ret != 0) {
return -1;
}