static void arithmetic_response_handler(lcb_server_t *server, struct lcb_command_data_st *command_data, protocol_binary_response_header *res) { lcb_t root = server->instance; lcb_uint16_t status = ntohs(res->response.status); lcb_error_t rc = map_error(root, status); char *packet; lcb_uint16_t nkey; const char *key = get_key(server, &nkey, &packet); lcb_arithmetic_resp_t resp; lcb_uint64_t value = 0; if (key == NULL) { lcb_error_handler(server->instance, LCB_EINTERNAL, NULL); return ; } if (status == PROTOCOL_BINARY_RESPONSE_SUCCESS) { memcpy(&value, res + 1, sizeof(value)); value = ntohll(value); } setup_lcb_arithmetic_resp_t(&resp, key, nkey, value, res->response.cas); TRACE_ARITHMETIC_END(res->response.opaque, command_data->vbucket, res->response.opcode, rc, &resp); root->callbacks.arithmetic(root, command_data->cookie, rc, &resp); release_key(server, packet); }
static void H_arithmetic(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response, lcb_error_t immerr) { lcb_t root = pipeline->parent->cqdata; lcb_RESPCOUNTER resp = { 0 }; init_resp3(root, response, request, immerr, (lcb_RESPBASE*)&resp); if (resp.rc == LCB_SUCCESS) { memcpy(&resp.value, PACKET_VALUE(response), sizeof(resp.value)); resp.value = lcb_ntohll(resp.value); handle_synctoken(root, response, request, &resp.synctoken); } resp.cas = PACKET_CAS(response); TRACE_ARITHMETIC_END(response, &resp); INVOKE_CALLBACK3(request, &resp, root, LCB_CALLBACK_COUNTER); }
static void H_arithmetic(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response, lcb_error_t immerr) { lcb_t root = pipeline->parent->cqdata; respack_COUNTER w = { { 0 } }; init_resp3(root, response, request, immerr, (lcb_RESPBASE*)&w.resp); if (w.resp.rc == LCB_SUCCESS) { memcpy(&w.resp.value, PACKET_VALUE(response), sizeof(w.resp.value)); w.resp.value = lcb_ntohll(w.resp.value); w.resp.rflags |= LCB_RESP_F_EXTDATA; handle_mutation_token(root, response, request, &w.mt); } w.resp.cas = PACKET_CAS(response); TRACE_ARITHMETIC_END(response, &w.resp); INVOKE_CALLBACK3(request, &w.resp, root, LCB_CALLBACK_COUNTER); }
static void failout_single_request(lcb_server_t *server, protocol_binary_request_header *req, struct lcb_command_data_st *ct, lcb_error_t error, const void *keyptr, lcb_size_t nkey, const void *packet) { lcb_t root = server->instance; union { lcb_get_resp_t get; lcb_store_resp_t store; lcb_remove_resp_t remove; lcb_touch_resp_t touch; lcb_unlock_resp_t unlock; lcb_arithmetic_resp_t arithmetic; lcb_observe_resp_t observe; lcb_server_stat_resp_t stats; lcb_server_version_resp_t versions; lcb_verbosity_resp_t verbosity; lcb_flush_resp_t flush; } resp; switch (req->request.opcode) { case PROTOCOL_BINARY_CMD_NOOP: break; case CMD_GET_LOCKED: case PROTOCOL_BINARY_CMD_GAT: case PROTOCOL_BINARY_CMD_GATQ: case PROTOCOL_BINARY_CMD_GET: case PROTOCOL_BINARY_CMD_GETQ: setup_lcb_get_resp_t(&resp.get, keyptr, nkey, NULL, 0, 0, 0, 0); TRACE_GET_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.get); root->callbacks.get(root, ct->cookie, error, &resp.get); break; case CMD_UNLOCK_KEY: setup_lcb_unlock_resp_t(&resp.unlock, keyptr, nkey); TRACE_UNLOCK_END(req->request.opaque, ntohs(req->request.vbucket), error, &resp.unlock); root->callbacks.unlock(root, ct->cookie, error, &resp.unlock); break; case PROTOCOL_BINARY_CMD_FLUSH: setup_lcb_flush_resp_t(&resp.flush, server->authority); TRACE_FLUSH_PROGRESS(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.flush); root->callbacks.flush(root, ct->cookie, error, &resp.flush); if (lcb_lookup_server_with_command(root, PROTOCOL_BINARY_CMD_FLUSH, req->request.opaque, server) < 0) { setup_lcb_flush_resp_t(&resp.flush, NULL); TRACE_FLUSH_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error); root->callbacks.flush(root, ct->cookie, error, &resp.flush); } break; case PROTOCOL_BINARY_CMD_ADD: setup_lcb_store_resp_t(&resp.store, keyptr, nkey, 0); TRACE_STORE_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.store); root->callbacks.store(root, ct->cookie, LCB_ADD, error, &resp.store); break; case PROTOCOL_BINARY_CMD_REPLACE: setup_lcb_store_resp_t(&resp.store, keyptr, nkey, 0); TRACE_STORE_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.store); root->callbacks.store(root, ct->cookie, LCB_REPLACE, error, &resp.store); break; case PROTOCOL_BINARY_CMD_SET: setup_lcb_store_resp_t(&resp.store, keyptr, nkey, 0); TRACE_STORE_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.store); root->callbacks.store(root, ct->cookie, LCB_SET, error, &resp.store); break; case PROTOCOL_BINARY_CMD_APPEND: setup_lcb_store_resp_t(&resp.store, keyptr, nkey, 0); TRACE_STORE_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.store); root->callbacks.store(root, ct->cookie, LCB_APPEND, error, &resp.store); break; case PROTOCOL_BINARY_CMD_PREPEND: setup_lcb_store_resp_t(&resp.store, keyptr, nkey, 0); TRACE_STORE_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.store); root->callbacks.store(root, ct->cookie, LCB_PREPEND, error, &resp.store); break; case PROTOCOL_BINARY_CMD_DELETE: setup_lcb_remove_resp_t(&resp.remove, keyptr, nkey, 0); TRACE_REMOVE_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.remove); root->callbacks.remove(root, ct->cookie, error, &resp.remove); break; case PROTOCOL_BINARY_CMD_INCREMENT: case PROTOCOL_BINARY_CMD_DECREMENT: setup_lcb_arithmetic_resp_t(&resp.arithmetic, keyptr, nkey, 0, 0); TRACE_ARITHMETIC_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.arithmetic); root->callbacks.arithmetic(root, ct->cookie, error, &resp.arithmetic); break; case PROTOCOL_BINARY_CMD_SASL_LIST_MECHS: case PROTOCOL_BINARY_CMD_SASL_AUTH: case PROTOCOL_BINARY_CMD_SASL_STEP: /* no need to notify user about these commands */ break; case PROTOCOL_BINARY_CMD_TOUCH: setup_lcb_touch_resp_t(&resp.touch, keyptr, nkey, 0); TRACE_TOUCH_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.touch); root->callbacks.touch(root, ct->cookie, error, &resp.touch); break; case PROTOCOL_BINARY_CMD_STAT: setup_lcb_server_stat_resp_t(&resp.stats, server->authority, NULL, 0, NULL, 0); TRACE_STATS_PROGRESS(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.stats); root->callbacks.stat(root, ct->cookie, error, &resp.stats); if (lcb_lookup_server_with_command(root, PROTOCOL_BINARY_CMD_STAT, req->request.opaque, server) < 0) { setup_lcb_server_stat_resp_t(&resp.stats, NULL, NULL, 0, NULL, 0); TRACE_STATS_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error); root->callbacks.stat(root, ct->cookie, error, &resp.stats); } break; case PROTOCOL_BINARY_CMD_VERBOSITY: setup_lcb_verbosity_resp_t(&resp.verbosity, server->authority); TRACE_VERBOSITY_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.verbosity); root->callbacks.verbosity(root, ct->cookie, error, &resp.verbosity); if (lcb_lookup_server_with_command(root, PROTOCOL_BINARY_CMD_VERBOSITY, req->request.opaque, server) < 0) { setup_lcb_verbosity_resp_t(&resp.verbosity, NULL); TRACE_VERBOSITY_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.verbosity); root->callbacks.verbosity(root, ct->cookie, error, &resp.verbosity); } break; case PROTOCOL_BINARY_CMD_VERSION: setup_lcb_server_version_resp_t(&resp.versions, server->authority, NULL, 0); TRACE_VERSIONS_PROGRESS(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error, &resp.versions); root->callbacks.version(root, ct->cookie, error, &resp.versions); if (lcb_lookup_server_with_command(root, PROTOCOL_BINARY_CMD_VERSION, req->request.opaque, server) < 0) { TRACE_VERSIONS_END(req->request.opaque, ntohs(req->request.vbucket), req->request.opcode, error); setup_lcb_server_version_resp_t(&resp.versions, NULL, NULL, 0); root->callbacks.version(root, ct->cookie, error, &resp.versions); } break; case CMD_OBSERVE: lcb_failout_observe_request(server, ct, packet, sizeof(req->bytes) + ntohl(req->request.bodylen), error); break; case CMD_GET_CLUSTER_CONFIG: lcb_cccp_update2(ct->cookie, error, NULL, 0, NULL); break; case PROTOCOL_BINARY_CMD_HELLO: lcb_cccp_update2(ct->cookie, error, NULL, 0, NULL); break; case PROTOCOL_BINARY_CMD_COMPACTDB: lcb_cccp_update2(ct->cookie, error, NULL, 0, NULL); break; default: lcb_assert("unexpected opcode while purging the server" && 0); } }