Procházet zdrojové kódy

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 před 5 roky
rodič
revize
0f17508cac
1 změnil soubory, kde provedl 12 přidání a 8 odebrání
  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));
 	}
 }