]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
cache: clear any stale readers when opening cache obs-knot-resolver-8xyvhu/deployments/1612 odvr-5-3-1
authorVladimír Čunát <vladimir.cunat@nic.cz>
Wed, 28 Apr 2021 10:53:26 +0000 (12:53 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Wed, 28 Apr 2021 11:03:23 +0000 (13:03 +0200)
(cherry picked from commit 39d373272b1bfb4e438d790d4bbe4162fb927ea7)

lib/cache/cdb_lmdb.c

index 5f4db061c5aed36161b533e31db64b3834f2baae..706cd80e772ead35da4354a282f69cbc055b566d 100644 (file)
@@ -124,6 +124,18 @@ static int refresh_mapsize(struct lmdb_env *env)
        return kr_ok();
 }
 
+static void clear_stale_readers(struct lmdb_env *env)
+{
+       int cleared;
+       int ret = mdb_reader_check(env->env, &cleared);
+       if (ret != MDB_SUCCESS) {
+               kr_log_error("[cache] failed to clear stale reader locks: "
+                               "LMDB error %d %s\n", ret, mdb_strerror(ret));
+       } else if (cleared != 0) {
+               kr_log_info("[cache] cleared %d stale reader locks\n", cleared);
+       }
+}
+
 #define FLAG_RENEW (2*MDB_RDONLY)
 /** mdb_txn_begin or _renew + handle retries in some situations
  *
@@ -154,13 +166,7 @@ retry:
                if (ret == 0)
                        goto retry;
        } else if (unlikely(ret == MDB_READERS_FULL)) {
-               int cleared;
-               ret = mdb_reader_check(env->env, &cleared);
-               if (ret == MDB_SUCCESS)
-                       kr_log_info("[cache] cleared %d stale reader locks\n", cleared);
-               else
-                       kr_log_error("[cache] failed to clear stale reader locks: "
-                                       "LMDB error %d %s\n", ret, mdb_strerror(ret));
+               clear_stale_readers(env);
                goto retry;
        }
        return ret;
@@ -389,6 +395,11 @@ static int cdb_open_env(struct lmdb_env *env, const char *path, const size_t map
        ret = mdb_txn_commit(txn);
        if (ret != MDB_SUCCESS) goto error_mdb;
 
+       /* Stale RO transactions could have been left behind by a cashing process
+        * (e.g. one whose termination lead to spawning the current one).
+        * According to docs they might hold onto some space until we clear them. */
+       clear_stale_readers(env);
+
        return kr_ok();
 
 error_mdb: