From fdb8409e383243c8a3bbf7e8a1d4c852f607c4f2 Mon Sep 17 00:00:00 2001
From: Jan-Peter Nilsson <67913129+jpn-e@users.noreply.github.com>
Date: Tue, 08 Sep 2020 14:51:22 +0000
Subject: [PATCH] Blacklist misbehaving servers for a little bit (#144)

---
 opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java b/opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java
index 279041a..b4b6c8b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java
@@ -309,6 +309,7 @@
   {
     synchronized (connectThreadLock)
     {
+      final Map<HostPort, Long> blacklistedHosts = new HashMap<>();
       while (!shutdown.get())
       {
         HostPort localAddress = HostPort.localAddress(getReplicationPort());
@@ -336,7 +337,16 @@
               continue; // Skip: avoid connecting to self.
             }
 
-            connect(rsAddress, domain.getBaseDN());
+            if (blacklistedHosts.getOrDefault(rsAddress, 0L) > domainTicket)
+            {
+              continue; // Skip: avoid connecting to blacklisted hosts.
+            }
+
+            if (!connect(rsAddress, domain.getBaseDN()))
+            {
+                // Blacklist for a few iterations
+                blacklistedHosts.put(rsAddress, domainTicket + 6);
+            }
           }
         }
 
@@ -381,7 +391,7 @@
    * @param baseDN
    *          The baseDN of the connection
    */
-  private void connect(HostPort remoteServerAddress, DN baseDN)
+  private boolean connect(HostPort remoteServerAddress, DN baseDN)
   {
     boolean sslEncryption = replSessionSecurity.isSslEncryption();
 
@@ -414,7 +424,9 @@
       logger.traceException(e);
       close(session);
       close(socket);
+      return false;
     }
+    return true;
   }
 
   /** Initialization function for the replicationServer. */

--
Gitblit v1.10.0