~brianaker/libmemcached/1164440

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 * 
 *  libtest
 *
 *  Copyright (C) 2011 Data Differential, http://datadifferential.com/
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 3 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */


#include <config.h>
#include <libtest/common.h>

#include <libtest/blobslap_worker.h>

#include <cassert>
#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#include <libgearman/gearman.h>

#ifndef __INTEL_COMPILER
#pragma GCC diagnostic ignored "-Wold-style-cast"
#endif

namespace libtest {

class BlobslapWorker : public Server
{
private:
public:
  BlobslapWorker(in_port_t port_arg) :
    Server("localhost", port_arg, "benchmark/blobslap_worker", true)
  { 
    set_pid_file();
  }

  pid_t get_pid(bool error_is_ok)
  {
    if (pid_file().empty())
    {
      Error << "pid_file was empty";
      return -1;
    }

    Wait wait(pid_file(), 0);

    if (error_is_ok and not wait.successful())
    {
      Error << "Pidfile was not found:" << pid_file();
      return -1;
    }

    std::stringstream error_message;
    pid_t ret= get_pid_from_file(pid_file(), error_message);

    if (error_is_ok and is_pid_valid(ret) == false)
    {
      Error << error_message.str();
    }

    return ret;
  }

  bool ping()
  {
    if (pid_file().empty())
    {
      Error << "No pid file available";
      return false;
    }

    Wait wait(pid_file(), 0);
    if (not wait.successful())
    {
      Error << "Pidfile was not found:" << pid_file();
      return false;
    }

    std::stringstream error_message;
    pid_t local_pid= get_pid_from_file(pid_file(), error_message);
    if (is_pid_valid(local_pid) == false)
    {
      Error << error_message.str();
      return false;
    }

    // Use kill to determine is the process exist
    if (::kill(local_pid, 0) == 0)
    {
      return true;
    }

    return false;
  }

  const char *name()
  {
    return "blobslap_worker";
  };

  bool has_port_option() const
  {
    return true;
  }

  bool has_log_file_option() const
  {
    return true;
  }

  bool is_libtool()
  {
    return true;
  }

  bool build(size_t argc, const char *argv[]);
};


#include <sstream>

bool BlobslapWorker::build(size_t argc, const char *argv[])
{
  std::stringstream arg_buffer;

  for (size_t x= 0 ; x < argc ; x++)
  {
    add_option(argv[x]);
  }

  return true;
}

Server *build_blobslap_worker(in_port_t try_port)
{
  return new BlobslapWorker(try_port);
}

} // namespace libtest