]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
remaning code to finish lock_fetch/store_unlock clientside helpers
authorRonnie sahlberg <ronniesahlberg@gmail.com>
Tue, 17 Apr 2007 01:48:27 +0000 (11:48 +1000)
committerRonnie sahlberg <ronniesahlberg@gmail.com>
Tue, 17 Apr 2007 01:48:27 +0000 (11:48 +1000)
(This used to be ctdb commit edf1e1fea8500461a08cd2795251a5cc0bd10229)

1  2 
ctdb/common/ctdb_client.c
ctdb/common/ctdb_daemon.c

index 6414c2241802ef31e9d2eba84bde6669efac0c92,5a335c0b9468c188a791cad7d64113e22670cf35..7822d8595f1a792c2cf24d64ca1cfd487d374571
@@@ -536,53 -641,22 +536,67 @@@ struct ctdb_record_handle *ctdb_client_
  {
        struct ctdb_call_state *state;
        struct ctdb_record_handle *rec;
-       ret = ctdb_ltdb_fetch(ctdb_db, key, &header, ctdb_db, &data);
 +      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);
 +      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;
  }
Simple merge