[Tarantool-patches] [PATCH 1/2] gc: use wide integer for schedule counting

Cyrill Gorcunov gorcunov at gmail.com
Wed Mar 10 23:47:09 MSK 2021


Currently we use unsined int for "cleanup" schedule
counting, this is safe while this routine is not
called too often. Still there is a chance to hit
a number wrap on code modification because there
is no strict rule on how to use this garbage collector.
Lets use wide integers instead, we have only one gc
instance and such approach eliminates potential problems
in future (actually this should had been done from the
beginning since the current gc code flow developed
without wrapping in mind).

In-scope-of #5806

Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
---
 src/box/gc.c | 6 +++---
 src/box/gc.h | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/box/gc.c b/src/box/gc.c
index 1f8cc818d..86c229c34 100644
--- a/src/box/gc.c
+++ b/src/box/gc.c
@@ -239,15 +239,15 @@ gc_cleanup_fiber_f(va_list ap)
 {
 	(void)ap;
 	while (!fiber_is_cancelled()) {
-		int delta = gc.cleanup_scheduled - gc.cleanup_completed;
+		int64_t delta = gc.cleanup_scheduled - gc.cleanup_completed;
 		if (delta == 0) {
 			/* No pending garbage collection. */
 			fiber_sleep(TIMEOUT_INFINITY);
 			continue;
 		}
-		assert(delta > 0);
 		gc_run_cleanup();
 		gc.cleanup_completed += delta;
+		assert(delta > 0 && gc.cleanup_completed > 0);
 		fiber_cond_signal(&gc.cleanup_cond);
 	}
 	return 0;
@@ -278,7 +278,7 @@ gc_schedule_cleanup(void)
 static void
 gc_wait_cleanup(void)
 {
-	unsigned scheduled = gc.cleanup_scheduled;
+	int64_t scheduled = gc.cleanup_scheduled;
 	while (gc.cleanup_completed < scheduled)
 		fiber_cond_wait(&gc.cleanup_cond);
 }
diff --git a/src/box/gc.h b/src/box/gc.h
index 829aaf479..2a568c5f9 100644
--- a/src/box/gc.h
+++ b/src/box/gc.h
@@ -146,7 +146,7 @@ struct gc_state {
 	 * sleep until @completed reaches the value of @scheduled
 	 * taken at that moment of time.
 	 */
-	unsigned cleanup_completed, cleanup_scheduled;
+	int64_t cleanup_completed, cleanup_scheduled;
 	/**
 	 * Set if there's a fiber making a checkpoint right now.
 	 */
-- 
2.29.2



More information about the Tarantool-patches mailing list