|
|
@ -225,6 +225,98 @@ out: |
|
|
|
return NULL; |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void send_client(conn_instance_t *ci, int id, const char *buf) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int fd = -1, ret, len, ofs = 0; |
|
|
|
|
|
|
|
client_instance_t *client; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!buf)) { |
|
|
|
|
|
|
|
LOGWARNING("Connector send_client sent a null buffer"); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
len = strlen(buf); |
|
|
|
|
|
|
|
if (unlikely(!len)) { |
|
|
|
|
|
|
|
LOGWARNING("Connector send_client sent a zero length buffer"); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ck_rlock(&ci->lock); |
|
|
|
|
|
|
|
HASH_FIND_INT(clients, &id, client); |
|
|
|
|
|
|
|
if (likely(client)) |
|
|
|
|
|
|
|
fd = client->fd; |
|
|
|
|
|
|
|
ck_runlock(&ci->lock); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(fd == -1)) { |
|
|
|
|
|
|
|
if (client) |
|
|
|
|
|
|
|
LOGWARNING("Client id %d disconnected", id); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
LOGWARNING("Connector failed to find client id %d", id); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (len) { |
|
|
|
|
|
|
|
ret = send(fd, buf + ofs, len , 0); |
|
|
|
|
|
|
|
if (unlikely(ret < 0)) { |
|
|
|
|
|
|
|
if (interrupted()) |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
LOGWARNING("Client id %d disconnected", id); |
|
|
|
|
|
|
|
invalidate_client(client); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ofs += ret; |
|
|
|
|
|
|
|
len -= ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int connector_loop(ckpool_t *ckp, proc_instance_t *pi, conn_instance_t *ci) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int sockd, client_id, ret = 0; |
|
|
|
|
|
|
|
unixsock_t *us = &pi->us; |
|
|
|
|
|
|
|
char *buf = NULL; |
|
|
|
|
|
|
|
json_t *json_msg; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
retry: |
|
|
|
|
|
|
|
dealloc(buf); |
|
|
|
|
|
|
|
sockd = accept(us->sockd, NULL, NULL); |
|
|
|
|
|
|
|
if (sockd < 0) { |
|
|
|
|
|
|
|
if (interrupted()) |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
LOGERR("Failed to accept on connector socket"); |
|
|
|
|
|
|
|
ret = 1; |
|
|
|
|
|
|
|
goto out; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
buf = recv_unix_msg(sockd); |
|
|
|
|
|
|
|
if (!buf) { |
|
|
|
|
|
|
|
LOGWARNING("Failed to get message in connector_loop"); |
|
|
|
|
|
|
|
close(sockd); |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
LOGDEBUG("Connector received message: %s", buf); |
|
|
|
|
|
|
|
if (!strncasecmp(buf, "shutdown", 8)) |
|
|
|
|
|
|
|
goto out; |
|
|
|
|
|
|
|
json_msg = json_loads(buf, 0, NULL); |
|
|
|
|
|
|
|
if (unlikely(!json_msg)) { |
|
|
|
|
|
|
|
LOGWARNING("Invalid json message: %s", buf); |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Extract the client id from the json message and remove its entry */ |
|
|
|
|
|
|
|
client_id = json_integer_value(json_object_get(json_msg, "client_id")); |
|
|
|
|
|
|
|
json_object_del(json_msg, "client_id"); |
|
|
|
|
|
|
|
dealloc(buf); |
|
|
|
|
|
|
|
buf = json_dumps(json_msg, 0); |
|
|
|
|
|
|
|
realloc_strcat(&buf, "\n"); |
|
|
|
|
|
|
|
send_client(ci, client_id, buf); |
|
|
|
|
|
|
|
json_decref(json_msg); |
|
|
|
|
|
|
|
close(sockd); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
dealloc(buf); |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int connector(proc_instance_t *pi) |
|
|
|
int connector(proc_instance_t *pi) |
|
|
|
{ |
|
|
|
{ |
|
|
|
pthread_t pth_acceptor, pth_receiver; |
|
|
|
pthread_t pth_acceptor, pth_receiver; |
|
|
@ -282,8 +374,9 @@ int connector(proc_instance_t *pi) |
|
|
|
create_pthread(&pth_acceptor, acceptor, &ci); |
|
|
|
create_pthread(&pth_acceptor, acceptor, &ci); |
|
|
|
create_pthread(&pth_receiver, receiver, &ci); |
|
|
|
create_pthread(&pth_receiver, receiver, &ci); |
|
|
|
|
|
|
|
|
|
|
|
join_pthread(pth_acceptor); |
|
|
|
ret = connector_loop(ckp, pi, &ci); |
|
|
|
ret = 1; |
|
|
|
|
|
|
|
|
|
|
|
//join_pthread(pth_acceptor);
|
|
|
|
out: |
|
|
|
out: |
|
|
|
LOGINFO("%s connector exiting with return code %d", ckp->name, ret); |
|
|
|
LOGINFO("%s connector exiting with return code %d", ckp->name, ret); |
|
|
|
if (ret) { |
|
|
|
if (ret) { |
|
|
|