From 4363757e38e4625de8a49cc3cbd8f04aa51a4167 Mon Sep 17 00:00:00 2001 Message-Id: <4363757e38e4625de8a49cc3cbd8f04aa51a4167.1715416003.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 6 Jan 2008 21:27:38 +0000 Subject: [PATCH] When shutting down, kill -rescan and wait for it to finish. If -rescan outlives -deadlock then it can deadlock with a later processes that access the database. Organization: Straylight/Edgeware From: Richard Kettlewell --- lib/trackdb.c | 16 ++++++++++++---- server/rescan.c | 2 +- server/state.c | 3 ++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/trackdb.c b/lib/trackdb.c index f5d5836..5bf2fed 100644 --- a/lib/trackdb.c +++ b/lib/trackdb.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2005, 2006, 2007 Richard Kettlewell + * Copyright (C) 2005-2008 Richard Kettlewell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -318,10 +318,18 @@ void trackdb_deinit(void) { if((err = trackdb_env->close(trackdb_env, 0))) fatal(0, "trackdb_env->close: %s", db_strerror(err)); - if(rescan_pid != -1 && kill(rescan_pid, SIGTERM) < 0) - fatal(errno, "error killing rescanner"); + if(rescan_pid != -1) { + /* shut down the rescanner */ + if(kill(rescan_pid, SIGTERM) < 0) + fatal(errno, "error killing rescanner"); + /* wait for the rescanner to finish */ + while(waitpid(rescan_pid, &err, 0) == -1 && errno == EINTR) + ; + } + + /* TODO kill any stats subprocesses */ - /* terminate the deadlock manager */ + /* finally terminate the deadlock manager */ if(db_deadlock_pid != -1 && kill(db_deadlock_pid, SIGTERM) < 0) fatal(errno, "error killing deadlock manager"); db_deadlock_pid = -1; diff --git a/server/rescan.c b/server/rescan.c index 47dcf99..e1193c9 100644 --- a/server/rescan.c +++ b/server/rescan.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2005, 2006, 2007 Richard Kettlewell + * Copyright (C) 2005-2008 Richard Kettlewell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/server/state.c b/server/state.c index 16fc1a3..3386cd4 100644 --- a/server/state.c +++ b/server/state.c @@ -54,10 +54,11 @@ static struct addrinfo *current_listen_addrinfo; static int current_listen_fd; void quit(ev_source *ev) { + info("shutting down..."); quitting(ev); trackdb_close(); trackdb_deinit(); - info("terminating"); + info("exiting"); exit(0); } -- [mdw]