Parcourir la source

error recovery in redis online notification

If a redis cluster member fails over to the slave, we'll get an error from not specifying the key for the insert.  Recover from that instead of crashing the controller
Grant Limberg il y a 5 ans
Parent
commit
0f17508cac
1 fichiers modifiés avec 12 ajouts et 8 suppressions
  1. 12 8
      controller/PostgreSQL.cpp

+ 12 - 8
controller/PostgreSQL.cpp

@@ -1540,15 +1540,19 @@ void PostgreSQL::onlineNotification_Redis()
 			std::lock_guard<std::mutex> l(_lastOnline_l);
 			lastOnline.swap(_lastOnline);
 		}
-		if (!lastOnline.empty()) {
-			if (_rc->clusterMode) {
-				auto tx = _cluster->redis(controllerId).transaction(true);
-				_doRedisUpdate(tx, controllerId, lastOnline);
-			} else {
-				auto tx = _redis->transaction(true);
-				_doRedisUpdate(tx, controllerId, lastOnline);
+		try {
+			if (!lastOnline.empty()) {
+				if (_rc->clusterMode) {
+					auto tx = _cluster->redis(controllerId).transaction(true);
+					_doRedisUpdate(tx, controllerId, lastOnline);
+				} else {
+					auto tx = _redis->transaction(true);
+					_doRedisUpdate(tx, controllerId, lastOnline);
+				}
 			}
-		}		
+		} catch (sw::redis::Error &e) {
+			fprintf(stderr, "Error in online notification thread (redis): %s\n", e.what());
+		}
 		std::this_thread::sleep_for(std::chrono::milliseconds(10));
 	}
 }