]> sourceware.org Git - lvm2.git/commitdiff
Better shutdown for clvmd
authorZdenek Kabelac <zkabelac@redhat.com>
Wed, 30 Mar 2011 12:36:19 +0000 (12:36 +0000)
committerZdenek Kabelac <zkabelac@redhat.com>
Wed, 30 Mar 2011 12:36:19 +0000 (12:36 +0000)
'a small step' towards cleaner shutdown sequence.
Normally clvmd doens't care about unreleased memory on exit -
but for valgrind testing it's better to have them cleaned all.

So - few things are left on exit path - this patch starts to remove
just some of them.

1. lvm_thread_fs is made as a thread which could be joined on exit()
2. memory allocated to local_clien_head list is released.
   (this part is somewhat more complex if the proper reaction is
   needed - and as it requires some heavier code moving - it will
   be resolved later.

WHATS_NEW
daemons/clvmd/clvmd.c

index 39c051c782e474ba9343af5c32863cbf0aaa191d..2595bfe3dbc166698d0f35c2ffc0179a9565ebcc 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.85 - 
 ===================================
+  Support regular quit of the lvm_thread_fn function in clvmd.
   Fix reading of unallocated memory in lvm1 format import function.
   Replace several strncmp() calls with id_equal().
   Fix lvmcache_info transfer to orphan_vginfo in _lvmcache_update_vgname().
index fb3cc4f445381b2825dbe0c9c06b119ebc6d40b0..d3ba507959b6d297807dad8d84a5720422313c30 100644 (file)
@@ -103,8 +103,6 @@ static int child_pipe[2];
 
 typedef enum {IF_AUTO, IF_CMAN, IF_GULM, IF_OPENAIS, IF_COROSYNC, IF_SINGLENODE} if_type_t;
 
-typedef void *(lvm_pthread_fn_t)(void*);
-
 /* Prototypes for code further down */
 static void sigusr2_handler(int sig);
 static void sighup_handler(int sig);
@@ -134,7 +132,7 @@ static int check_all_clvmds_running(struct local_client *client);
 static int local_rendezvous_callback(struct local_client *thisfd, char *buf,
                                     int len, const char *csid,
                                     struct local_client **new_client);
-static void lvm_thread_fn(void *) __attribute__ ((noreturn));
+static void *lvm_thread_fn(void *);
 static int add_to_lvmqueue(struct local_client *client, struct clvm_header *msg,
                           int msglen, const char *csid);
 static int distribute_command(struct local_client *thisfd);
@@ -333,7 +331,7 @@ static void check_permissions(void)
 int main(int argc, char *argv[])
 {
        int local_sock;
-       struct local_client *newfd;
+       struct local_client *newfd, *delfd;
        struct utsname nodeinfo;
        struct lvm_startup_params lvm_params;
        int opt;
@@ -581,8 +579,7 @@ int main(int argc, char *argv[])
        pthread_mutex_lock(&lvm_start_mutex);
        lvm_params.using_gulm = using_gulm;
        lvm_params.argv = argv;
-       pthread_create(&lvm_thread, NULL, (lvm_pthread_fn_t*)lvm_thread_fn,
-                       (void *)&lvm_params);
+       pthread_create(&lvm_thread, NULL, lvm_thread_fn, &lvm_params);
 
        /* Tell the rest of the cluster our version number */
        /* CMAN can do this immediately, gulm needs to wait until
@@ -601,9 +598,27 @@ int main(int argc, char *argv[])
        /* Do some work */
        main_loop(local_sock, cmd_timeout);
 
+       pthread_mutex_lock(&lvm_thread_mutex);
+       pthread_cond_signal(&lvm_thread_cond);
+       pthread_mutex_unlock(&lvm_thread_mutex);
+       if ((errno = pthread_join(lvm_thread, NULL)))
+               log_sys_error("pthread_join", "");
+
        close_local_sock(local_sock);
        destroy_lvm();
 
+       for (newfd = local_client_head.next; newfd != NULL;) {
+               delfd = newfd;
+               newfd = newfd->next;
+               /*
+                * FIXME:
+                * needs cleanup code from read_from_local_sock() for now
+                * break of 'clvmd' may access already free memory here.
+                */
+               safe_close(&(delfd->fd));
+               free(delfd);
+       }
+
        return 0;
 }
 
@@ -1932,7 +1947,7 @@ static int process_work_item(struct lvm_thread_cmd *cmd)
 /*
  * Routine that runs in the "LVM thread".
  */
-static void lvm_thread_fn(void *arg)
+static void *lvm_thread_fn(void *arg)
 {
        struct dm_list *cmdl, *tmp;
        sigset_t ss;
@@ -1953,7 +1968,7 @@ static void lvm_thread_fn(void *arg)
        pthread_mutex_unlock(&lvm_start_mutex);
 
        /* Now wait for some actual work */
-       for (;;) {
+       while (!quit) {
                DEBUGLOG("LVM thread waiting for work\n");
 
                pthread_mutex_lock(&lvm_thread_mutex);
@@ -1976,6 +1991,8 @@ static void lvm_thread_fn(void *arg)
                }
                pthread_mutex_unlock(&lvm_thread_mutex);
        }
+
+       pthread_exit(NULL);
 }
 
 /* Pass down some work to the LVM thread */
This page took 0.050928 seconds and 5 git commands to generate.