libmemcached: recent meta protocol fixes
authorMichael Wallner <mike@php.net>
Wed, 15 Sep 2021 14:30:03 +0000 (16:30 +0200)
committerMichael Wallner <mike@php.net>
Wed, 2 Feb 2022 10:21:34 +0000 (11:21 +0100)
src/libmemcached/response.cc
src/libmemcached/storage.cc

index fe01e3886c33c804f426b10669fc697caa093b63..9231caaffa2951b4c104564544998ecfc59f7b08 100644 (file)
@@ -418,6 +418,13 @@ static memcached_return_t textual_read_one_response(memcached_instance_st *insta
     }
   } break;
 
+  case 'H':
+    // HD
+    if (buffer[1] == 'D') {
+      return MEMCACHED_SUCCESS;
+    }
+    break;
+
   case 'O': {
     // OK
     if (buffer[1] == 'K') {
index 3d82edf52d6eb1dd622ddc58dee7d499d043ef26..0b96fbf3e5749840bc117fbb71bf12615354c9fd 100644 (file)
@@ -183,7 +183,7 @@ memcached_send_meta(memcached_st *ptr, memcached_instance_st *instance,
                     time_t expiration, uint32_t flags, uint64_t cas,
                     bool flush, memcached_storage_action_t verb) {
   static const char modes[] = "SREPAS";
-  char fl_buf[32] = " F", cs_buf[32] = " C", ex_buf[32] = " T", sz_buf[32] = " S";
+  char fl_buf[32] = " F", cs_buf[32] = " C", ex_buf[32] = " T", sz_buf[32] = " ";
   size_t io_num = 0, fl_len = strlen(fl_buf), cs_len = strlen(cs_buf), ex_len = strlen(ex_buf), sz_len = strlen(sz_buf);
   libmemcached_io_vector_st io_vec[16] = {};
 
@@ -192,6 +192,9 @@ memcached_send_meta(memcached_st *ptr, memcached_instance_st *instance,
                       memcached_array_size(ptr->_namespace)};
   io_vec[io_num++] = {key, key_len};
 
+  sz_len += snprintf(sz_buf + sz_len, sizeof(sz_buf) - sz_len, "%" PRIu64, (uint64_t) val_len);
+  io_vec[io_num++] = {sz_buf, sz_len};
+
   if (verb != SET_OP) {
     io_vec[io_num++] = {memcached_literal_param(" M")};
     io_vec[io_num++] = {&modes[verb], 1};
@@ -213,8 +216,6 @@ memcached_send_meta(memcached_st *ptr, memcached_instance_st *instance,
   }
 
   /* we have to send a data block even if it's empty, else memcached errors out with ITEM TOO BIG */
-  sz_len += snprintf(sz_buf + sz_len, sizeof(sz_buf) - sz_len, "%" PRIu64, (uint64_t) val_len);
-  io_vec[io_num++] = {sz_buf, sz_len};
   io_vec[io_num++] = {memcached_literal_param("\r\n")};
   io_vec[io_num++] = {val, val_len};
   io_vec[io_num++] = {memcached_literal_param("\r\n")};