mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-10 16:58:47 +03:00
Better shutdown for clvmd
'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.
This commit is contained in:
parent
142d2e8740
commit
e3cce4b66a
@ -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().
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user