mirror of
https://github.com/fluencelabs/redis
synced 2025-06-15 02:01:21 +00:00
Merge pull request #6052 from jtru/better-systemd-integration-v2
Better systemd integration v2
This commit is contained in:
79
src/server.c
79
src/server.c
@ -3558,6 +3558,8 @@ int prepareForShutdown(int flags) {
|
||||
int nosave = flags & SHUTDOWN_NOSAVE;
|
||||
|
||||
serverLog(LL_WARNING,"User requested shutdown...");
|
||||
if (server.supervised_mode == SUPERVISED_SYSTEMD)
|
||||
redisCommunicateSystemd("STOPPING=1\n");
|
||||
|
||||
/* Kill all the Lua debugger forked sessions. */
|
||||
ldbKillForkedSessions();
|
||||
@ -3599,6 +3601,8 @@ int prepareForShutdown(int flags) {
|
||||
/* Create a new RDB file before exiting. */
|
||||
if ((server.saveparamslen > 0 && !nosave) || save) {
|
||||
serverLog(LL_NOTICE,"Saving the final RDB snapshot before exiting.");
|
||||
if (server.supervised_mode == SUPERVISED_SYSTEMD)
|
||||
redisCommunicateSystemd("STATUS=Saving the final RDB snapshot\n");
|
||||
/* Snapshotting. Perform a SYNC SAVE and exit */
|
||||
rdbSaveInfo rsi, *rsiptr;
|
||||
rsiptr = rdbPopulateSaveInfo(&rsi);
|
||||
@ -3609,6 +3613,8 @@ int prepareForShutdown(int flags) {
|
||||
* saving aborted, handling special stuff like slaves pending for
|
||||
* synchronization... */
|
||||
serverLog(LL_WARNING,"Error trying to save the DB, can't exit.");
|
||||
if (server.supervised_mode == SUPERVISED_SYSTEMD)
|
||||
redisCommunicateSystemd("STATUS=Error trying to save the DB, can't exit.\n");
|
||||
return C_ERR;
|
||||
}
|
||||
}
|
||||
@ -4774,61 +4780,19 @@ int redisSupervisedUpstart(void) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int redisSupervisedSystemd(void) {
|
||||
int redisCommunicateSystemd(const char *sd_notify_msg) {
|
||||
const char *notify_socket = getenv("NOTIFY_SOCKET");
|
||||
int fd = 1;
|
||||
struct sockaddr_un su;
|
||||
struct iovec iov;
|
||||
struct msghdr hdr;
|
||||
int sendto_flags = 0;
|
||||
|
||||
if (!notify_socket) {
|
||||
serverLog(LL_WARNING,
|
||||
"systemd supervision requested, but NOTIFY_SOCKET not found");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((strchr("@/", notify_socket[0])) == NULL || strlen(notify_socket) < 2) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
serverLog(LL_NOTICE, "supervised by systemd, will signal readiness");
|
||||
if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) {
|
||||
serverLog(LL_WARNING,
|
||||
"Can't connect to systemd socket %s", notify_socket);
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(&su, 0, sizeof(su));
|
||||
su.sun_family = AF_UNIX;
|
||||
strncpy (su.sun_path, notify_socket, sizeof(su.sun_path) -1);
|
||||
su.sun_path[sizeof(su.sun_path) - 1] = '\0';
|
||||
|
||||
if (notify_socket[0] == '@')
|
||||
su.sun_path[0] = '\0';
|
||||
|
||||
memset(&iov, 0, sizeof(iov));
|
||||
iov.iov_base = "READY=1";
|
||||
iov.iov_len = strlen("READY=1");
|
||||
|
||||
memset(&hdr, 0, sizeof(hdr));
|
||||
hdr.msg_name = &su;
|
||||
hdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) +
|
||||
strlen(notify_socket);
|
||||
hdr.msg_iov = &iov;
|
||||
hdr.msg_iovlen = 1;
|
||||
|
||||
unsetenv("NOTIFY_SOCKET");
|
||||
#ifdef HAVE_MSG_NOSIGNAL
|
||||
sendto_flags |= MSG_NOSIGNAL;
|
||||
#endif
|
||||
if (sendmsg(fd, &hdr, sendto_flags) < 0) {
|
||||
serverLog(LL_WARNING, "Can't send notification to systemd");
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
close(fd);
|
||||
return 1;
|
||||
#ifdef HAVE_LIBSYSTEMD
|
||||
(void) sd_notify(0, sd_notify_msg);
|
||||
#else
|
||||
UNUSED(sd_notify_msg);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int redisIsSupervised(int mode) {
|
||||
@ -4839,12 +4803,17 @@ int redisIsSupervised(int mode) {
|
||||
if (upstart_job) {
|
||||
redisSupervisedUpstart();
|
||||
} else if (notify_socket) {
|
||||
redisSupervisedSystemd();
|
||||
server.supervised_mode = SUPERVISED_SYSTEMD;
|
||||
serverLog(LL_WARNING,
|
||||
"WARNING auto-supervised by systemd - you MUST set appropriate values for TimeoutStartSec and TimeoutStopSec in your service unit.");
|
||||
return redisCommunicateSystemd("STATUS=Redis is loading...\n");
|
||||
}
|
||||
} else if (mode == SUPERVISED_UPSTART) {
|
||||
return redisSupervisedUpstart();
|
||||
} else if (mode == SUPERVISED_SYSTEMD) {
|
||||
return redisSupervisedSystemd();
|
||||
serverLog(LL_WARNING,
|
||||
"WARNING supervised by systemd - you MUST set appropriate values for TimeoutStartSec and TimeoutStopSec in your service unit.");
|
||||
return redisCommunicateSystemd("STATUS=Redis is loading...\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -5037,6 +5006,14 @@ int main(int argc, char **argv) {
|
||||
serverLog(LL_NOTICE,"Ready to accept connections");
|
||||
if (server.sofd > 0)
|
||||
serverLog(LL_NOTICE,"The server is now ready to accept connections at %s", server.unixsocket);
|
||||
if (server.supervised_mode == SUPERVISED_SYSTEMD) {
|
||||
if (!server.masterhost) {
|
||||
redisCommunicateSystemd("STATUS=Ready to accept connections\n");
|
||||
redisCommunicateSystemd("READY=1\n");
|
||||
} else {
|
||||
redisCommunicateSystemd("STATUS=Waiting for MASTER <-> REPLICA sync\n");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
InitServerLast();
|
||||
sentinelIsRunning();
|
||||
|
Reference in New Issue
Block a user