Startup, and shutdown the memcached servers.
*/
-#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT+10
+#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT+10
#include "config.h"
#include <assert.h>
#include <signal.h>
#include <libmemcached/memcached.h>
+#include <libmemcached/util.h>
#include <unistd.h>
+#include <sys/time.h>
+
#include "server.h"
void server_startup(server_startup_st *construct)
{
- unsigned int x;
-
if ((construct->server_list= getenv("MEMCACHED_SERVERS")))
{
printf("servers %s\n", construct->server_list);
char *end_ptr;
end_ptr= server_string_buffer;
- for (x= 0; x < construct->count; x++)
+ for (uint32_t x= 0; x < construct->count; x++)
{
char buffer[1024]; /* Nothing special for number */
int count;
int status;
+ in_port_t port;
+
+ {
+ char *var;
+ char variable_buffer[1024];
+
+ snprintf(variable_buffer, sizeof(variable_buffer), "LIBMEMCACHED_PORT_%u", x);
+
+ if ((var= getenv(variable_buffer)))
+ {
+ port= (in_port_t)atoi(var);
+ }
+ else
+ {
+ port= (in_port_t)(x + TEST_PORT_BASE);
+ }
+ }
sprintf(buffer, "/tmp/%umemc.pid", x);
- if (access(buffer, F_OK) == 0)
+ if (access(buffer, F_OK) == 0)
{
FILE *fp= fopen(buffer, "r");
remove(buffer);
if (fp != NULL)
{
if (fgets(buffer, sizeof(buffer), fp) != NULL)
- {
+ {
pid_t pid= (pid_t)atoi(buffer);
- if (pid != 0)
+ if (pid != 0)
kill(pid, SIGTERM);
}
if (x == 0)
{
- sprintf(buffer, "%s -d -P /tmp/%umemc.pid -t 1 -p %u -U %u -m 128",
- MEMCACHED_BINARY, x, x + TEST_PORT_BASE, x + TEST_PORT_BASE);
- }
+ sprintf(buffer, "%s -d -u root -P /tmp/%umemc.pid -t 1 -p %u -U %u -m 128",
+ MEMCACHED_BINARY, x, port, port);
+ }
else
{
- sprintf(buffer, "%s -d -P /tmp/%umemc.pid -t 1 -p %u -U %u",
- MEMCACHED_BINARY, x, x + TEST_PORT_BASE, x + TEST_PORT_BASE);
+ sprintf(buffer, "%s -d -u root -P /tmp/%umemc.pid -t 1 -p %u -U %u",
+ MEMCACHED_BINARY, x, port, port);
}
- fprintf(stderr, "STARTING SERVER: %s\n", buffer);
- status= system(buffer);
- count= sprintf(end_ptr, "localhost:%u,", x + TEST_PORT_BASE);
+ if (libmemcached_util_ping("localhost", port, NULL))
+ {
+ fprintf(stderr, "Server on port %u already exists\n", port);
+ }
+ else
+ {
+ status= system(buffer);
+ fprintf(stderr, "STARTING SERVER: %s status:%d\n", buffer, status);
+ }
+ count= sprintf(end_ptr, "localhost:%u,", port);
end_ptr+= count;
}
*end_ptr= 0;
+ for (uint32_t x= 0; x < construct->count; x++)
+ {
+ uint32_t counter= 3;
+ char buffer[1024]; /* Nothing special for number */
+
+ snprintf(buffer, sizeof(buffer), "/tmp/%umemc.pid", x);
+
+ while (--counter)
+ {
+ int memcached_pid;
+
+ FILE *file;
+ file= fopen(buffer, "r");
+ if (file == NULL)
+ {
+#ifndef WIN32
+ struct timespec req= { .tv_sec= 0, .tv_nsec= 5000 };
+ nanosleep(&req, NULL);
+#endif
+ continue;
+ }
+ char *found= fgets(buffer, sizeof(buffer), file);
+ if (!found)
+ {
+ abort();
+ }
+ // Yes, we currently pitch this and don't make use of it.
+ memcached_pid= atoi(buffer);
+ fclose(file);
+ }
+
+
+ }
+
construct->server_list= strdup(server_string_buffer);
}
printf("servers %s\n", construct->server_list);
srandom((unsigned int)time(NULL));
- for (x= 0; x < memcached_server_list_count(construct->servers); x++)
+ for (uint32_t x= 0; x < memcached_server_list_count(construct->servers); x++)
{
- printf("\t%s : %d\n", construct->servers[x].hostname, construct->servers[x].port);
+ printf("\t%s : %d\n", memcached_server_name(&construct->servers[x]), memcached_server_port(&construct->servers[x]));
assert(construct->servers[x].fd == -1);
assert(construct->servers[x].cursor_active == 0);
}
void server_shutdown(server_startup_st *construct)
{
- unsigned int x;
-
if (construct->server_list)
{
- for (x= 0; x < construct->count; x++)
+ for (uint32_t x= 0; x < construct->count; x++)
{
char buffer[1024]; /* Nothing special for number */
sprintf(buffer, "cat /tmp/%umemc.pid | xargs kill", x);
/* We have to check the return value of this or the compiler will yell */
int sys_ret= system(buffer);
- assert(sys_ret != -1);
+ assert(sys_ret != -1);
sprintf(buffer, "/tmp/%umemc.pid", x);
unlink(buffer);
}