Explorar el Código

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 hace 5 años
padre
commit
0f17508cac
Se han modificado 1 ficheros con 12 adiciones y 8 borrados
  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));
 	}
 }