diff options
| author | vinayak hegde <vinayak@gluster.com> | 2009-10-05 05:21:58 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2009-10-05 05:16:47 -0700 | 
| commit | 7e6c9643e69e1f8172e5be3564213d35332ae099 (patch) | |
| tree | 0fd035512fa873e3866edf20c123e85bc67ccc09 | |
| parent | 8e0f5e7105c0d03b50a9342f4285a985b9cdb090 (diff) | |
glusterfsd.c: Pipe is used during daemonization as ipc.
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 117 (Wrong command line does not throw error)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=117
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 195 | 
1 files changed, 91 insertions, 104 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index 19bb787abd4..947ab878a9f 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -24,6 +24,7 @@  #include <sys/socket.h>  #include <sys/types.h>  #include <sys/resource.h> +#include <sys/file.h>  #include <netdb.h>  #include <signal.h>  #include <libgen.h> @@ -166,85 +167,54 @@ static struct argp_option gf_options[] = {  static struct argp argp = { gf_options, parse_opts, argp_doc, gf_doc }; -/* Make use of semaphore to synchronize daemonization */ +/* Make use of pipe to synchronize daemonization */  int -gf_daemon (sem_t **sem_id) +gf_daemon (int *pipe_fd)  {          pid_t		pid = -1; -        struct timespec time_out_value; -        char 		sem_name[28] = { 0 }; -	sem_t           *semid = SEM_FAILED; - -        snprintf (sem_name, sizeof (sem_name), -                  "%s-%d", "/gluster-semaphore", getpid ()); - -        if ((semid = sem_open (sem_name, O_CREAT | O_EXCL,0666, 0)) < 0) { -                if (errno == EEXIST) { -                 /* if stale semaphore exists unlink it first and -		    create again */ -                        if (sem_unlink (sem_name) < 0) { -			        gf_log ("glusterfs", GF_LOG_ERROR, -					"stale semaphore unlink error: %s", -					 strerror (errno)); -                                return -1; -                        } +        int             ret = -1; +        char            gf_daemon_buff[50] = {0,}; -                        semid = sem_open (sem_name, O_CREAT | O_EXCL, -					  0666, 0); -                } - -		if (semid == SEM_FAILED) { -			gf_log ("glusterfs", GF_LOG_ERROR, -				"semaphore create error: %s", -				 strerror (errno)); -                        return -1; -                } +        if (pipe (pipe_fd) < 0) { +                gf_log ("glusterfs", GF_LOG_ERROR, +                        "pipe creation error- %s", strerror (errno)); +                return -1;          } -	*sem_id = semid; -          if ((pid = fork ()) < 0) {  	        gf_log ("glusterfs", GF_LOG_ERROR, "fork error: %s",  			strerror (errno));                  return -1;          } else if (pid != 0) { -              /* parent process waits on semaphore until its value is > 0 */ -                time_out_value.tv_sec = 100; -                time_out_value.tv_nsec = 0; - -                if ((sem_timedwait (semid, &time_out_value) < 0) -				&& (errno != ETIMEDOUT)) { +                close (pipe_fd[1]); +                ret = read (pipe_fd[0], gf_daemon_buff, +                            sizeof (gf_daemon_buff)); +                if (ret == -1) {                          gf_log ("glusterfs", GF_LOG_ERROR, -				"semaphore wait error: %s", -				strerror (errno)); -                        return -1; -                } - -                if (sem_close (semid) < 0) { -		        gf_log ("glusterfs", GF_LOG_ERROR, -				"close semaphore error: %s", -				strerror (errno)); -                        return -1; -                } - -                if (sem_unlink (sem_name) < 0) { -		        gf_log ("glusterfs", GF_LOG_ERROR, -				"semaphore unlink error: %s", -				strerror (errno)); +                                "read error on pipe- %s", strerror (errno)); +                        return ret; +                } else if (ret == 0) { +                        gf_log ("glusterfs", GF_LOG_ERROR, +                                "end of file- %s", strerror (errno));                          return -1; +                } else { +                        if (!strncmp (gf_daemon_buff, "0", 1)) +                                exit (EXIT_SUCCESS); +                        else { +                                fprintf (stderr, "%s\n", gf_daemon_buff); +                                exit (EXIT_FAILURE); +                        }                  } - -                exit(0);          }          /*child continues*/ +        close (pipe_fd[0]);  	if (daemon (0, 0) == -1) {  		gf_log ("glusterfs", GF_LOG_ERROR,  			"unable to run in daemon mode: %s",  			strerror (errno));  		return -1;  	} -          return 0;  } @@ -958,7 +928,7 @@ cleanup_and_exit (int signum)  	gf_log ("glusterfs", GF_LOG_WARNING, "shutting down");  	if (ctx->pidfp) { -		gf_unlockfd (fileno (ctx->pidfp)); +		flock (fileno (ctx->pidfp), LOCK_UN);  		fclose (ctx->pidfp);  		ctx->pidfp = NULL;  	} @@ -1122,7 +1092,7 @@ main (int argc, char *argv[])  	int               fuse_volume_found = 0;  	int               xl_count = 0;  	uint8_t           process_mode = 0; -        sem_t            *semid = SEM_FAILED; +        int               pipe_fd[2];          ret = glusterfs_globals_init ();          if (ret) @@ -1174,37 +1144,8 @@ main (int argc, char *argv[])  	ERR_ABORT (ctx->pool);  	LOCK_INIT (&pool->lock);  	INIT_LIST_HEAD (&pool->all_frames); -	 - 	if (cmd_args->pid_file != NULL) { - 		ctx->pidfp = fopen (cmd_args->pid_file, "a+"); - 		if (ctx->pidfp == NULL) { - 			fprintf (stderr,  -				 "unable to open pid file %s. %s. exiting\n",  -				 cmd_args->pid_file, strerror (errno)); - 			/* do cleanup and exit ?! */ - 			return -1; - 		} - 		ret = gf_lockfd (fileno (ctx->pidfp)); - 		if (ret == -1) { - 			fprintf (stderr, "unable to lock pid file %s. %s. " -				 "Is another instance of %s running?!\n" - 				 "exiting\n", cmd_args->pid_file,  -				 strerror (errno), argv[0]); - 			fclose (ctx->pidfp); - 			return -1; - 		} - 		ret = ftruncate (fileno (ctx->pidfp), 0); - 		if (ret == -1) { - 			fprintf (stderr,  -				 "unable to truncate file %s. %s. exiting\n",  -				 cmd_args->pid_file, strerror (errno)); - 			gf_unlockfd (fileno (ctx->pidfp)); - 			fclose (ctx->pidfp); - 			return -1; - 		} - 	} -	 -	/* initializing logs */ + +        /* initializing logs */  	if (cmd_args->run_id) {  		ret = stat (cmd_args->log_file, &stbuf);  		/* If its /dev/null, or /dev/stdout, /dev/stderr,  @@ -1317,7 +1258,7 @@ main (int argc, char *argv[])  	/* daemonize now */  	if (!cmd_args->no_daemon_mode) { -                if (gf_daemon (&semid) == -1) { +                if (gf_daemon (pipe_fd) == -1) {  			gf_log ("glusterfs", GF_LOG_ERROR,  				"unable to run in daemon mode: %s",  				strerror (errno)); @@ -1326,14 +1267,57 @@ main (int argc, char *argv[])  		/* we are daemon now */                  _gf_dump_details (argc, argv); +                if (cmd_args->pid_file != NULL) { +                        ctx->pidfp = fopen (cmd_args->pid_file, "a+"); +                        if (ctx->pidfp == NULL) { +                                gf_log ("glusterfs", GF_LOG_ERROR, +                                        "unable to open pid file %s, %s.", +                                        cmd_args->pid_file, +                                        strerror (errno)); +                                if (write (pipe_fd[1], strerror (errno), +                                           strlen (strerror (errno))) < 0) { +                                        gf_log ("glusterfs", GF_LOG_ERROR, +                                                "Write on pipe error"); +                                } +                                /* do cleanup and exit ?! */ +                                return -1; +                        } +                        ret = flock (fileno (ctx->pidfp), +                                     (LOCK_EX | LOCK_NB)); +                        if (ret == -1) { +                                gf_log ("glusterfs", GF_LOG_ERROR, +                                       "Is another instance of %s running?", +                                        argv[0]); +                                fclose (ctx->pidfp); +                                if (write (pipe_fd[1], strerror (errno), +                                           strlen (strerror (errno))) < 0) { +                                        gf_log ("glusterfs", GF_LOG_ERROR, +                                                "Write on pipe error"); +                                } +                                return ret; +                        } +                        ret = ftruncate (fileno (ctx->pidfp), 0); +                        if (ret == -1) { +                                gf_log ("glusterfs", GF_LOG_ERROR, +                                        "unable to truncate file %s. %s.", +                                        cmd_args->pid_file, +                                        strerror (errno)); +                                flock (fileno (ctx->pidfp), LOCK_UN); +                                fclose (ctx->pidfp); +                                if (write (pipe_fd[1], strerror (errno), +                                           strlen (strerror (errno))) < 0) { +                                        gf_log ("glusterfs", GF_LOG_ERROR, +                                                "Write on pipe error"); +                                } +                                return ret; +                        } - 		/* update pid file, if given */ - 		if (cmd_args->pid_file != NULL) { - 			fprintf (ctx->pidfp, "%d\n", getpid ()); - 			fflush (ctx->pidfp); - 			/* we close pid file on exit */ - 		} -	} else { +                        /* update pid file, if given */ +                        fprintf (ctx->pidfp, "%d\n", getpid ()); +                        fflush (ctx->pidfp); +                        /* we close pid file on exit */ +                } +        } else {                  /*                   * Need to have this line twice because PID is different                   * in daemon and non-daemon cases. @@ -1358,12 +1342,14 @@ main (int argc, char *argv[])  	if (glusterfs_graph_init (graph, fuse_volume_found) != 0) {  		gf_log ("glusterfs", GF_LOG_ERROR,  			"translator initialization failed.  exiting"); -		if (!cmd_args->no_daemon_mode && (sem_post (semid) < 0)) { +		if (!cmd_args->no_daemon_mode && +                    (write (pipe_fd[1], strerror (errno), +                            strlen (strerror (errno))) < 0)) {  			gf_log ("glusterfs", GF_LOG_ERROR, -                                "semaphore synchronization failed," -                                " daemonize problem.exiting: %s", +                                "Write on pipe failed," +                                "daemonize problem.exiting: %s",                                   strerror (errno)); -		} +                                 }  		return -1;  	} @@ -1372,10 +1358,11 @@ main (int argc, char *argv[])  	gf_log ("glusterfs", GF_LOG_NORMAL, "Successfully started"); -	if (!cmd_args->no_daemon_mode && (sem_post (semid) < 0)) { +	if (!cmd_args->no_daemon_mode && +            (write (pipe_fd[1], "0", 2) < 0)) {  		gf_log ("glusterfs", GF_LOG_ERROR, -                        "semaphore synchronization failed," -                        " daemonize problem.  exiting: %s", +                        "Write on pipe failed," +                        "daemonize problem.  exiting: %s",                           strerror (errno));  		return -1;  	}  | 
