[Tarantool-patches] [PATCH 06/17] recovery: recover_remaining_wals -- don't throw exception

Cyrill Gorcunov gorcunov at gmail.com
Tue Apr 28 19:11:26 MSK 2020


Prepare for transition to plain C.

Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
---
 src/box/box.cc      |  6 ++++--
 src/box/recovery.cc | 24 +++++++++++++++---------
 src/box/recovery.h  |  2 +-
 src/box/relay.cc    | 13 +++++++++----
 4 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/src/box/box.cc b/src/box/box.cc
index 1c6fa582c..ff095d767 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -2282,7 +2282,8 @@ local_recovery(const struct tt_uuid *instance_uuid,
 	memtx_engine_recover_snapshot_xc(memtx, checkpoint_vclock);
 
 	engine_begin_final_recovery_xc();
-	recover_remaining_wals(recovery, &wal_stream.base, NULL, false);
+	if (recover_remaining_wals(recovery, &wal_stream.base, NULL, false) != 0)
+		diag_raise();
 	engine_end_recovery_xc();
 	/*
 	 * Leave hot standby mode, if any, only after
@@ -2303,7 +2304,8 @@ local_recovery(const struct tt_uuid *instance_uuid,
 			fiber_sleep(0.1);
 		}
 		recovery_stop_local(recovery);
-		recover_remaining_wals(recovery, &wal_stream.base, NULL, true);
+		if (recover_remaining_wals(recovery, &wal_stream.base, NULL, true) != 0)
+			diag_raise();
 		/*
 		 * Advance replica set vclock to reflect records
 		 * applied in hot standby mode.
diff --git a/src/box/recovery.cc b/src/box/recovery.cc
index f724600ed..1b78fc915 100644
--- a/src/box/recovery.cc
+++ b/src/box/recovery.cc
@@ -316,14 +316,16 @@ recover_xlog(struct recovery *r, struct xstream *stream,
  * This function will not close r->current_wal if
  * recovery was successful.
  */
-void
+int
 recover_remaining_wals(struct recovery *r, struct xstream *stream,
 		       const struct vclock *stop_vclock, bool scan_dir)
 {
 	struct vclock *clock;
 
-	if (scan_dir)
-		xdir_scan_xc(&r->wal_dir);
+	if (scan_dir) {
+		if (xdir_scan(&r->wal_dir) == -1)
+			return -1;
+	}
 
 	if (xlog_cursor_is_open(&r->cursor)) {
 		/* If there's a WAL open, recover from it first. */
@@ -358,24 +360,27 @@ recover_remaining_wals(struct recovery *r, struct xstream *stream,
 		}
 
 		if (recovery_open_log(r, clock) != 0)
-			diag_raise();
+			return -1;
 
 		say_info("recover from `%s'", r->cursor.name);
 
 recover_current_wal:
 		if (recover_xlog(r, stream, stop_vclock) < 0)
-			diag_raise();
+			return -1;
 	}
 
 	if (xlog_cursor_is_eof(&r->cursor)) {
 		if (recovery_close_log(r) != 0)
-			diag_raise();
+			return -1;
 	}
 
-	if (stop_vclock != NULL && vclock_compare(&r->vclock, stop_vclock) != 0)
-		tnt_raise(XlogGapError, &r->vclock, stop_vclock);
+	if (stop_vclock != NULL && vclock_compare(&r->vclock, stop_vclock) != 0) {
+		diag_set(XlogGapError, &r->vclock, stop_vclock);
+		return -1;
+	}
 
 	region_free(&fiber()->gc);
+	return 0;
 }
 
 void
@@ -514,7 +519,8 @@ hot_standby_f(va_list ap)
 		do {
 			start = vclock_sum(&r->vclock);
 
-			recover_remaining_wals(r, stream, NULL, scan_dir);
+			if (recover_remaining_wals(r, stream, NULL, scan_dir) != 0)
+				diag_raise();
 
 			end = vclock_sum(&r->vclock);
 			/*
diff --git a/src/box/recovery.h b/src/box/recovery.h
index 6e68abc0b..a2fb99070 100644
--- a/src/box/recovery.h
+++ b/src/box/recovery.h
@@ -102,7 +102,7 @@ recovery_finalize(struct recovery *r);
  * This function will not close r->current_wal if
  * recovery was successful.
  */
-void
+int
 recover_remaining_wals(struct recovery *r, struct xstream *stream,
 		       const struct vclock *stop_vclock, bool scan_dir);
 
diff --git a/src/box/relay.cc b/src/box/relay.cc
index 2ad02cb8a..2e17d0476 100644
--- a/src/box/relay.cc
+++ b/src/box/relay.cc
@@ -341,8 +341,10 @@ relay_final_join_f(va_list ap)
 
 	/* Send all WALs until stop_vclock */
 	assert(relay->stream.write != NULL);
-	recover_remaining_wals(relay->r, &relay->stream,
-			       &relay->stop_vclock, true);
+	if (recover_remaining_wals(relay->r, &relay->stream,
+				   &relay->stop_vclock, true) != 0) {
+		diag_raise();
+	}
 	assert(vclock_compare(&relay->r->vclock, &relay->stop_vclock) == 0);
 	return 0;
 }
@@ -499,8 +501,11 @@ relay_process_wal_event(struct wal_watcher *watcher, unsigned events)
 		return;
 	}
 	try {
-		recover_remaining_wals(relay->r, &relay->stream, NULL,
-				       (events & WAL_EVENT_ROTATE) != 0);
+		bool scan_dir = (events & WAL_EVENT_ROTATE) ? true : false;
+		if (recover_remaining_wals(relay->r, &relay->stream, NULL,
+					   scan_dir) != 0) {
+			diag_raise();
+		}
 	} catch (Exception *e) {
 		relay_set_error(relay, e);
 		fiber_cancel(fiber());
-- 
2.20.1



More information about the Tarantool-patches mailing list