From 48d95e8569d0db61addc0b4a21f999c0de11ec8a Mon Sep 17 00:00:00 2001 From: arches Date: Thu, 7 Jul 2016 05:39:52 -0400 Subject: [PATCH] Use prev_kv --- v3/src/AsyncCompareAndSwapAction.cpp | 4 +++- v3/src/AsyncSetAction.cpp | 13 +++++++------ v3/src/AsyncTxnResponse.cpp | 16 +++++++++------- v3/src/AsyncUpdateAction.cpp | 14 +++++++++++--- v3/src/AsyncWatchResponse.cpp | 9 +++------ v3/src/Transaction.cpp | 21 ++++++--------------- 6 files changed, 39 insertions(+), 38 deletions(-) diff --git a/v3/src/AsyncCompareAndSwapAction.cpp b/v3/src/AsyncCompareAndSwapAction.cpp index 61f9830..9a863cb 100644 --- a/v3/src/AsyncCompareAndSwapAction.cpp +++ b/v3/src/AsyncCompareAndSwapAction.cpp @@ -45,7 +45,9 @@ etcdv3::AsyncTxnResponse etcdv3::AsyncCompareAndSwapAction::ParseResponse() txn_resp.ParseResponse(); txn_resp.action = etcdv3::COMPARESWAP_ACTION; - if(!reply.succeeded()) + //if there is an error code returned by parseResponse, we must + //not overwrite it. + if(!reply.succeeded() && !txn_resp.error_code) { txn_resp.error_code=101; txn_resp.error_message="Compare failed"; diff --git a/v3/src/AsyncSetAction.cpp b/v3/src/AsyncSetAction.cpp index e4707ce..c693468 100644 --- a/v3/src/AsyncSetAction.cpp +++ b/v3/src/AsyncSetAction.cpp @@ -15,19 +15,20 @@ etcdv3::AsyncSetAction::AsyncSetAction(etcdv3::ActionParameters param, bool crea { etcdv3::Transaction transaction(parameters.key); isCreate = create; + transaction.init_compare(Compare::CompareResult::Compare_CompareResult_EQUAL, + Compare::CompareTarget::Compare_CompareTarget_VERSION); + + transaction.setup_basic_create_sequence(parameters.key, parameters.value); if(isCreate) { - transaction.init_compare(Compare::CompareResult::Compare_CompareResult_EQUAL, - Compare::CompareTarget::Compare_CompareTarget_VERSION); + transaction.setup_basic_failure_operation(parameters.key); - transaction.setup_basic_create_sequence(parameters.key, parameters.value); + //transaction.setup_basic_create_sequence(parameters.key, parameters.value); } else { - transaction.init_compare(Compare::CompareResult::Compare_CompareResult_EQUAL, - Compare::CompareTarget::Compare_CompareTarget_VERSION); transaction.setup_set_failure_operation(parameters.key, parameters.value); - transaction.setup_basic_create_sequence(parameters.key, parameters.value); + //transaction.setup_basic_create_sequence(parameters.key, parameters.value); } response_reader = parameters.kv_stub->AsyncTxn(&context, transaction.txn_request, &cq_); response_reader->Finish(&reply, &status, (void*)this); diff --git a/v3/src/AsyncTxnResponse.cpp b/v3/src/AsyncTxnResponse.cpp index 53170f5..90b68e1 100644 --- a/v3/src/AsyncTxnResponse.cpp +++ b/v3/src/AsyncTxnResponse.cpp @@ -45,19 +45,21 @@ void etcdv3::AsyncTxnResponse::ParseResponse() error_code = response.error_code; error_message = response.error_message; - + if(!response.values.empty()) { - prev_range_kvs=range_kvs; - range_kvs = response.values; + values.insert(values.end(), response.values.begin(),response.values.end()); } } - else if(ResponseOp::ResponseCase::kResponseDeleteRange == resp.response_case()) + else if(ResponseOp::ResponseCase::kResponsePut == resp.response_case()) { - std::cout << "number of deleted keys: " << resp.response_delete_range().deleted() <AsyncTxn(&context, transaction.txn_request, &cq_); @@ -35,8 +34,17 @@ etcdv3::AsyncTxnResponse etcdv3::AsyncUpdateAction::ParseResponse() } else { - txn_resp.ParseResponse(); - txn_resp.action = etcdv3::UPDATE_ACTION; + if(reply.succeeded()) + { + txn_resp.ParseResponse(); + txn_resp.action = etcdv3::UPDATE_ACTION; + } + else + { + txn_resp.error_code = 100; + txn_resp.error_message = "Key not found"; + } + } return txn_resp; } diff --git a/v3/src/AsyncWatchResponse.cpp b/v3/src/AsyncWatchResponse.cpp index c0497b7..6ed15cc 100644 --- a/v3/src/AsyncWatchResponse.cpp +++ b/v3/src/AsyncWatchResponse.cpp @@ -36,7 +36,6 @@ void etcdv3::AsyncWatchResponse::ParseResponse() index = reply.header().revision(); std::map mapValue; std::map mapPrevValue; - std::cout << "events size: " << reply.events_size() < get_request(new RangeRequest()); - get_request->set_key(key); - RequestOp* req_failure = txn_request.add_failure(); - req_failure->set_allocated_request_range(get_request.release()); - std::unique_ptr put_request(new PutRequest()); put_request->set_key(key); put_request->set_value(value); - req_failure = txn_request.add_failure(); + put_request->set_prev_kv(true); + RequestOp* req_failure = txn_request.add_failure(); req_failure->set_allocated_request_put(put_request.release()); - get_request.reset(new RangeRequest()); + std::unique_ptr get_request(new RangeRequest()); get_request->set_key(key); req_failure = txn_request.add_failure(); req_failure->set_allocated_request_range(get_request.release()); @@ -117,19 +113,14 @@ void etcdv3::Transaction::setup_basic_create_sequence(std::string const& key, st * get key value then modify and get new value */ void etcdv3::Transaction::setup_compare_and_swap_sequence(std::string const& value) { - std::unique_ptr get_request(new RangeRequest()); - get_request.reset(new RangeRequest()); - get_request->set_key(key); - RequestOp* req_success = txn_request.add_success(); - req_success->set_allocated_request_range(get_request.release()); - std::unique_ptr put_request(new PutRequest()); put_request->set_key(key); put_request->set_value(value); - req_success = txn_request.add_success(); + put_request->set_prev_kv(true); + RequestOp* req_success = txn_request.add_success(); req_success->set_allocated_request_put(put_request.release()); - get_request.reset(new RangeRequest()); + std::unique_ptr get_request(new RangeRequest()); get_request->set_key(key); req_success = txn_request.add_success(); req_success->set_allocated_request_range(get_request.release());