status = ctdb_client_control_recv(subreq, &ret, state, &reply);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR,
+ ("set_db_flags: 0x%08x GET_NODEMAP failed, ret=%d\n",
+ state->db_id, ret));
tevent_req_error(req, ret);
return;
}
ret = ctdb_reply_control_get_nodemap(reply, state, &nodemap);
talloc_free(reply);
if (ret != 0) {
+ DEBUG(DEBUG_ERR,
+ ("set_db_flags: 0x%08x GET_NODEMAP parse failed, ret=%d\n",
+ state->db_id, ret));
tevent_req_error(req, ret);
return;
}
state, &state->pnn_list);
talloc_free(nodemap);
if (state->count <= 0) {
+ DEBUG(DEBUG_ERR,
+ ("set_db_flags: 0x%08x no connected nodes, count=%d\n",
+ state->db_id, state->count));
tevent_req_error(req, ENOMEM);
return;
}
NULL);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR,
+ ("set_db_flags: 0x%08x SET_DB_READONLY failed, ret=%d\n",
+ state->db_id, ret));
tevent_req_error(req, ret);
return;
}
NULL);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR,
+ ("set_db_flags: 0x%08x SET_DB_STICKY failed, ret=%d\n",
+ state->db_id, ret));
tevent_req_error(req, ret);
return;
}
status = ctdb_client_control_recv(subreq, &ret, state, &reply);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR, ("attach: %s GET_TUNABLE failed, ret=%d\n",
+ state->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
status = ctdb_client_control_recv(subreq, &ret, state, &reply);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR, ("attach: %s %s failed, ret=%d\n",
+ state->db->db_name,
+ (state->db->persistent
+ ? "DB_ATTACH_PERSISTENT"
+ : "DB_ATTACH"),
+ ret));
tevent_req_error(req, ret);
return;
}
}
talloc_free(reply);
if (ret != 0) {
+ DEBUG(DEBUG_ERR, ("attach: %s failed to get db_id, ret=%d\n",
+ state->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
status = ctdb_client_control_recv(subreq, &ret, state, &reply);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR, ("attach: %s GETDBPATH failed, ret=%d\n",
+ state->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
&state->db->db_path);
talloc_free(reply);
if (ret != 0) {
+ DEBUG(DEBUG_ERR, ("attach: %s GETDBPATH parse failed, ret=%d\n",
+ state->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
status = ctdb_client_control_recv(subreq, &ret, state, &reply);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR, ("attach: %s DB_GET_HEALTH failed, ret=%d\n",
+ state->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
ret = ctdb_reply_control_db_get_health(reply, state, &reason);
if (ret != 0) {
+ DEBUG(DEBUG_ERR,
+ ("attach: %s DB_GET_HEALTH parse failed, ret=%d\n",
+ state->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
if (reason != NULL) {
/* Database unhealthy, avoid attach */
- /* FIXME: Log here */
+ DEBUG(DEBUG_ERR, ("attach: %s database unhealthy (%s)\n",
+ state->db->db_name, reason));
tevent_req_error(req, EIO);
return;
}
status = ctdb_set_db_flags_recv(subreq, &ret);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR, ("attach: %s set db flags 0x%08x failed\n",
+ state->db->db_name, state->db_flags));
tevent_req_error(req, ret);
return;
}
state->db->ltdb = tdb_wrap_open(state->db, state->db->db_path, 0,
state->tdb_flags, O_RDWR, 0);
if (tevent_req_nomem(state->db->ltdb, req)) {
+ DEBUG(DEBUG_ERR, ("attach: %s tdb_wrap_open failed\n",
+ state->db->db_name));
return;
}
DLIST_ADD(state->client->db, state->db);
/* Check that database is not persistent */
if (db->persistent) {
+ DEBUG(DEBUG_ERR, ("fetch_lock: %s database not volatile\n",
+ db->db_name));
tevent_req_error(req, EINVAL);
return tevent_req_post(req, ev);
}
int ret, err = 0;
bool do_migrate = false;
- ret = tdb_chainlock(state->h->db->ltdb->tdb, state->h->key);
+ ret = tdb_chainlock(h->db->ltdb->tdb, h->key);
if (ret != 0) {
+ DEBUG(DEBUG_ERR,
+ ("fetch_lock: %s tdb_chainlock failed, %s\n",
+ h->db->db_name, tdb_errorstr(h->db->ltdb->tdb)));
err = EIO;
goto failed;
}
}
ret = tdb_chainunlock(h->db->ltdb->tdb, h->key);
if (ret != 0) {
- DEBUG(DEBUG_ERR, ("tdb_chainunlock failed on %s\n",
- h->db->db_name));
+ DEBUG(DEBUG_ERR,
+ ("fetch_lock: %s tdb_chainunlock failed, %s\n",
+ h->db->db_name, tdb_errorstr(h->db->ltdb->tdb)));
return EIO;
}
status = ctdb_client_call_recv(subreq, state, &reply, &ret);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR, ("fetch_lock: %s CALL failed, ret=%d\n",
+ state->h->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
static int ctdb_record_handle_destructor(struct ctdb_record_handle *h)
{
- tdb_chainunlock(h->db->ltdb->tdb, h->key);
+ int ret;
+
+ ret = tdb_chainunlock(h->db->ltdb->tdb, h->key);
+ if (ret != 0) {
+ DEBUG(DEBUG_ERR,
+ ("fetch_lock: %s tdb_chainunlock failed, %s\n",
+ h->db->db_name, tdb_errorstr(h->db->ltdb->tdb)));
+ }
free(h->data.dptr);
return 0;
}
if (tevent_req_is_unix_error(req, &err)) {
if (perr != NULL) {
+ TALLOC_FREE(state->h);
*perr = err;
}
return NULL;
ret = tdb_store(h->db->ltdb->tdb, h->key, rec, TDB_REPLACE);
if (ret != 0) {
- DEBUG(DEBUG_ERR, ("Failed to store record in DB %s\n",
- h->db->db_name));
+ DEBUG(DEBUG_ERR,
+ ("store_record: %s tdb_store failed, %s\n",
+ h->db->db_name, tdb_errorstr(h->db->ltdb->tdb)));
return EIO;
}
/* Cannot delete the record if it was obtained as a readonly copy */
if (h->readonly) {
+ DEBUG(DEBUG_ERR, ("fetch_lock delete: %s readonly record\n",
+ h->db->db_name));
tevent_req_error(req, EINVAL);
return tevent_req_post(req, ev);
}
ret = tdb_store(h->db->ltdb->tdb, h->key, rec, TDB_REPLACE);
talloc_free(rec.dptr);
if (ret != 0) {
- DEBUG(DEBUG_ERR, ("Failed to delete record in DB %s\n",
- h->db->db_name));
+ DEBUG(DEBUG_ERR,
+ ("fetch_lock delete: %s tdb_sore failed, %s\n",
+ h->db->db_name, tdb_errorstr(h->db->ltdb->tdb)));
tevent_req_error(req, EIO);
return tevent_req_post(req, ev);
}
state->h = ctdb_fetch_lock_recv(subreq, NULL, state, &data, &ret);
TALLOC_FREE(subreq);
if (state->h == NULL) {
+ DEBUG(DEBUG_ERR, ("g_lock_lock: %s fetch lock failed\n",
+ (char *)state->key.dptr));
tevent_req_error(req, ret);
return;
}
&state->lock_list);
talloc_free(data.dptr);
if (ret != 0) {
+ DEBUG(DEBUG_ERR, ("g_lock_lock: %s invalid lock data\n",
+ (char *)state->key.dptr));
tevent_req_error(req, ret);
return;
}
/* We should not ask for the same lock more than once */
if (ctdb_server_id_equal(&lock->sid, &state->my_sid)) {
+ DEBUG(DEBUG_ERR, ("g_lock_lock: %s deadlock\n",
+ (char *)state->key.dptr));
tevent_req_error(req, EDEADLK);
return;
}
status = ctdb_client_control_recv(subreq, &ret, state, &reply);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR,
+ ("g_lock_lock: %s PROCESS_EXISTS failed, ret=%d\n",
+ (char *)state->key.dptr, ret));
tevent_req_error(req, ret);
return;
}
state->h = ctdb_fetch_lock_recv(subreq, NULL, state, &data, &ret);
TALLOC_FREE(subreq);
if (state->h == NULL) {
+ DEBUG(DEBUG_ERR, ("g_lock_unlock: %s fetch lock failed\n",
+ (char *)state->key.dptr));
tevent_req_error(req, ret);
return;
}
ret = ctdb_g_lock_list_pull(data.dptr, data.dsize, state,
&state->lock_list);
if (ret != 0) {
+ DEBUG(DEBUG_ERR, ("g_lock_unlock: %s invalid lock data\n",
+ (char *)state->key.dptr));
tevent_req_error(req, ret);
return;
}
status = ctdb_attach_recv(subreq, &ret, &state->h->db_g_lock);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR,
+ ("transaction_start: %s attach g_lock.tdb failed\n",
+ state->h->db->db_name));
tevent_req_error(req, ret);
return;
}
{
struct tevent_req *req = tevent_req_callback_data(
subreq, struct tevent_req);
+ struct ctdb_transaction_start_state *state = tevent_req_data(
+ req, struct ctdb_transaction_start_state);
int ret;
bool status;
status = ctdb_g_lock_lock_recv(subreq, &ret);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR,
+ ("transaction_start: %s g_lock lock failed, ret=%d\n",
+ state->h->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
{
struct ctdb_transaction_start_state *state = tevent_req_data(
req, struct ctdb_transaction_start_state);
- struct ctdb_transaction_handle *h = state->h;
int err;
if (tevent_req_is_unix_error(req, &err)) {
return NULL;
}
- return h;
+ return state->h;
}
int ctdb_transaction_start(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
ret = ctdb_ltdb_header_extract(&data, &state->header);
if (ret != 0) {
- DEBUG(DEBUG_ERR, ("Failed to extract header\n"));
+ DEBUG(DEBUG_ERR,
+ ("record_fetch: Failed to extract header, "
+ "ret=%d\n", ret));
return 1;
}
status = ctdb_client_control_recv(subreq, &ret, state, &reply);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR,
+ ("transaction_commit: %s TRANS3_COMMIT failed, ret=%d\n",
+ h->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
}
if (seqnum != state->seqnum + 1) {
+ DEBUG(DEBUG_ERR,
+ ("transaction_commit: %s seqnum mismatch "
+ "0x%"PRIx64" != 0x%"PRIx64" + 1\n",
+ state->h->db->db_name, seqnum, state->seqnum));
tevent_req_error(req, EIO);
return;
}
status = ctdb_g_lock_unlock_recv(subreq, &ret);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR,
+ ("transaction_commit: %s g_lock unlock failed, ret=%d\n",
+ state->h->db->db_name, ret));
tevent_req_error(req, ret);
return;
}
status = ctdb_g_lock_unlock_recv(subreq, &ret);
TALLOC_FREE(subreq);
if (! status) {
+ DEBUG(DEBUG_ERR,
+ ("transaction_cancel: %s g_lock unlock failed, ret=%d\n",
+ state->h->db->db_name, ret));
tevent_req_error(req, ret);
return;
}