From 2601e06512bce1434d7a89ba2034f32303837418 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 17 Sep 2021 12:20:15 +0200 Subject: [PATCH 1/3] mx_flock: Don't unlock before close We don't need to call flock(fd, LOCK_UN) for a file we are going to close anyway, so don't do it. This might make a difference if the lock fd was dupped into another fd. --- mx_flock.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mx_flock.c b/mx_flock.c index ead5ae4d..ab9f3dba 100644 --- a/mx_flock.c +++ b/mx_flock.c @@ -149,10 +149,6 @@ int mx_funlock(struct mx_flock *lock) if (res < 0) mx_log_warning("unlink(): %m"); - res = flock(lock->fd, LOCK_UN); - if (res < 0) - mx_log_warning("flock(): %m"); - _flock_close(lock); _flock_free(lock); From 0be33f7050167371748a17f7b3036f54e5f3204b Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 17 Sep 2021 12:08:44 +0200 Subject: [PATCH 2/3] mx_flock: Add mx_funlock_nodelete Add function to release the lock without removing the logfile. This is useful for forked children, which inherited the lock and just need to give it up. --- mx_flock.c | 7 +++++++ mx_flock.h | 1 + 2 files changed, 8 insertions(+) diff --git a/mx_flock.c b/mx_flock.c index ab9f3dba..ef4d3ede 100644 --- a/mx_flock.c +++ b/mx_flock.c @@ -155,6 +155,13 @@ int mx_funlock(struct mx_flock *lock) return res; } +/* as above, but don't delete lock file + */ +void mx_funlock_nodelete(struct mx_flock *lock) { + _flock_close(lock); + _flock_free(lock); +} + void mx_flock_free(struct mx_flock *lock) { _flock_free(lock); diff --git a/mx_flock.h b/mx_flock.h index 34ab4e8d..9b632829 100644 --- a/mx_flock.h +++ b/mx_flock.h @@ -10,6 +10,7 @@ struct mx_flock { struct mx_flock *mx_flock(int operation, char *fmt, ...); int mx_funlock(struct mx_flock *lock); +void mx_funlock_nodelete(struct mx_flock *lock); void mx_flock_free(struct mx_flock *lock); #endif From b8fd11a9a48e1ab2b8c4c1c459ef8ae73d7fc89f Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 17 Sep 2021 12:23:47 +0200 Subject: [PATCH 3/3] mxqd: Unlock but do not delete lock file in reaper The reaper inherits the locked lock file and needs to unlock it. Use mx_funlock_nodelete instead of mx_funlock so that the lock file is not removed. --- mxqd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mxqd.c b/mxqd.c index b960426a..c858746f 100644 --- a/mxqd.c +++ b/mxqd.c @@ -1390,7 +1390,7 @@ unsigned long start_job(struct mxq_group_list *glist) job->host_pid = getpid(); mx_log_debug("starting reaper process."); - mx_funlock(server->flock); + mx_funlock_nodelete(server->flock); server->flock = NULL; mx_mysql_finish(&server->mysql);