Browse Source

Catch error resulting from a connection breaking.

Wang Lam 13 years ago
parent
commit
be57244f0f
5 changed files with 16 additions and 3 deletions
  1. 1 1
      examples/reverse_client.cc
  2. 9 0
      libgearman/client.cc
  3. 3 0
      libgearman/command.cc
  4. 2 1
      libgearman/connection.cc
  5. 1 1
      tests/burnin.cc

+ 1 - 1
examples/reverse_client.cc

@@ -169,5 +169,5 @@ int main(int args, char *argv[])
 
   gearman_client_free(&client);
 
-  return EXIT_SUCCESS;
+  return exit_code;
 }

+ 9 - 0
libgearman/client.cc

@@ -989,6 +989,15 @@ static inline gearman_return_t _client_run_tasks(gearman_client_st *client)
               return local_ret;
             }
           }
+
+          /* Connection errors are fatal. */
+          if (client->con->revents & (POLLERR | POLLHUP | POLLNVAL))
+          {
+            gearman_error(client->universal, GEARMAN_LOST_CONNECTION, "detected lost connection in _client_run_tasks()");
+            client->con->close();
+            client->state= GEARMAN_CLIENT_STATE_IDLE;
+            return GEARMAN_LOST_CONNECTION;
+          }
         }
 
         if (not (client->con->revents & POLLIN))

+ 3 - 0
libgearman/command.cc

@@ -40,6 +40,7 @@
 
 #include <libgearman/visibility.h>
 #include <libgearman/command.h>
+#include <cassert>
 
 /**
  * Command info. Update GEARMAN_MAX_COMMAND_ARGS to the largest number in the
@@ -92,5 +93,7 @@ gearman_command_info_st gearmand_command_info_list[GEARMAN_COMMAND_MAX]=
 
 gearman_command_info_st *gearman_command_info(gearman_command_t command)
 {
+  assert(command >= GEARMAN_COMMAND_TEXT);
+  assert(command < GEARMAN_COMMAND_MAX);
   return &gearmand_command_info_list[command];
 }

+ 2 - 1
libgearman/connection.cc

@@ -48,7 +48,7 @@
 #include <libgearman/universal.hpp>
 #include <libgearman/allocator.hpp>
 
-#include <assert.h>
+#include <cassert>
 #include <cerrno>
 #include <cstdio>
 #include <cstdlib>
@@ -705,6 +705,7 @@ gearman_packet_st *gearman_connection_st::receiving(gearman_packet_st& packet_ar
       break;
     }
 
+    assert(packet_arg.universal);
     packet_arg.data= gearman_malloc((*packet_arg.universal), packet_arg.data_size);
     if (not packet_arg.data)
     {

+ 1 - 1
tests/burnin.cc

@@ -166,7 +166,7 @@ static test_return_t cleanup(void *object)
 static void *worker_fn(gearman_job_st *, void *,
                        size_t *result_size, gearman_return_t *ret_ptr)
 {
-  result_size= 0;
+  *result_size= 0;
   *ret_ptr= GEARMAN_SUCCESS;
   return NULL;
 }