1 /*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2  *
3  *  Data Differential YATL (i.e. libtest)  library
4  *
5  *  Copyright (C) 2012 Data Differential, http://datadifferential.com/
6  *
7  *  Redistribution and use in source and binary forms, with or without
8  *  modification, are permitted provided that the following conditions are
9  *  met:
10  *
11  *      * Redistributions of source code must retain the above copyright
12  *  notice, this list of conditions and the following disclaimer.
13  *
14  *      * Redistributions in binary form must reproduce the above
15  *  copyright notice, this list of conditions and the following disclaimer
16  *  in the documentation and/or other materials provided with the
17  *  distribution.
18  *
19  *      * The names of its contributors may not be used to endorse or
20  *  promote products derived from this software without specific prior
21  *  written permission.
22  *
23  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  *
35  */
36 
37 
38 #include "libtest/yatlcon.h"
39 #include <libtest/common.h>
40 
41 #include <libtest/blobslap_worker.h>
42 
43 #include <cassert>
44 #include <cerrno>
45 #include <cstdio>
46 #include <cstdlib>
47 #include <cstring>
48 #include <iostream>
49 #include <signal.h>
50 #include <sys/types.h>
51 #include <sys/wait.h>
52 #include <unistd.h>
53 
54 #ifndef __INTEL_COMPILER
55 #pragma GCC diagnostic ignored "-Wold-style-cast"
56 #endif
57 
58 namespace libtest {
59 
60 class BlobslapWorker : public Server
61 {
62 private:
63 public:
BlobslapWorker(in_port_t port_arg)64   BlobslapWorker(in_port_t port_arg) :
65     Server("localhost", port_arg, "benchmark/blobslap_worker", true)
66   {
67     set_pid_file();
68   }
69 
get_pid(bool error_is_ok)70   pid_t get_pid(bool error_is_ok)
71   {
72     if (pid_file().empty())
73     {
74       Error << "pid_file was empty";
75       return -1;
76     }
77 
78     Wait wait(pid_file(), 0);
79 
80     if (error_is_ok and not wait.successful())
81     {
82       Error << "Pidfile was not found:" << pid_file();
83       return -1;
84     }
85 
86     std::stringstream error_message;
87     pid_t ret= get_pid_from_file(pid_file(), error_message);
88 
89     if (error_is_ok and is_pid_valid(ret) == false)
90     {
91       Error << error_message.str();
92     }
93 
94     return ret;
95   }
96 
ping()97   bool ping()
98   {
99     if (pid_file().empty())
100     {
101       Error << "No pid file available";
102       return false;
103     }
104 
105     Wait wait(pid_file(), 0);
106     if (not wait.successful())
107     {
108       Error << "Pidfile was not found:" << pid_file();
109       return false;
110     }
111 
112     std::stringstream error_message;
113     pid_t local_pid= get_pid_from_file(pid_file(), error_message);
114     if (is_pid_valid(local_pid) == false)
115     {
116       Error << error_message.str();
117       return false;
118     }
119 
120     // Use kill to determine is the process exist
121     if (::kill(local_pid, 0) == 0)
122     {
123       return true;
124     }
125 
126     return false;
127   }
128 
name()129   const char *name()
130   {
131     return "blobslap_worker";
132   };
133 
has_port_option() const134   bool has_port_option() const
135   {
136     return true;
137   }
138 
has_log_file_option() const139   bool has_log_file_option() const
140   {
141     return true;
142   }
143 
is_libtool()144   bool is_libtool()
145   {
146     return true;
147   }
148 
149   bool build();
150 };
151 
152 
153 #include <sstream>
154 
build()155 bool BlobslapWorker::build()
156 {
157   return true;
158 }
159 
build_blobslap_worker(in_port_t try_port)160 Server *build_blobslap_worker(in_port_t try_port)
161 {
162   return new BlobslapWorker(try_port);
163 }
164 
165 } // namespace libtest
166