Skip to content

Commit 74c5ef5

Browse files
committed
Fix persistent search reliability
The persistent search was not restored when the connection was lost.
1 parent fe419cc commit 74c5ef5

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

openam-core/src/main/java/com/iplanet/services/ldap/event/LDAPv3PersistentSearch.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* information: "Portions copyright [year] [name of copyright owner]".
1313
*
1414
* Copyright 2015-2016 ForgeRock AS.
15+
* Portions copyright 2026 Wren Security
1516
*/
1617

1718
package com.iplanet.services.ldap.event;
@@ -35,6 +36,7 @@
3536
import org.forgerock.openam.utils.IOUtils;
3637
import org.forgerock.opendj.ldap.Attribute;
3738
import org.forgerock.opendj.ldap.Connection;
39+
import org.forgerock.opendj.ldap.ConnectionEventListener;
3840
import org.forgerock.opendj.ldap.DN;
3941
import org.forgerock.opendj.ldap.DecodeException;
4042
import org.forgerock.opendj.ldap.DecodeOptions;
@@ -50,6 +52,7 @@
5052
import org.forgerock.opendj.ldap.controls.PersistentSearchChangeType;
5153
import org.forgerock.opendj.ldap.controls.PersistentSearchRequestControl;
5254
import org.forgerock.opendj.ldap.requests.SearchRequest;
55+
import org.forgerock.opendj.ldap.responses.ExtendedResult;
5356
import org.forgerock.opendj.ldap.responses.Result;
5457
import org.forgerock.opendj.ldap.responses.SearchResultEntry;
5558
import org.forgerock.opendj.ldap.responses.SearchResultReference;
@@ -185,6 +188,7 @@ private void logError(Throwable t) {
185188
}
186189

187190
private void startSearch(Connection conn) throws LdapException {
191+
conn.addConnectionEventListener(new ConnectionRestartListener());
188192
if (mode == null) {
189193
detectPersistentSearchMode(conn);
190194
}
@@ -403,6 +407,23 @@ public void run() {
403407
}
404408
}
405409

410+
private class ConnectionRestartListener implements ConnectionEventListener {
411+
412+
@Override
413+
public void handleConnectionClosed() {
414+
}
415+
416+
@Override
417+
public void handleConnectionError(boolean isDisconnectNotification, LdapException e) {
418+
DEBUG.error("An error occurred while executing persistent search against base DN: {}", searchBaseDN, e);
419+
restartSearch();
420+
}
421+
422+
@Override
423+
public void handleUnsolicitedNotification(ExtendedResult notification) {
424+
}
425+
}
426+
406427
@VisibleForTesting
407428
protected boolean isShutdown() {
408429
return shutdown;

0 commit comments

Comments
 (0)