diff --git a/memcached.c b/memcached.c index 75a6957ac..0c129286c 100644 --- a/memcached.c +++ b/memcached.c @@ -3212,17 +3212,12 @@ static void complete_update_ascii(conn *c) } item *it = c->item; + ENGINE_ERROR_CODE ret; if (!mc_engine.v1->get_item_info(mc_engine.v0, c, it, &c->hinfo)) { - mc_engine.v1->release(mc_engine.v0, c, it); mc_logger->log(EXTENSION_LOG_WARNING, c, "%d: Failed to get item info\n", c->sfd); - out_string(c, "SERVER_ERROR failed to get item details"); - return; - } - - ENGINE_ERROR_CODE ret; - if (hinfo_check_ascii_tail_string(&c->hinfo) != 0) { /* check "\r\n" */ - out_string(c, "CLIENT_ERROR bad data chunk"); + ret = ENGINE_ENOMEM; + } else if (hinfo_check_ascii_tail_string(&c->hinfo) != 0) { /* check "\r\n" */ ret = ENGINE_EBADVALUE; } else { ret = mc_engine.v1->store(mc_engine.v0, c, it, &c->cas, c->store_op, 0); @@ -3254,49 +3249,52 @@ static void complete_update_ascii(conn *c) break; } #endif - - switch (ret) { - case ENGINE_SUCCESS: - out_string(c, "STORED"); - break; - case ENGINE_KEY_EEXISTS: - out_string(c, "EXISTS"); - break; - case ENGINE_KEY_ENOENT: - out_string(c, "NOT_FOUND"); - break; - case ENGINE_NOT_STORED: - out_string(c, "NOT_STORED"); - break; - case ENGINE_PREFIX_ENAME: - out_string(c, "CLIENT_ERROR invalid prefix name"); - break; - case ENGINE_ENOMEM: - out_string(c, "SERVER_ERROR out of memory"); - break; - case ENGINE_EINVAL: - out_string(c, "CLIENT_ERROR invalid arguments"); - break; - case ENGINE_E2BIG: - out_string(c, "CLIENT_ERROR value too big"); - break; - case ENGINE_EACCESS: - out_string(c, "CLIENT_ERROR access control violation"); - break; - case ENGINE_NOT_MY_VBUCKET: - out_string(c, "SERVER_ERROR not my vbucket"); - break; - case ENGINE_EBADTYPE: - out_string(c, "TYPE_MISMATCH"); - break; - case ENGINE_FAILED: - out_string(c, "SERVER_ERROR failure"); - break; - default: - handle_unexpected_errorcode_ascii(c, __func__, ret); - } + } + switch (ret) { + case ENGINE_SUCCESS: + out_string(c, "STORED"); + break; + case ENGINE_KEY_EEXISTS: + out_string(c, "EXISTS"); + break; + case ENGINE_KEY_ENOENT: + out_string(c, "NOT_FOUND"); + break; + case ENGINE_NOT_STORED: + out_string(c, "NOT_STORED"); + break; + case ENGINE_PREFIX_ENAME: + out_string(c, "CLIENT_ERROR invalid prefix name"); + break; + case ENGINE_ENOMEM: + out_string(c, "SERVER_ERROR out of memory"); + break; + case ENGINE_EINVAL: + out_string(c, "CLIENT_ERROR invalid arguments"); + break; + case ENGINE_E2BIG: + out_string(c, "CLIENT_ERROR value too big"); + break; + case ENGINE_EACCESS: + out_string(c, "CLIENT_ERROR access control violation"); + break; + case ENGINE_NOT_MY_VBUCKET: + out_string(c, "SERVER_ERROR not my vbucket"); + break; + case ENGINE_EBADTYPE: + out_string(c, "TYPE_MISMATCH"); + break; + case ENGINE_FAILED: + out_string(c, "SERVER_ERROR failure"); + break; + case ENGINE_EBADVALUE: + out_string(c, "CLIENT_ERROR bad data chunk"); + break; + default: + handle_unexpected_errorcode_ascii(c, __func__, ret); } + if (c->store_op == OPERATION_CAS) { update_stat_cas(c, ret); } else { @@ -3709,7 +3707,7 @@ static void complete_update_bin(conn *c) mc_engine.v1->release(mc_engine.v0, c, it); mc_logger->log(EXTENSION_LOG_WARNING, c, "%d: Failed to get item info\n", c->sfd); - write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_EINTERNAL, 0); + write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, 0); return; } /* We don't actually receive the trailing two characters in the bin @@ -3829,7 +3827,7 @@ static void process_bin_get(conn *c) mc_engine.v1->release(mc_engine.v0, c, it); mc_logger->log(EXTENSION_LOG_WARNING, c, "%d: Failed to get item info\n", c->sfd); - write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_EINTERNAL, 0); + write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, 0); break; } @@ -7107,7 +7105,7 @@ static void process_bin_update(conn *c) if (ret == ENGINE_SUCCESS && !mc_engine.v1->get_item_info(mc_engine.v0, c, it, &c->hinfo)) { mc_engine.v1->release(mc_engine.v0, c, it); - write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_EINTERNAL, 0); + write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, 0); return; } @@ -7189,7 +7187,7 @@ static void process_bin_append_prepend(conn *c) if (ret == ENGINE_SUCCESS && !mc_engine.v1->get_item_info(mc_engine.v0, c, it, &c->hinfo)) { mc_engine.v1->release(mc_engine.v0, c, it); - write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_EINTERNAL, 0); + write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, 0); return; } @@ -8474,8 +8472,7 @@ static void process_update_command(conn *c, token_t *tokens, const size_t ntoken if (ret == ENGINE_SUCCESS) { if (!mc_engine.v1->get_item_info(mc_engine.v0, c, it, &c->hinfo)) { mc_engine.v1->release(mc_engine.v0, c, it); - out_string(c, "SERVER_ERROR error getting item data"); - ret = ENGINE_FAILED; /* FIXME: error type */ + ret = ENGINE_ENOMEM; } else { c->item = it; ritem_set_first(c, CONN_RTYPE_HINFO, vlen); @@ -8488,8 +8485,6 @@ static void process_update_command(conn *c, token_t *tokens, const size_t ntoken out_string(c, "CLIENT_ERROR object too large for cache"); } else if (ret == ENGINE_ENOMEM) { out_string(c, "SERVER_ERROR out of memory storing object"); - } else if (ret == ENGINE_FAILED) { - /* out_string() was called above. so, do nothing */ } else { handle_unexpected_errorcode_ascii(c, __func__, ret); }