zoom: use other diagnostic if Torus server is unavailable
[metaproxy-moved-to-github.git] / src / filter_zoom.cpp
index 0c02b58..481ad35 100644 (file)
@@ -172,7 +172,12 @@ namespace metaproxy_1 {
                                            ODR odr, BackendPtr b,
                                            Odr_oid *preferredRecordSyntax,
                                            const char *element_set_name);
-
+            bool retry(mp::Package &package,
+                       mp::odr &odr,
+                       BackendPtr b, 
+                       int &error, char **addinfo,
+                       int &proxy_step, int &same_retries,
+                       int &proxy_retries);
             void log_diagnostic(mp::Package &package,
                                 int error, const char *addinfo);
         public:
@@ -190,6 +195,9 @@ namespace metaproxy_1 {
         private:
             void configure_local_records(const xmlNode * ptr, bool test_only);
             bool check_proxy(const char *proxy);
+
+
+
             FrontendPtr get_frontend(mp::Package &package);
             void release_frontend(mp::Package &package);
             SearchablePtr parse_torus_record(const xmlNode *ptr);
@@ -1141,8 +1149,9 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
                                          realm, m_p->proxy);
         if (!doc)
         {
-            *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST;
-            *addinfo = odr_strdup(odr, torus_db.c_str());
+            *error = YAZ_BIB1_UNSPECIFIED_ERROR;
+            *addinfo = odr_strdup(odr, "Torus server unavailable or "
+                                  "incorrectly configured");
             BackendPtr b;
             return b;
         }
@@ -1252,7 +1261,6 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
 
     BackendPtr b(new Backend);
 
-    b->m_proxy = proxy;
     b->sptr = sptr;
     b->xsp = xsp;
     b->m_frontend_database = database;
@@ -1276,6 +1284,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
 
     if (proxy.length() == 0)
         proxy = sptr->cfProxy;
+    b->m_proxy = proxy;
     
     if (sptr->cfAuth.length())
     {
@@ -1835,8 +1844,8 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::explain_search(mp::Package &package,
         if (!doc)
         {
             *error = YAZ_BIB1_UNSPECIFIED_ERROR;
-            *addinfo = odr_strdup(odr, "IR-Explain---1 problem. " 
-                                  "Could not obtain Torus records for Explain");
+            *addinfo = odr_strdup(odr, "Torus server unavailable or "
+                                  "incorrectly configured");
         }
         else
         {
@@ -1870,7 +1879,7 @@ static bool wait_conn(COMSTACK cs, int secs)
     yaz_poll_add(pfd.input_mask, yaz_poll_except);
     if (cs->io_pending && CS_WANT_WRITE)
         yaz_poll_add(pfd.input_mask, yaz_poll_write);
-    else if (cs->io_pending & CS_WANT_READ)
+    if (cs->io_pending & CS_WANT_READ)
         yaz_poll_add(pfd.input_mask, yaz_poll_read);
 
     pfd.fd = cs_fileno(cs);
@@ -1911,12 +1920,47 @@ bool yf::Zoom::Impl::check_proxy(const char *proxy)
                 if (!wait_conn(conn, proxy_timeout))
                     break;
             }
+            if (ret == 0)
+                outcome = true;
         }
     }
     cs_close(conn);
     return outcome;
 }
 
+bool yf::Zoom::Frontend::retry(mp::Package &package,
+                               mp::odr &odr,
+                               BackendPtr b, 
+                               int &error, char **addinfo,
+                               int &proxy_step, int &same_retries,
+                               int &proxy_retries)
+{
+    if (b && b->m_proxy.length() && !m_p->check_proxy(b->m_proxy.c_str()))
+    {
+        log_diagnostic(package, error, *addinfo);
+        package.log("zoom", YLOG_LOG, "proxy %s fails", b->m_proxy.c_str());
+        m_backend.reset();
+        if (proxy_step) // there is a failover
+        {
+            proxy_retries++;
+            package.log("zoom", YLOG_WARN, "search failed: trying next proxy");
+            return true;
+        }
+        error = YAZ_BIB1_PROXY_FAILURE;
+        *addinfo = odr_strdup(odr, b->m_proxy.c_str());
+    }
+    else if (same_retries == 0 && proxy_retries == 0)
+    {
+        log_diagnostic(package, error, *addinfo);
+        same_retries++;
+        package.log("zoom", YLOG_WARN, "search failed: retry");
+        m_backend.reset();
+        proxy_step = 0;
+        return true;
+    }
+    return false;
+}
+
 void yf::Zoom::Frontend::handle_search(mp::Package &package)
 {
     Z_GDU *gdu = package.request().get();
@@ -1946,29 +1990,9 @@ next_proxy:
                                               &addinfo, odr, &proxy_step);
     if (error)
     {
-        if (b && b->m_proxy.length() && !m_p->check_proxy(b->m_proxy.c_str()))
-        {
-            log_diagnostic(package, error, addinfo);
-            package.log("zoom", YLOG_LOG, "proxy %s fails", b->m_proxy.c_str());
-            m_backend.reset();
-            if (proxy_step) // there is a failover
-            {
-                proxy_retries++;
-                package.log("zoom", YLOG_WARN, "search failed: trying next proxy");
-                goto next_proxy;
-            }
-            error = YAZ_BIB1_INIT_AC_AUTHENTICATION_SYSTEM_ERROR;
-            addinfo = odr_strdup(odr, "proxy failure");
-        }
-        else if (same_retries == 0 && proxy_retries == 0)
-        {
-            log_diagnostic(package, error, addinfo);
-            same_retries++;
-            package.log("zoom", YLOG_WARN, "search failed: retry");
-            m_backend.reset();
-            proxy_step = 0;
+        if (retry(package, odr, b, error, &addinfo, proxy_step,
+                  same_retries, proxy_retries))
             goto next_proxy;
-        }
     }
     if (error)
     {
@@ -2214,29 +2238,9 @@ next_proxy:
 
     if (error)
     {
-        if (b->m_proxy.length() && !m_p->check_proxy(b->m_proxy.c_str()))
-        {
-            log_diagnostic(package, error, addinfo);
-            package.log("zoom", YLOG_LOG, "proxy %s fails", b->m_proxy.c_str());
-            m_backend.reset();
-            if (proxy_step) // there is a failover
-            {
-                proxy_retries++;
-                package.log("zoom", YLOG_WARN, "search failed: trying next proxy");
-                goto next_proxy;
-            }
-            error = YAZ_BIB1_INIT_AC_AUTHENTICATION_SYSTEM_ERROR;
-            addinfo = odr_strdup(odr, "proxy failure");
-        }
-        else if (same_retries == 0 && proxy_retries == 0)
-        { 
-            log_diagnostic(package, error, addinfo);
-            same_retries++;
-            package.log("zoom", YLOG_WARN, "search failed: retry");
-            m_backend.reset();
-            proxy_step = 0;
+        if (retry(package, odr, b, error, &addinfo, proxy_step,
+                  same_retries, proxy_retries))
             goto next_proxy;
-        }
     }
 
     const char *element_set_name = 0;