Fix query cache lock file handling.
authorTatsuo Ishii <ishii@postgresql.org>
Thu, 4 Sep 2025 05:59:26 +0000 (14:59 +0900)
committerTatsuo Ishii <ishii@postgresql.org>
Thu, 4 Sep 2025 07:59:30 +0000 (16:59 +0900)
Query cache module creates a lock file under logdir for concurrency
control. However, there were bugs in the handling:

1) Garbage file "QUERY_CACHE_LOCK_FILE" was created by pgpool main
   process.

2) The lock file was not removed upon pgpool shutdown.

This commit fixes the bugs.

Author: Tatsuo Ishii <ishii@postgresql.org>
Reported-by: Bo Peng <pengbo@sraoss.co.jp>
Reviewed-by: Bo Peng <pengbo@sraoss.co.jp>
Backpatch-through: v4.4

src/main/pgpool_main.c

index d74cf12b2d2cc1e33a8cb6a77f27789461699ddf..04624ff0ac7f823d9655d5b6ee4ea3d29044f901 100644 (file)
@@ -5,7 +5,7 @@
  * pgpool: a language independent connection pool server for PostgreSQL
  * written by Tatsuo Ishii
  *
- * Copyright (c) 2003-2024     PgPool Global Development Group
+ * Copyright (c) 2003-2025     PgPool Global Development Group
  *
  * Permission to use, copy, modify, and distribute this software and
  * its documentation for any purpose and without fee is hereby
@@ -303,8 +303,11 @@ PgpoolMain(bool discard_status, bool clear_memcache_oidmaps)
         */
        volatile bool first = true;
 
-       /* For PostmasterRandom */
-       gettimeofday(&random_start_time, NULL);
+       /*
+        * Query cache lock file path. This should be declared as "static" because
+        * the path is passed to be registered using on_proc_exit().
+        */
+       static char query_cache_lock_path[MAXPGPATH];
 
        processState = INITIALIZING;
 
@@ -510,23 +513,23 @@ PgpoolMain(bool discard_status, bool clear_memcache_oidmaps)
        }
 
        /* For query cache concurrency control */
-       if (pool_config->memory_cache_enabled)
+       if (pool_config->memory_cache_enabled || pool_config->enable_shared_relcache)
        {
-               char path[1024];
-               int             lfd;
+               int                     lfd;
 
-               snprintf(path, sizeof(path), "%s/QUERY_CACHE_LOCK_FILE", pool_config->logdir);
-               lfd = open(path, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR);
+               snprintf(query_cache_lock_path, sizeof(query_cache_lock_path),
+                                "%s/%s", pool_config->logdir, QUERY_CACHE_LOCK_FILE);
+               lfd = open(query_cache_lock_path, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR);
                if (lfd == -1)
                {
                        ereport(FATAL,
-                                       (errmsg("Failed to open lock file for query cache \"%s\"", path),
+                                       (errmsg("Failed to open lock file for query cache \"%s\"", query_cache_lock_path),
                                         errdetail("%m")));
                }
                close(lfd);
 
                /* Register file unlink at exit */
-               on_proc_exit(FileUnlink, (Datum) path);
+               on_proc_exit(FileUnlink, (Datum) query_cache_lock_path);
        }
 
        /*