1
0
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:
Patrick Caulfield 2006-11-30 09:44:07 +00:00
parent 9a81f9fe3f
commit bd8be78c09
2 changed files with 68 additions and 35 deletions

View File

@ -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.

View File

@ -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)) {