Lines Matching refs:c

14 static void process_bin_flush(conn *c, char *extbuf);
15 static void process_bin_append_prepend(conn *c);
16 static void process_bin_update(conn *c, char *extbuf);
17 static void process_bin_get_or_touch(conn *c, char *extbuf);
18 static void process_bin_delete(conn *c);
19 static void complete_incr_bin(conn *c, char *extbuf);
20 static void process_bin_stat(conn *c);
21 static void process_bin_sasl_auth(conn *c);
22 static void dispatch_bin_command(conn *c, char *extbuf);
23 static void complete_update_bin(conn *c);
24 static void process_bin_complete_sasl_auth(conn *c);
26 static void write_bin_miss_response(conn *c, char *key, size_t nkey);
28 void complete_nread_binary(conn *c) { in complete_nread_binary() argument
29 assert(c != NULL); in complete_nread_binary()
30 assert(c->cmd >= 0); in complete_nread_binary()
32 switch(c->substate) { in complete_nread_binary()
34 complete_update_bin(c); in complete_nread_binary()
37 process_bin_complete_sasl_auth(c); in complete_nread_binary()
38 if (c->item) { in complete_nread_binary()
39 do_item_remove(c->item); in complete_nread_binary()
40 c->item = NULL; in complete_nread_binary()
44 fprintf(stderr, "Not handling substate %d\n", c->substate); in complete_nread_binary()
49 int try_read_command_binary(conn *c) { in try_read_command_binary() argument
51 if (c->rbytes < sizeof(c->binary_header)) { in try_read_command_binary()
55 memcpy(&c->binary_header, c->rcurr, sizeof(c->binary_header)); in try_read_command_binary()
57 req = &c->binary_header; in try_read_command_binary()
62 fprintf(stderr, "<%d Read binary protocol data:", c->sfd); in try_read_command_binary()
65 fprintf(stderr, "\n<%d ", c->sfd); in try_read_command_binary()
72 c->binary_header = *req; in try_read_command_binary()
73 c->binary_header.request.keylen = ntohs(req->request.keylen); in try_read_command_binary()
74 c->binary_header.request.bodylen = ntohl(req->request.bodylen); in try_read_command_binary()
75 c->binary_header.request.cas = ntohll(req->request.cas); in try_read_command_binary()
77 if (c->binary_header.request.magic != PROTOCOL_BINARY_REQ) { in try_read_command_binary()
80 c->binary_header.request.magic); in try_read_command_binary()
82 conn_set_state(c, conn_closing); in try_read_command_binary()
86 uint8_t extlen = c->binary_header.request.extlen; in try_read_command_binary()
87 uint16_t keylen = c->binary_header.request.keylen; in try_read_command_binary()
88 if (c->rbytes < keylen + extlen + sizeof(c->binary_header)) { in try_read_command_binary()
94 if (!resp_start(c)) { in try_read_command_binary()
95 conn_set_state(c, conn_closing); in try_read_command_binary()
99 c->cmd = c->binary_header.request.opcode; in try_read_command_binary()
100 c->keylen = c->binary_header.request.keylen; in try_read_command_binary()
101 c->opaque = c->binary_header.request.opaque; in try_read_command_binary()
103 c->cas = 0; in try_read_command_binary()
105 c->last_cmd_time = current_time; in try_read_command_binary()
113 char extbuf[sizeof(c->binary_header) + BIN_MAX_EXTLEN+4]; in try_read_command_binary()
114 memcpy(extbuf + sizeof(c->binary_header), c->rcurr + sizeof(c->binary_header), in try_read_command_binary()
116 c->rbytes -= sizeof(c->binary_header) + extlen + keylen; in try_read_command_binary()
117 c->rcurr += sizeof(c->binary_header) + extlen + keylen; in try_read_command_binary()
119 dispatch_bin_command(c, extbuf); in try_read_command_binary()
128 static char* binary_get_key(conn *c) { in binary_get_key() argument
129 return c->rcurr - (c->binary_header.request.keylen); in binary_get_key()
132 static void add_bin_header(conn *c, uint16_t err, uint8_t hdr_len, uint16_t key_len, uint32_t body_… in add_bin_header() argument
134 mc_resp *resp = c->resp; in add_bin_header()
136 assert(c); in add_bin_header()
143 header->response.opcode = c->binary_header.request.opcode; in add_bin_header()
151 header->response.opaque = c->opaque; in add_bin_header()
152 header->response.cas = htonll(c->cas); in add_bin_header()
156 fprintf(stderr, ">%d Writing bin response:", c->sfd); in add_bin_header()
159 fprintf(stderr, "\n>%d ", c->sfd); in add_bin_header()
176 void write_bin_error(conn *c, protocol_binary_response_status err, in write_bin_error() argument
212 fprintf(stderr, ">%d UNHANDLED ERROR: %d\n", c->sfd, err); in write_bin_error()
217 fprintf(stderr, ">%d Writing an error: %s\n", c->sfd, errstr); in write_bin_error()
221 add_bin_header(c, err, 0, 0, len); in write_bin_error()
223 resp_add_iov(c->resp, errstr, len); in write_bin_error()
226 c->sbytes = swallow; in write_bin_error()
227 conn_set_state(c, conn_swallow); in write_bin_error()
229 conn_set_state(c, conn_mwrite); in write_bin_error()
234 static void handle_binary_protocol_error(conn *c) { in handle_binary_protocol_error() argument
235 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_EINVAL, NULL, 0); in handle_binary_protocol_error()
238 c->binary_header.request.opcode, c->sfd); in handle_binary_protocol_error()
240 c->close_after_write = true; in handle_binary_protocol_error()
244 static void write_bin_response(conn *c, void *d, int hlen, int keylen, int dlen) { in write_bin_response() argument
245 if (!c->noreply || c->cmd == PROTOCOL_BINARY_CMD_GET || in write_bin_response()
246 c->cmd == PROTOCOL_BINARY_CMD_GETK) { in write_bin_response()
247 add_bin_header(c, 0, hlen, keylen, dlen); in write_bin_response()
248 mc_resp *resp = c->resp; in write_bin_response()
254 conn_set_state(c, conn_new_cmd); in write_bin_response()
257 static void complete_incr_bin(conn *c, char *extbuf) { in complete_incr_bin() argument
265 assert(c != NULL); in complete_incr_bin()
266 protocol_binary_response_incr* rsp = (protocol_binary_response_incr*)c->resp->wbuf; in complete_incr_bin()
275 key = binary_get_key(c); in complete_incr_bin()
276 nkey = c->binary_header.request.keylen; in complete_incr_bin()
291 if (c->binary_header.request.cas != 0) { in complete_incr_bin()
292 cas = c->binary_header.request.cas; in complete_incr_bin()
294 switch(add_delta(c->thread, key, nkey, c->cmd == PROTOCOL_BINARY_CMD_INCREMENT, in complete_incr_bin()
300 c->cas = cas; in complete_incr_bin()
302 write_bin_response(c, &rsp->message.body, 0, 0, in complete_incr_bin()
306 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL, NULL, 0); in complete_incr_bin()
309 out_of_memory(c, "SERVER_ERROR Out of memory incrementing value"); in complete_incr_bin()
326 c->thread->cur_sfd = c->sfd; // for store_item logging. in complete_incr_bin()
328 …if (store_item(it, NREAD_ADD, c->thread, NULL, &cas, (settings.use_cas) ? get_cas_id() : 0, CAS_NO… in complete_incr_bin()
329 c->cas = cas; in complete_incr_bin()
330 … write_bin_response(c, &rsp->message.body, 0, 0, sizeof(rsp->message.body.value)); in complete_incr_bin()
332 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_NOT_STORED, in complete_incr_bin()
337 out_of_memory(c, in complete_incr_bin()
341 pthread_mutex_lock(&c->thread->stats.mutex); in complete_incr_bin()
342 if (c->cmd == PROTOCOL_BINARY_CMD_INCREMENT) { in complete_incr_bin()
343 c->thread->stats.incr_misses++; in complete_incr_bin()
345 c->thread->stats.decr_misses++; in complete_incr_bin()
347 pthread_mutex_unlock(&c->thread->stats.mutex); in complete_incr_bin()
349 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_ENOENT, NULL, 0); in complete_incr_bin()
353 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS, NULL, 0); in complete_incr_bin()
358 static void complete_update_bin(conn *c) { in complete_update_bin() argument
361 assert(c != NULL); in complete_update_bin()
363 item *it = c->item; in complete_update_bin()
364 pthread_mutex_lock(&c->thread->stats.mutex); in complete_update_bin()
365 c->thread->stats.slab_stats[ITEM_clsid(it)].set_cmds++; in complete_update_bin()
366 pthread_mutex_unlock(&c->thread->stats.mutex); in complete_update_bin()
374 assert(c->ritem); in complete_update_bin()
375 item_chunk *ch = (item_chunk *) c->ritem; in complete_update_bin()
385 c->thread->cur_sfd = c->sfd; // for store_item logging. in complete_update_bin()
386 …ret = store_item(it, c->cmd, c->thread, NULL, &cas, (settings.use_cas) ? get_cas_id() : 0, CAS_NO_… in complete_update_bin()
387 c->cas = cas; in complete_update_bin()
390 switch (c->cmd) { in complete_update_bin()
392 MEMCACHED_COMMAND_ADD(c->sfd, ITEM_key(it), it->nkey, in complete_update_bin()
396 MEMCACHED_COMMAND_REPLACE(c->sfd, ITEM_key(it), it->nkey, in complete_update_bin()
400 MEMCACHED_COMMAND_APPEND(c->sfd, ITEM_key(it), it->nkey, in complete_update_bin()
404 MEMCACHED_COMMAND_PREPEND(c->sfd, ITEM_key(it), it->nkey, in complete_update_bin()
408 MEMCACHED_COMMAND_SET(c->sfd, ITEM_key(it), it->nkey, in complete_update_bin()
417 write_bin_response(c, NULL, 0, 0, 0); in complete_update_bin()
420 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS, NULL, 0); in complete_update_bin()
423 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_ENOENT, NULL, 0); in complete_update_bin()
428 if (c->cmd == NREAD_ADD) { in complete_update_bin()
430 } else if(c->cmd == NREAD_REPLACE) { in complete_update_bin()
435 write_bin_error(c, eno, NULL, 0); in complete_update_bin()
438 item_remove(c->item); /* release the c->item reference */ in complete_update_bin()
439 c->item = 0; in complete_update_bin()
442 static void write_bin_miss_response(conn *c, char *key, size_t nkey) { in write_bin_miss_response() argument
444 add_bin_header(c, PROTOCOL_BINARY_RESPONSE_KEY_ENOENT, in write_bin_miss_response()
446 char *ofs = c->resp->wbuf + sizeof(protocol_binary_response_header); in write_bin_miss_response()
448 resp_add_iov(c->resp, ofs, nkey); in write_bin_miss_response()
449 conn_set_state(c, conn_new_cmd); in write_bin_miss_response()
451 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_ENOENT, in write_bin_miss_response()
456 static void process_bin_get_or_touch(conn *c, char *extbuf) { in process_bin_get_or_touch() argument
459 protocol_binary_response_get* rsp = (protocol_binary_response_get*)c->resp->wbuf; in process_bin_get_or_touch()
460 char* key = binary_get_key(c); in process_bin_get_or_touch()
461 size_t nkey = c->binary_header.request.keylen; in process_bin_get_or_touch()
462 int should_touch = (c->cmd == PROTOCOL_BINARY_CMD_TOUCH || in process_bin_get_or_touch()
463 c->cmd == PROTOCOL_BINARY_CMD_GAT || in process_bin_get_or_touch()
464 c->cmd == PROTOCOL_BINARY_CMD_GATK); in process_bin_get_or_touch()
465 int should_return_key = (c->cmd == PROTOCOL_BINARY_CMD_GETK || in process_bin_get_or_touch()
466 c->cmd == PROTOCOL_BINARY_CMD_GATK); in process_bin_get_or_touch()
467 int should_return_value = (c->cmd != PROTOCOL_BINARY_CMD_TOUCH); in process_bin_get_or_touch()
471 fprintf(stderr, "<%d %s ", c->sfd, should_touch ? "TOUCH" : "GET"); in process_bin_get_or_touch()
480 it = item_touch(key, nkey, realtime(exptime), c->thread); in process_bin_get_or_touch()
482 it = item_get(key, nkey, c->thread, DO_UPDATE); in process_bin_get_or_touch()
490 pthread_mutex_lock(&c->thread->stats.mutex); in process_bin_get_or_touch()
492 c->thread->stats.touch_cmds++; in process_bin_get_or_touch()
493 c->thread->stats.slab_stats[ITEM_clsid(it)].touch_hits++; in process_bin_get_or_touch()
495 c->thread->stats.get_cmds++; in process_bin_get_or_touch()
496 c->thread->stats.lru_hits[it->slabs_clsid]++; in process_bin_get_or_touch()
498 pthread_mutex_unlock(&c->thread->stats.mutex); in process_bin_get_or_touch()
501 MEMCACHED_COMMAND_TOUCH(c->sfd, ITEM_key(it), it->nkey, in process_bin_get_or_touch()
504 MEMCACHED_COMMAND_GET(c->sfd, ITEM_key(it), it->nkey, in process_bin_get_or_touch()
508 if (c->cmd == PROTOCOL_BINARY_CMD_TOUCH) { in process_bin_get_or_touch()
515 add_bin_header(c, 0, sizeof(rsp->message.body), keylen, bodylen); in process_bin_get_or_touch()
521 resp_add_iov(c->resp, &rsp->message.body, sizeof(rsp->message.body)); in process_bin_get_or_touch()
524 resp_add_iov(c->resp, ITEM_key(it), nkey); in process_bin_get_or_touch()
531 if (storage_get_item(c, it, c->resp) != 0) { in process_bin_get_or_touch()
532 pthread_mutex_lock(&c->thread->stats.mutex); in process_bin_get_or_touch()
533 c->thread->stats.get_oom_extstore++; in process_bin_get_or_touch()
534 pthread_mutex_unlock(&c->thread->stats.mutex); in process_bin_get_or_touch()
539 resp_add_iov(c->resp, ITEM_data(it), it->nbytes - 2); in process_bin_get_or_touch()
542 resp_add_chunked_iov(c->resp, it, it->nbytes - 2); in process_bin_get_or_touch()
546 resp_add_iov(c->resp, ITEM_data(it), it->nbytes - 2); in process_bin_get_or_touch()
548 resp_add_chunked_iov(c->resp, it, it->nbytes - 2); in process_bin_get_or_touch()
554 conn_set_state(c, conn_new_cmd); in process_bin_get_or_touch()
559 c->resp->item = NULL; in process_bin_get_or_touch()
561 c->resp->item = it; in process_bin_get_or_touch()
564 c->resp->item = it; in process_bin_get_or_touch()
574 pthread_mutex_lock(&c->thread->stats.mutex); in process_bin_get_or_touch()
576 c->thread->stats.touch_cmds++; in process_bin_get_or_touch()
577 c->thread->stats.touch_misses++; in process_bin_get_or_touch()
579 c->thread->stats.get_cmds++; in process_bin_get_or_touch()
580 c->thread->stats.get_misses++; in process_bin_get_or_touch()
582 pthread_mutex_unlock(&c->thread->stats.mutex); in process_bin_get_or_touch()
585 MEMCACHED_COMMAND_TOUCH(c->sfd, key, nkey, -1, 0); in process_bin_get_or_touch()
587 MEMCACHED_COMMAND_GET(c->sfd, key, nkey, -1, 0); in process_bin_get_or_touch()
590 if (c->noreply) { in process_bin_get_or_touch()
591 conn_set_state(c, conn_new_cmd); in process_bin_get_or_touch()
594 write_bin_miss_response(c, key, nkey); in process_bin_get_or_touch()
596 write_bin_miss_response(c, NULL, 0); in process_bin_get_or_touch()
606 static void process_bin_stat(conn *c) { in process_bin_stat() argument
607 char *subcommand = binary_get_key(c); in process_bin_stat()
608 size_t nkey = c->binary_header.request.keylen; in process_bin_stat()
612 fprintf(stderr, "<%d STATS ", c->sfd); in process_bin_stat()
621 server_stats(&append_stats, c); in process_bin_stat()
622 (void)get_stats(NULL, 0, &append_stats, c); in process_bin_stat()
626 process_stat_settings(&append_stats, c); in process_bin_stat()
633 out_of_memory(c, "SERVER_ERROR Out of memory generating stats"); in process_bin_stat()
638 append_stats("detailed", strlen("detailed"), dump_buf, len, c); in process_bin_stat()
646 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_ENOENT, NULL, 0); in process_bin_stat()
650 if (get_stats(subcommand, nkey, &append_stats, c)) { in process_bin_stat()
651 if (c->stats.buffer == NULL) { in process_bin_stat()
652 out_of_memory(c, "SERVER_ERROR Out of memory generating stats"); in process_bin_stat()
654 write_and_free(c, c->stats.buffer, c->stats.offset); in process_bin_stat()
655 c->stats.buffer = NULL; in process_bin_stat()
658 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_ENOENT, NULL, 0); in process_bin_stat()
665 append_stats(NULL, 0, NULL, 0, c); in process_bin_stat()
666 if (c->stats.buffer == NULL) { in process_bin_stat()
667 out_of_memory(c, "SERVER_ERROR Out of memory preparing to send stats"); in process_bin_stat()
669 write_and_free(c, c->stats.buffer, c->stats.offset); in process_bin_stat()
670 c->stats.buffer = NULL; in process_bin_stat()
674 static void init_sasl_conn(conn *c) { in init_sasl_conn() argument
675 assert(c); in init_sasl_conn()
680 c->authenticated = false; in init_sasl_conn()
682 if (!c->sasl_conn) { in init_sasl_conn()
687 NULL, 0, &c->sasl_conn); in init_sasl_conn()
692 c->sasl_conn = NULL; in init_sasl_conn()
697 static void bin_list_sasl_mechs(conn *c) { in bin_list_sasl_mechs() argument
700 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND, NULL, in bin_list_sasl_mechs()
701 c->binary_header.request.bodylen in bin_list_sasl_mechs()
702 - c->binary_header.request.keylen); in bin_list_sasl_mechs()
706 init_sasl_conn(c); in bin_list_sasl_mechs()
709 int result=sasl_listmech(c->sasl_conn, NULL, in bin_list_sasl_mechs()
720 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_AUTH_ERROR, NULL, 0); in bin_list_sasl_mechs()
723 write_bin_response(c, (char*)result_string, 0, 0, string_length); in bin_list_sasl_mechs()
726 static void process_bin_sasl_auth(conn *c) { in process_bin_sasl_auth() argument
729 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND, NULL, in process_bin_sasl_auth()
730 c->binary_header.request.bodylen in process_bin_sasl_auth()
731 - c->binary_header.request.keylen); in process_bin_sasl_auth()
735 assert(c->binary_header.request.extlen == 0); in process_bin_sasl_auth()
737 uint16_t nkey = c->binary_header.request.keylen; in process_bin_sasl_auth()
738 int vlen = c->binary_header.request.bodylen - nkey; in process_bin_sasl_auth()
741 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_EINVAL, NULL, vlen); in process_bin_sasl_auth()
742 conn_set_state(c, conn_swallow); in process_bin_sasl_auth()
746 char *key = binary_get_key(c); in process_bin_sasl_auth()
753 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, NULL, vlen); in process_bin_sasl_auth()
754 conn_set_state(c, conn_swallow); in process_bin_sasl_auth()
761 c->item = it; in process_bin_sasl_auth()
762 c->ritem = ITEM_data(it); in process_bin_sasl_auth()
763 c->rlbytes = vlen; in process_bin_sasl_auth()
764 conn_set_state(c, conn_nread); in process_bin_sasl_auth()
765 c->substate = bin_reading_sasl_auth_data; in process_bin_sasl_auth()
768 static void process_bin_complete_sasl_auth(conn *c) { in process_bin_complete_sasl_auth() argument
773 assert(c->item); in process_bin_complete_sasl_auth()
774 init_sasl_conn(c); in process_bin_complete_sasl_auth()
776 uint16_t nkey = c->binary_header.request.keylen; in process_bin_complete_sasl_auth()
777 int vlen = c->binary_header.request.bodylen - nkey; in process_bin_complete_sasl_auth()
779 if (nkey > ((item*) c->item)->nkey) { in process_bin_complete_sasl_auth()
780 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_EINVAL, NULL, vlen); in process_bin_complete_sasl_auth()
781 conn_set_state(c, conn_swallow); in process_bin_complete_sasl_auth()
786 memcpy(mech, ITEM_key((item*)c->item), nkey); in process_bin_complete_sasl_auth()
792 const char *challenge = vlen == 0 ? NULL : ITEM_data((item*) c->item); in process_bin_complete_sasl_auth()
794 if (vlen > ((item*) c->item)->nbytes) { in process_bin_complete_sasl_auth()
795 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_EINVAL, NULL, vlen); in process_bin_complete_sasl_auth()
796 conn_set_state(c, conn_swallow); in process_bin_complete_sasl_auth()
802 switch (c->cmd) { in process_bin_complete_sasl_auth()
804 result = sasl_server_start(c->sasl_conn, mech, in process_bin_complete_sasl_auth()
807 c->sasl_started = (result == SASL_OK || result == SASL_CONTINUE); in process_bin_complete_sasl_auth()
810 if (!c->sasl_started) { in process_bin_complete_sasl_auth()
813 "not called for this connection!\n", c->sfd); in process_bin_complete_sasl_auth()
817 result = sasl_server_step(c->sasl_conn, in process_bin_complete_sasl_auth()
827 c->cmd, challenge); in process_bin_complete_sasl_auth()
838 c->authenticated = true; in process_bin_complete_sasl_auth()
839 write_bin_response(c, "Authenticated", 0, 0, strlen("Authenticated")); in process_bin_complete_sasl_auth()
840 pthread_mutex_lock(&c->thread->stats.mutex); in process_bin_complete_sasl_auth()
841 c->thread->stats.auth_cmds++; in process_bin_complete_sasl_auth()
842 pthread_mutex_unlock(&c->thread->stats.mutex); in process_bin_complete_sasl_auth()
845 add_bin_header(c, PROTOCOL_BINARY_RESPONSE_AUTH_CONTINUE, 0, 0, outlen); in process_bin_complete_sasl_auth()
847 resp_add_iov(c->resp, out, outlen); in process_bin_complete_sasl_auth()
850 conn_set_state(c, conn_mwrite); in process_bin_complete_sasl_auth()
855 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_AUTH_ERROR, NULL, 0); in process_bin_complete_sasl_auth()
856 pthread_mutex_lock(&c->thread->stats.mutex); in process_bin_complete_sasl_auth()
857 c->thread->stats.auth_cmds++; in process_bin_complete_sasl_auth()
858 c->thread->stats.auth_errors++; in process_bin_complete_sasl_auth()
859 pthread_mutex_unlock(&c->thread->stats.mutex); in process_bin_complete_sasl_auth()
863 static bool authenticated(conn *c) { in authenticated() argument
867 switch (c->cmd) { in authenticated()
875 rv = c->authenticated; in authenticated()
880 c->cmd, rv ? "true" : "false"); in authenticated()
886 static void dispatch_bin_command(conn *c, char *extbuf) { in dispatch_bin_command() argument
889 uint8_t extlen = c->binary_header.request.extlen; in dispatch_bin_command()
890 uint16_t keylen = c->binary_header.request.keylen; in dispatch_bin_command()
891 uint32_t bodylen = c->binary_header.request.bodylen; in dispatch_bin_command()
892 c->thread->cur_sfd = c->sfd; // cuddle sfd for logging. in dispatch_bin_command()
895 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND, NULL, 0); in dispatch_bin_command()
896 c->close_after_write = true; in dispatch_bin_command()
900 if (settings.sasl && !authenticated(c)) { in dispatch_bin_command()
901 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_AUTH_ERROR, NULL, 0); in dispatch_bin_command()
902 c->close_after_write = true; in dispatch_bin_command()
906 MEMCACHED_PROCESS_COMMAND_START(c->sfd, c->rcurr, c->rbytes); in dispatch_bin_command()
907 c->noreply = true; in dispatch_bin_command()
911 handle_binary_protocol_error(c); in dispatch_bin_command()
915 switch (c->cmd) { in dispatch_bin_command()
917 c->cmd = PROTOCOL_BINARY_CMD_SET; in dispatch_bin_command()
920 c->cmd = PROTOCOL_BINARY_CMD_ADD; in dispatch_bin_command()
923 c->cmd = PROTOCOL_BINARY_CMD_REPLACE; in dispatch_bin_command()
926 c->cmd = PROTOCOL_BINARY_CMD_DELETE; in dispatch_bin_command()
929 c->cmd = PROTOCOL_BINARY_CMD_INCREMENT; in dispatch_bin_command()
932 c->cmd = PROTOCOL_BINARY_CMD_DECREMENT; in dispatch_bin_command()
935 c->cmd = PROTOCOL_BINARY_CMD_QUIT; in dispatch_bin_command()
938 c->cmd = PROTOCOL_BINARY_CMD_FLUSH; in dispatch_bin_command()
941 c->cmd = PROTOCOL_BINARY_CMD_APPEND; in dispatch_bin_command()
944 c->cmd = PROTOCOL_BINARY_CMD_PREPEND; in dispatch_bin_command()
947 c->cmd = PROTOCOL_BINARY_CMD_GET; in dispatch_bin_command()
950 c->cmd = PROTOCOL_BINARY_CMD_GETK; in dispatch_bin_command()
953 c->cmd = PROTOCOL_BINARY_CMD_GAT; in dispatch_bin_command()
956 c->cmd = PROTOCOL_BINARY_CMD_GATK; in dispatch_bin_command()
959 c->noreply = false; in dispatch_bin_command()
962 switch (c->cmd) { in dispatch_bin_command()
965 write_bin_response(c, VERSION, 0, 0, strlen(VERSION)); in dispatch_bin_command()
972 process_bin_flush(c, extbuf); in dispatch_bin_command()
979 write_bin_response(c, NULL, 0, 0, 0); in dispatch_bin_command()
981 conn_set_state(c, conn_mwrite); in dispatch_bin_command()
990 process_bin_update(c, extbuf); in dispatch_bin_command()
1000 process_bin_get_or_touch(c, extbuf); in dispatch_bin_command()
1007 process_bin_delete(c); in dispatch_bin_command()
1015 complete_incr_bin(c, extbuf); in dispatch_bin_command()
1023 process_bin_append_prepend(c); in dispatch_bin_command()
1030 process_bin_stat(c); in dispatch_bin_command()
1037 write_bin_response(c, NULL, 0, 0, 0); in dispatch_bin_command()
1038 conn_set_state(c, conn_mwrite); in dispatch_bin_command()
1039 c->close_after_write = true; in dispatch_bin_command()
1040 c->close_reason = NORMAL_CLOSE; in dispatch_bin_command()
1047 bin_list_sasl_mechs(c); in dispatch_bin_command()
1055 process_bin_sasl_auth(c); in dispatch_bin_command()
1066 process_bin_get_or_touch(c, extbuf); in dispatch_bin_command()
1072 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND, NULL, in dispatch_bin_command()
1077 handle_binary_protocol_error(c); in dispatch_bin_command()
1080 static void process_bin_update(conn *c, char *extbuf) { in process_bin_update() argument
1087 assert(c != NULL); in process_bin_update()
1089 key = binary_get_key(c); in process_bin_update()
1090 nkey = c->binary_header.request.keylen; in process_bin_update()
1096 vlen = c->binary_header.request.bodylen - (nkey + c->binary_header.request.extlen); in process_bin_update()
1100 if (c->cmd == PROTOCOL_BINARY_CMD_ADD) { in process_bin_update()
1101 fprintf(stderr, "<%d ADD ", c->sfd); in process_bin_update()
1102 } else if (c->cmd == PROTOCOL_BINARY_CMD_SET) { in process_bin_update()
1103 fprintf(stderr, "<%d SET ", c->sfd); in process_bin_update()
1105 fprintf(stderr, "<%d REPLACE ", c->sfd); in process_bin_update()
1125 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_E2BIG, NULL, vlen); in process_bin_update()
1128 out_of_memory(c, "SERVER_ERROR Out of memory allocating item"); in process_bin_update()
1130 c->sbytes = vlen; in process_bin_update()
1134 LOGGER_LOG(c->thread->l, LOG_MUTATIONS, LOGGER_ITEM_STORE, in process_bin_update()
1136 ITEM_clsid(it), c->sfd); in process_bin_update()
1140 if (c->cmd == PROTOCOL_BINARY_CMD_SET) { in process_bin_update()
1141 it = item_get(key, nkey, c->thread, DONT_UPDATE); in process_bin_update()
1144 STORAGE_delete(c->thread->storage, it); in process_bin_update()
1150 conn_set_state(c, conn_swallow); in process_bin_update()
1154 ITEM_set_cas(it, c->binary_header.request.cas); in process_bin_update()
1156 switch (c->cmd) { in process_bin_update()
1158 c->cmd = NREAD_ADD; in process_bin_update()
1161 c->cmd = NREAD_SET; in process_bin_update()
1164 c->cmd = NREAD_REPLACE; in process_bin_update()
1171 c->cmd = NREAD_CAS; in process_bin_update()
1174 c->item = it; in process_bin_update()
1177 c->ritem = ITEM_schunk(it); in process_bin_update()
1179 c->ritem = ITEM_data(it); in process_bin_update()
1182 c->ritem = ITEM_data(it); in process_bin_update()
1184 c->rlbytes = vlen; in process_bin_update()
1185 conn_set_state(c, conn_nread); in process_bin_update()
1186 c->substate = bin_read_set_value; in process_bin_update()
1189 static void process_bin_append_prepend(conn *c) { in process_bin_append_prepend() argument
1195 assert(c != NULL); in process_bin_append_prepend()
1197 key = binary_get_key(c); in process_bin_append_prepend()
1198 nkey = c->binary_header.request.keylen; in process_bin_append_prepend()
1199 vlen = c->binary_header.request.bodylen - nkey; in process_bin_append_prepend()
1213 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_E2BIG, NULL, vlen); in process_bin_append_prepend()
1215 out_of_memory(c, "SERVER_ERROR Out of memory allocating item"); in process_bin_append_prepend()
1217 c->sbytes = vlen; in process_bin_append_prepend()
1220 conn_set_state(c, conn_swallow); in process_bin_append_prepend()
1224 ITEM_set_cas(it, c->binary_header.request.cas); in process_bin_append_prepend()
1226 switch (c->cmd) { in process_bin_append_prepend()
1228 c->cmd = NREAD_APPEND; in process_bin_append_prepend()
1231 c->cmd = NREAD_PREPEND; in process_bin_append_prepend()
1237 c->item = it; in process_bin_append_prepend()
1240 c->ritem = ITEM_schunk(it); in process_bin_append_prepend()
1242 c->ritem = ITEM_data(it); in process_bin_append_prepend()
1245 c->ritem = ITEM_data(it); in process_bin_append_prepend()
1247 c->rlbytes = vlen; in process_bin_append_prepend()
1248 conn_set_state(c, conn_nread); in process_bin_append_prepend()
1249 c->substate = bin_read_set_value; in process_bin_append_prepend()
1252 static void process_bin_flush(conn *c, char *extbuf) { in process_bin_flush() argument
1259 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_AUTH_ERROR, NULL, 0); in process_bin_flush()
1263 if (c->binary_header.request.extlen == sizeof(req->message.body)) { in process_bin_flush()
1275 pthread_mutex_lock(&c->thread->stats.mutex); in process_bin_flush()
1276 c->thread->stats.flush_cmds++; in process_bin_flush()
1277 pthread_mutex_unlock(&c->thread->stats.mutex); in process_bin_flush()
1279 write_bin_response(c, NULL, 0, 0, 0); in process_bin_flush()
1282 static void process_bin_delete(conn *c) { in process_bin_delete() argument
1286 assert(c != NULL); in process_bin_delete()
1287 char* key = binary_get_key(c); in process_bin_delete()
1288 size_t nkey = c->binary_header.request.keylen; in process_bin_delete()
1303 it = item_get_locked(key, nkey, c->thread, DONT_UPDATE, &hv); in process_bin_delete()
1305 uint64_t cas = c->binary_header.request.cas; in process_bin_delete()
1307 MEMCACHED_COMMAND_DELETE(c->sfd, ITEM_key(it), it->nkey); in process_bin_delete()
1308 pthread_mutex_lock(&c->thread->stats.mutex); in process_bin_delete()
1309 c->thread->stats.slab_stats[ITEM_clsid(it)].delete_hits++; in process_bin_delete()
1310 pthread_mutex_unlock(&c->thread->stats.mutex); in process_bin_delete()
1312 STORAGE_delete(c->thread->storage, it); in process_bin_delete()
1313 write_bin_response(c, NULL, 0, 0, 0); in process_bin_delete()
1315 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS, NULL, 0); in process_bin_delete()
1319 write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_ENOENT, NULL, 0); in process_bin_delete()
1320 pthread_mutex_lock(&c->thread->stats.mutex); in process_bin_delete()
1321 c->thread->stats.delete_misses++; in process_bin_delete()
1322 pthread_mutex_unlock(&c->thread->stats.mutex); in process_bin_delete()