fix #76: get returns NOTFOUND on TIMEOUT
[awesomized/libmemcached] / src / libmemcached / fetch.cc
index eef8f40141b6715dabd6db21709a2f4f69011cbc..fee6a10d219d12cd36ef0523311803cb1f93696c 100644 (file)
@@ -1,6 +1,6 @@
 /*
     +--------------------------------------------------------------------+
-    | libmemcached - C/C++ Client Library for memcached                  |
+    | libmemcached-awesome - C/C++ Client Library for memcached          |
     +--------------------------------------------------------------------+
     | Redistribution and use in source and binary forms, with or without |
     | modification, are permitted under the terms of the BSD license.    |
@@ -9,7 +9,7 @@
     | the terms online at: https://opensource.org/licenses/BSD-3-Clause  |
     +--------------------------------------------------------------------+
     | Copyright (c) 2006-2014 Brian Aker   https://datadifferential.com/ |
-    | Copyright (c) 2020 Michael Wallner   <mike@php.net>                |
+    | Copyright (c) 2020-2021 Michael Wallner        https://awesome.co/ |
     +--------------------------------------------------------------------+
 */
 
@@ -141,6 +141,7 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr, memcached_result_
   memcached_instance_st *server;
   memcached_return_t read_ret = MEMCACHED_SUCCESS;
   bool connection_failures = false;
+  bool timeouts = false;
   while ((server = memcached_io_get_readable_server(ptr, read_ret))) {
     char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
     *error = memcached_response(server, buffer, sizeof(buffer), result);
@@ -150,6 +151,8 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr, memcached_result_
     } else if (*error == MEMCACHED_CONNECTION_FAILURE) {
       connection_failures = true;
       continue;
+    } else if (*error == MEMCACHED_TIMEOUT) {
+      timeouts = true;
     } else if (*error == MEMCACHED_SUCCESS) {
       result->count++;
       return result;
@@ -175,6 +178,8 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr, memcached_result_
         that.
         */
     *error = MEMCACHED_CONNECTION_FAILURE;
+  } else if (timeouts) {
+    *error = MEMCACHED_TIMEOUT;
   } else if (*error == MEMCACHED_SUCCESS) {
     *error = MEMCACHED_END;
   } else if (result->count == 0) {