From cb44021e045ac5ab17e840e1a68701e510ad60f1 Mon Sep 17 00:00:00 2001
From: Patrick Dowler <patrick.dowler@nrc-cnrc.gc.ca>
Date: Wed, 29 Jul 2015 11:18:14 -0700
Subject: [PATCH] made modest retry for all transient failures the default in
 ca.nrc.cadc.net; improved some error handling for ldap timeout

---
 .../nrc/cadc/ac/server/ldap/LdapGroupDAO.java  |  8 ++++++--
 .../nrc/cadc/ac/server/web/GroupsServlet.java  |  1 +
 .../src/ca/nrc/cadc/ac/client/GMSClient.java   | 18 +++++++++++++++++-
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
index 23ad3b9a..78db922b 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
@@ -345,11 +345,15 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
             }
             catch (LDAPSearchException e)
             {
+                logger.debug("Could not find groups root", e);
                 if (e.getResultCode() == ResultCode.NO_SUCH_OBJECT)
                 {
-                    logger.debug("Could not find groups root", e);
                     throw new IllegalStateException("Could not find groups root");
                 }
+                else if (e.getResultCode() == ResultCode.TIME_LIMIT_EXCEEDED)
+                    throw new TransientException("time limit exceeded", e);
+                
+                throw new IllegalStateException("unexpected failure", e);
             }
             
             LdapDAO.checkLdapResult(searchResult.getResultCode());
@@ -366,7 +370,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         }
         catch (LDAPException e1)
         {
-        	logger.debug("getGroupNames Exception: " + e1, e1);
+            logger.debug("getGroupNames Exception: " + e1, e1);
             LdapDAO.checkLdapResult(e1.getResultCode());
             throw new IllegalStateException("Unexpected exception: " + e1.getMatchedDN(), e1);
         }
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsServlet.java
index dd62ed5c..aad71634 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsServlet.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsServlet.java
@@ -78,6 +78,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.log4j.Logger;
 
 import ca.nrc.cadc.auth.AuthenticationUtil;
+import ca.nrc.cadc.net.TransientException;
 
 public class GroupsServlet extends HttpServlet
 {
diff --git a/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java b/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java
index cb0ec4f6..ce1d0058 100755
--- a/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java
+++ b/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java
@@ -110,13 +110,15 @@ import ca.nrc.cadc.net.HttpPost;
 import ca.nrc.cadc.net.HttpUpload;
 import ca.nrc.cadc.net.InputStreamWrapper;
 import ca.nrc.cadc.net.NetUtil;
+import ca.nrc.cadc.net.event.TransferEvent;
+import ca.nrc.cadc.net.event.TransferListener;
 
 
 /**
  * Client class for performing group searching and group actions
  * with the access control web service.
  */
-public class GMSClient
+public class GMSClient implements TransferListener
 {
     private static final Logger log = Logger.getLogger(GMSClient.class);
     
@@ -159,6 +161,18 @@ public class GMSClient
         }
     }
 
+    public void transferEvent(TransferEvent te)
+    {
+        if ( TransferEvent.RETRYING == te.getState() )
+            log.debug("retry after request failed, reason: "  + te.getError());
+    }
+
+    public String getEventHeader()
+    {
+        return null; // no custom eventID header
+    }
+
+    
     /**
      * Get a list of groups.
      *
@@ -392,8 +406,10 @@ public class GMSClient
         HttpPost transfer = new HttpPost(updateGroupURL, groupXML.toString(), 
                                          "application/xml", true);
         transfer.setSSLSocketFactory(getSSLSocketFactory());
+        transfer.setTransferListener(this);
         transfer.run();
         
+        
         Throwable error = transfer.getThrowable();
         if (error != null)
         {
-- 
GitLab