Merge, better error messages
[m6w6/libmemcached] / libtest / server.cc
index da341f9528d5c08bebeea22524a3ec9adf695cf5..6ff6fc3a3a24a50a3377f8640d9d332783de529c 100644 (file)
 
 #include <cassert>
 #include <cerrno>
+#include <climits>
 #include <cstdlib>
 #include <iostream>
 
 #include <algorithm> 
 #include <functional> 
 #include <locale>
+#include <unistd.h>
 
 // trim from end 
 static inline std::string &rtrim(std::string &s)
@@ -81,7 +83,6 @@ Server::Server(const std::string& host_arg, const in_port_t port_arg,
                bool is_socket_arg) :
   _magic(MAGIC_MEMORY),
   _is_socket(is_socket_arg),
-  _pid(-1),
   _port(port_arg),
   _hostname(host_arg),
   _app(executable, _is_libtool)
@@ -95,7 +96,8 @@ Server::~Server()
 bool Server::check()
 {
   _app.slurp();
-  return _app.check();
+  _app.check();
+  return true;
 }
 
 bool Server::validate()
@@ -139,14 +141,14 @@ bool Server::wait_for_pidfile() const
 
 bool Server::has_pid() const
 {
-  return (_pid > 1);
+  return (_app.pid() > 1);
 }
 
 
 bool Server::start()
 {
   // If we find that we already have a pid then kill it.
-  if (has_pid() == false)
+  if (has_pid() == true)
   {
     fatal_message("has_pid() failed, programer error");
   }
@@ -159,6 +161,15 @@ bool Server::start()
   }
 #endif
 
+  if (getenv("YATL_PTRCHECK_SERVER"))
+  {
+    _app.use_ptrcheck();
+  }
+  else if (getenv("YATL_VALGRIND_SERVER"))
+  {
+    _app.use_valgrind();
+  }
+
   if (args(_app) == false)
   {
     Error << "Could not build command()";
@@ -178,15 +189,29 @@ bool Server::start()
     dream(5, 50000);
   }
 
-  if (pid_file().empty() == false)
+  size_t repeat= 5;
+  _app.slurp();
+  while (--repeat)
   {
-    Wait wait(pid_file(), 8);
-
-    if (wait.successful() == false)
+    if (pid_file().empty() == false)
     {
-      libtest::fatal(LIBYATL_DEFAULT_PARAM,
-                     "Unable to open pidfile for: %s",
-                     _running.c_str());
+      Wait wait(pid_file(), 8);
+
+      if (wait.successful() == false)
+      {
+        if (_app.check())
+        {
+          continue;
+        }
+
+        char buf[PATH_MAX];
+        getcwd(buf, sizeof(buf));
+        throw libtest::fatal(LIBYATL_DEFAULT_PARAM,
+                             "Unable to open pidfile in %s for: %s stderr:%s",
+                             buf,
+                             _running.c_str(),
+                             _app.stderr_c_str());
+      }
     }
   }
 
@@ -216,27 +241,33 @@ bool Server::start()
   if (pinged == false)
   {
     // If we happen to have a pid file, lets try to kill it
-    if (pid_file().empty() == false)
+    if ((pid_file().empty() == false) and (access(pid_file().c_str(), R_OK) == 0))
     {
+      _app.slurp();
       if (kill_file(pid_file()) == false)
       {
-        fatal_message("Failed to kill off server after startup occurred, when pinging failed");
+        throw libtest::fatal(LIBYATL_DEFAULT_PARAM,
+                             "Failed to kill off server after startup occurred, when pinging failed: %s stderr:%s",
+                             pid_file().c_str(),
+                             _app.stderr_c_str());
       }
-      Error << "Failed to ping(), waited:" << this_wait 
-        << " server started, having pid_file. exec:" << _running 
-        << " error:" << _app.stderr_result();
+
+      throw libtest::fatal(LIBYATL_DEFAULT_PARAM, 
+                           "Failed to ping(), waited: %u server started, having pid_file. exec: %s stderr:%s",
+                           this_wait, _running.c_str(), 
+                           _app.stderr_c_str());
     }
     else
     {
-      Error << "Failed to ping() server started. exec:" << _running;
+      throw libtest::fatal(LIBYATL_DEFAULT_PARAM,
+                           "Failed to ping() server started. exec: %s stderr:%s",
+                           _running.c_str(),
+                           _app.stderr_c_str());
     }
     _running.clear();
     return false;
   }
 
-  // A failing get_pid() at this point is considered an error
-  _pid= get_pid(true);
-
   return has_pid();
 }
 
@@ -244,12 +275,11 @@ void Server::reset_pid()
 {
   _running.clear();
   _pid_file.clear();
-  _pid= -1;
 }
 
-pid_t Server::pid()
+pid_t Server::pid() const
 {
-  return _pid;
+  return _app.pid();
 }
 
 void Server::add_option(const std::string& arg)
@@ -307,8 +337,7 @@ bool Server::set_pid_file()
   int fd;
   if ((fd= mkstemp(file_buffer)) == -1)
   {
-    perror(file_buffer);
-    return false;
+    throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "mkstemp() failed on %s with %s", file_buffer, strerror(errno));
   }
   close(fd);
   unlink(file_buffer);
@@ -327,7 +356,7 @@ bool Server::set_log_file()
   int fd;
   if ((fd= mkstemp(file_buffer)) == -1)
   {
-    libtest::fatal(LIBYATL_DEFAULT_PARAM, "mkstemp() failed on %s with %s", file_buffer, strerror(errno));
+    throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "mkstemp() failed on %s with %s", file_buffer, strerror(errno));
   }
   close(fd);
 
@@ -340,7 +369,7 @@ bool Server::args(Application& app)
 {
 
   // Set a log file if it was requested (and we can)
-  if (has_log_file_option())
+  if (false and has_log_file_option())
   {
     set_log_file();
     log_file_option(app, _log_file);
@@ -393,8 +422,9 @@ bool Server::args(Application& app)
 
 bool Server::kill()
 {
-  if (check_pid(_app.pid()) and kill_pid(_app.pid())) // If we kill it, reset
+  if (check_pid(_app.pid())) // If we kill it, reset
   {
+    _app.murder();
     if (broken_pid_file() and pid_file().empty() == false)
     {
       unlink(pid_file().c_str());