mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-03 05:18:29 +03:00
Add -T (startup timeout) switch to clvmd
This commit is contained in:
parent
9a81f9fe3f
commit
bd8be78c09
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.16 -
|
Version 2.02.16 -
|
||||||
====================================
|
====================================
|
||||||
|
Add -T (startup timeout) switch to clvmd.
|
||||||
Improve lvm_dump.sh robustness.
|
Improve lvm_dump.sh robustness.
|
||||||
Update lvm2create_initrd to support gentoo.
|
Update lvm2create_initrd to support gentoo.
|
||||||
|
|
||||||
|
@ -99,6 +99,7 @@ static int child_pipe[2];
|
|||||||
#define DFAIL_LOCAL_SOCK 2
|
#define DFAIL_LOCAL_SOCK 2
|
||||||
#define DFAIL_CLUSTER_IF 3
|
#define DFAIL_CLUSTER_IF 3
|
||||||
#define DFAIL_MALLOC 4
|
#define DFAIL_MALLOC 4
|
||||||
|
#define DFAIL_TIMEOUT 5
|
||||||
#define SUCCESS 0
|
#define SUCCESS 0
|
||||||
|
|
||||||
/* Prototypes for code further down */
|
/* Prototypes for code further down */
|
||||||
@ -122,7 +123,7 @@ static int process_reply(struct clvm_header *msg, int msglen, char *csid);
|
|||||||
static int open_local_sock(void);
|
static int open_local_sock(void);
|
||||||
static struct local_client *find_client(int clientid);
|
static struct local_client *find_client(int clientid);
|
||||||
static void main_loop(int local_sock, int cmd_timeout);
|
static void main_loop(int local_sock, int cmd_timeout);
|
||||||
static void be_daemon(void);
|
static void be_daemon(int start_timeout);
|
||||||
static int check_all_clvmds_running(struct local_client *client);
|
static int check_all_clvmds_running(struct local_client *client);
|
||||||
static int local_rendezvous_callback(struct local_client *thisfd, char *buf,
|
static int local_rendezvous_callback(struct local_client *thisfd, char *buf,
|
||||||
int len, char *csid,
|
int len, char *csid,
|
||||||
@ -146,6 +147,7 @@ static void usage(char *prog, FILE *file)
|
|||||||
fprintf(file, " -d Don't fork, run in the foreground\n");
|
fprintf(file, " -d Don't fork, run in the foreground\n");
|
||||||
fprintf(file, " -R Tell all running clvmds in the cluster to reload their device cache\n");
|
fprintf(file, " -R Tell all running clvmds in the cluster to reload their device cache\n");
|
||||||
fprintf(file, " -t<secs> Command timeout (default 60 seconds)\n");
|
fprintf(file, " -t<secs> Command timeout (default 60 seconds)\n");
|
||||||
|
fprintf(file, " -T<secs> Startup timeout (default none)\n");
|
||||||
fprintf(file, "\n");
|
fprintf(file, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,13 +171,14 @@ int main(int argc, char *argv[])
|
|||||||
signed char opt;
|
signed char opt;
|
||||||
int debug = 0;
|
int debug = 0;
|
||||||
int cmd_timeout = DEFAULT_CMD_TIMEOUT;
|
int cmd_timeout = DEFAULT_CMD_TIMEOUT;
|
||||||
|
int start_timeout = 0;
|
||||||
sigset_t ss;
|
sigset_t ss;
|
||||||
int using_gulm = 0;
|
int using_gulm = 0;
|
||||||
|
|
||||||
/* Deal with command-line arguments */
|
/* Deal with command-line arguments */
|
||||||
opterr = 0;
|
opterr = 0;
|
||||||
optind = 0;
|
optind = 0;
|
||||||
while ((opt = getopt(argc, argv, "?vVhdt:R")) != EOF) {
|
while ((opt = getopt(argc, argv, "?vVhdt:RT:")) != EOF) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(argv[0], stdout);
|
usage(argv[0], stdout);
|
||||||
@ -200,6 +203,14 @@ int main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'T':
|
||||||
|
start_timeout = atoi(optarg);
|
||||||
|
if (start_timeout <= 0) {
|
||||||
|
fprintf(stderr, "startup timeout is invalid\n");
|
||||||
|
usage(argv[0], stderr);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 'V':
|
case 'V':
|
||||||
printf("Cluster LVM daemon version: %s\n", LVM_VERSION);
|
printf("Cluster LVM daemon version: %s\n", LVM_VERSION);
|
||||||
@ -214,7 +225,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
/* Fork into the background (unless requested not to) */
|
/* Fork into the background (unless requested not to) */
|
||||||
if (!debug) {
|
if (!debug) {
|
||||||
be_daemon();
|
be_daemon(start_timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUGLOG("CLVMD started\n");
|
DEBUGLOG("CLVMD started\n");
|
||||||
@ -647,36 +658,23 @@ static void main_loop(int local_sock, int cmd_timeout)
|
|||||||
close(local_sock);
|
close(local_sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static void wait_for_child(int c_pipe, int timeout)
|
||||||
* Fork into the background and detach from our parent process.
|
|
||||||
* In the interests of user-friendliness we wait for the daemon
|
|
||||||
* to complete initialisation before returning its status
|
|
||||||
* the the user.
|
|
||||||
*/
|
|
||||||
static void be_daemon()
|
|
||||||
{
|
{
|
||||||
pid_t pid;
|
|
||||||
int child_status;
|
int child_status;
|
||||||
int devnull = open("/dev/null", O_RDWR);
|
int sstat;
|
||||||
if (devnull == -1) {
|
fd_set fds;
|
||||||
perror("Can't open /dev/null");
|
struct timeval tv = {timeout, 0};
|
||||||
exit(3);
|
|
||||||
|
FD_ZERO(&fds);
|
||||||
|
FD_SET(c_pipe, &fds);
|
||||||
|
|
||||||
|
sstat = select(c_pipe+1, &fds, NULL, NULL, timeout? &tv: NULL);
|
||||||
|
if (sstat == 0) {
|
||||||
|
fprintf(stderr, "clvmd startup timed out\n");
|
||||||
|
exit(DFAIL_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
if (sstat == 1) {
|
||||||
pipe(child_pipe);
|
if (read(c_pipe, &child_status, sizeof(child_status)) !=
|
||||||
|
|
||||||
switch (pid = fork()) {
|
|
||||||
case -1:
|
|
||||||
perror("clvmd: can't fork");
|
|
||||||
exit(2);
|
|
||||||
|
|
||||||
case 0: /* Child */
|
|
||||||
close(child_pipe[0]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: /* Parent */
|
|
||||||
close(child_pipe[1]);
|
|
||||||
if (read(child_pipe[0], &child_status, sizeof(child_status)) !=
|
|
||||||
sizeof(child_status)) {
|
sizeof(child_status)) {
|
||||||
|
|
||||||
fprintf(stderr, "clvmd failed in initialisation\n");
|
fprintf(stderr, "clvmd failed in initialisation\n");
|
||||||
@ -707,6 +705,40 @@ static void be_daemon()
|
|||||||
exit(child_status);
|
exit(child_status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fprintf(stderr, "clvmd startup, select failed: %s\n", strerror(errno));
|
||||||
|
exit(DFAIL_INIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fork into the background and detach from our parent process.
|
||||||
|
* In the interests of user-friendliness we wait for the daemon
|
||||||
|
* to complete initialisation before returning its status
|
||||||
|
* the the user.
|
||||||
|
*/
|
||||||
|
static void be_daemon(int timeout)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
int devnull = open("/dev/null", O_RDWR);
|
||||||
|
if (devnull == -1) {
|
||||||
|
perror("Can't open /dev/null");
|
||||||
|
exit(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
pipe(child_pipe);
|
||||||
|
|
||||||
|
switch (pid = fork()) {
|
||||||
|
case -1:
|
||||||
|
perror("clvmd: can't fork");
|
||||||
|
exit(2);
|
||||||
|
|
||||||
|
case 0: /* Child */
|
||||||
|
close(child_pipe[0]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: /* Parent */
|
||||||
|
close(child_pipe[1]);
|
||||||
|
wait_for_child(child_pipe[0], timeout);
|
||||||
|
}
|
||||||
|
|
||||||
/* Detach ourself from the calling environment */
|
/* Detach ourself from the calling environment */
|
||||||
if (close(0) || close(1) || close(2)) {
|
if (close(0) || close(1) || close(2)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user