From: Ronnie sahlberg Date: Tue, 17 Apr 2007 01:48:27 +0000 (+1000) Subject: remaning code to finish lock_fetch/store_unlock clientside helpers X-Git-Tag: tevent-0.9.20~348^2~2907^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=45660a3c48d182e8871b8ae5d1d35603967f3fd6;p=thirdparty%2Fsamba.git remaning code to finish lock_fetch/store_unlock clientside helpers (This used to be ctdb commit edf1e1fea8500461a08cd2795251a5cc0bd10229) --- 45660a3c48d182e8871b8ae5d1d35603967f3fd6 diff --cc ctdb/common/ctdb_client.c index 6414c224180,5a335c0b946..7822d8595f1 --- a/ctdb/common/ctdb_client.c +++ b/ctdb/common/ctdb_client.c @@@ -536,53 -641,22 +536,67 @@@ struct ctdb_record_handle *ctdb_client_ { struct ctdb_call_state *state; struct ctdb_record_handle *rec; + struct ctdb_ltdb_header header; + int ret; + + ret = ctdb_ltdb_lock(ctdb_db, key); + if (ret != 0) { + printf("failed to lock ltdb record\n"); + return NULL; + } + - ret = ctdb_ltdb_fetch(ctdb_db, key, &header, ctdb_db, &data); ++ ret = ctdb_ltdb_fetch(ctdb_db, key, &header, ctdb_db, data); + if (ret != 0) { + ctdb_ltdb_unlock(ctdb_db, key); + return NULL; + } - state = ctdb_client_fetch_lock_send(ctdb_db, mem_ctx, key); - rec = ctdb_client_fetch_lock_recv(state, mem_ctx, key, data); - if (header.dmaster != ctdb->vnn) { ++ if (header.dmaster != ctdb_db->ctdb->vnn) { + state = ctdb_client_fetch_lock_send(ctdb_db, mem_ctx, key); + rec = ctdb_client_fetch_lock_recv(state, mem_ctx, key, data); + return rec; + } + ++ rec = talloc(mem_ctx, struct ctdb_record_handle); ++ CTDB_NO_MEMORY_NULL(ctdb_db->ctdb, rec); ++ ++ rec->ctdb_db = state->ctdb_db; ++ rec->key = key; ++ rec->key.dptr = talloc_memdup(rec, key.dptr, key.dsize); ++ rec->data = talloc(rec, TDB_DATA); ++ rec->data->dsize = state->call.reply_data.dsize; ++ rec->data->dptr = talloc_memdup(rec, state->call.reply_data.dptr, rec->data->dsize); ++ ++ if (data) { ++ *data = *rec->data; ++ } + return rec; } +/* + a helper function for the client that will store the new data for the + record and release the tdb chainlock +*/ int ctdb_client_store_unlock(struct ctdb_record_handle *rec, TDB_DATA data) { - struct ctdb_call_state *state; - int res; + int ret; + struct ctdb_ltdb_header header; + struct ctdb_db_context *ctdb_db = talloc_get_type(rec->ctdb_db, struct ctdb_db_context); - state = ctdb_client_store_unlock_send(rec, rec, data); - res = ctdb_client_store_unlock_recv(state, rec); + /* should be avoided if possible hang header off rec ? */ + ret = ctdb_ltdb_fetch(rec->ctdb_db, rec->key, &header, NULL, NULL); + if (ret) { + ctdb_set_error(rec->ctdb_db->ctdb, "Fetch of locally held record failed"); + talloc_free(rec); + return ret; + } + + ret = ctdb_ltdb_store(ctdb_db, rec->key, &header, data); + ctdb_ltdb_unlock(ctdb_db, rec->key); + talloc_free(rec); - return res; + return ret; }