command=stop functional and works much better PAZ-967
[pazpar2-moved-to-github.git] / src / session.c
index 69d05ae..ff0e038 100644 (file)
@@ -621,10 +621,8 @@ static void session_clear_set(struct session *se, struct reclist_sortparms *sp)
     se->reclist = reclist_create(se->nmem);
 }
 
-static void session_sort_unlocked(struct session *se,
-                                  struct reclist_sortparms *sp,
-                                  const char *mergekey,
-                                  const char *rank)
+void session_sort(struct session *se, struct reclist_sortparms *sp,
+                  const char *mergekey, const char *rank)
 {
     struct client_list *l;
     const char *field = sp->name;
@@ -632,6 +630,7 @@ static void session_sort_unlocked(struct session *se,
     int type  = sp->type;
     int clients_research = 0;
 
+    session_enter(se, "session_sort");
     session_log(se, YLOG_DEBUG, "session_sort field=%s increasing=%d type=%d",
                 field, increasing, type);
 
@@ -665,6 +664,7 @@ static void session_sort_unlocked(struct session *se,
         {
             session_log(se, YLOG_DEBUG, "session_sort: field=%s increasing=%d type=%d already fetched",
                         field, increasing, type);
+            session_leave(se, "session_sort");
             return;
         }
     }
@@ -682,14 +682,7 @@ static void session_sort_unlocked(struct session *se,
         client_parse_init(cl, 1);
         clients_research += client_parse_sort(cl, sp);
     }
-    if (clients_research)
-    {
-        session_log(se, YLOG_DEBUG,
-                    "session_sort: reset results due to %d clients researching",
-                    clients_research);
-        session_clear_set(se, sp);
-    }
-    else
+    if (!clients_research || se->clients_starting)
     {
         // A new sorting based on same record set
         struct reclist_sortparms *sr = nmem_malloc(se->nmem, sizeof(*sr));
@@ -699,36 +692,66 @@ static void session_sort_unlocked(struct session *se,
         sr->next = se->sorted_results;
         se->sorted_results = sr;
         session_log(se, YLOG_DEBUG, "session_sort: no research/ingesting done");
-        return ;
+        session_leave(se, "session_sort");
     }
-    session_log(se, YLOG_DEBUG, "Re- search/ingesting for clients due to change in sort order");
-
-    for (l = se->clients_active; l; l = l->next)
+    else
     {
-        struct client *cl = l->client;
-        if (client_get_state(cl) == Client_Connecting ||
-            client_get_state(cl) == Client_Idle ||
-            client_get_state(cl) == Client_Working) {
-            client_start_search(cl);
-        }
-        else
+        se->clients_starting = 1;
+        session_log(se, YLOG_DEBUG,
+                    "session_sort: reset results due to %d clients researching",
+                    clients_research);
+        session_clear_set(se, sp);
+        session_log(se, YLOG_DEBUG, "Re- search/ingesting for clients due to change in sort order");
+
+        session_leave(se, "session_sort");
+        for (l = se->clients_active; l; l = l->next)
         {
-            session_log(se, YLOG_DEBUG,
-                        "session_sort: %s: No re-start/ingest in show. "
-                        "Wrong client state: %d",
-                        client_get_id(cl), client_get_state(cl));
+            struct client *cl = l->client;
+            if (client_get_state(cl) == Client_Connecting ||
+                client_get_state(cl) == Client_Idle ||
+                client_get_state(cl) == Client_Working) {
+                client_start_search(cl);
+            }
+            else
+            {
+                session_log(se, YLOG_DEBUG,
+                            "session_sort: %s: No re-start/ingest in show. "
+                            "Wrong client state: %d",
+                            client_get_id(cl), client_get_state(cl));
+            }
         }
+        session_enter(se, "session_sort");
+        se->clients_starting = 0;
+        session_leave(se, "session_sort");
     }
 }
 
-void session_sort(struct session *se, struct reclist_sortparms *sp,
-                  const char *mergekey, const char *rank)
+void session_stop(struct session *se)
 {
-    //session_enter(se, "session_sort");
-    session_sort_unlocked(se, sp, mergekey, rank);
-    //session_leave(se, "session_sort");
-}
+    struct client_list *l;
+    session_enter(se, "session_stop1");
+    if (se->clients_starting)
+    {
+        session_leave(se, "session_stop1");
+        return;
+    }
+    se->clients_starting = 1;
+    session_leave(se, "session_stop1");
 
+    session_alert_watch(se, SESSION_WATCH_SHOW);
+    session_alert_watch(se, SESSION_WATCH_BYTARGET);
+    session_alert_watch(se, SESSION_WATCH_TERMLIST);
+    session_alert_watch(se, SESSION_WATCH_SHOW_PREF);
+
+    for (l = se->clients_active; l; l = l->next)
+    {
+        struct client *cl = l->client;
+        client_stop(cl);
+    }
+    session_enter(se, "session_stop2");
+    se->clients_starting = 0;
+    session_leave(se, "session_stop2");
+}
 
 enum pazpar2_error_code session_search(struct session *se,
                                        const char *query,
@@ -746,17 +769,21 @@ enum pazpar2_error_code session_search(struct session *se,
     int no_working = 0;
     int no_failed_query = 0;
     int no_failed_limit = 0;
-    struct client_list *l, *l0;
-
-    session_alert_watch(se, SESSION_WATCH_SHOW);
-    session_alert_watch(se, SESSION_WATCH_BYTARGET);
-    session_alert_watch(se, SESSION_WATCH_TERMLIST);
-    session_alert_watch(se, SESSION_WATCH_SHOW_PREF);
+    struct client_list *l;
 
     session_log(se, YLOG_DEBUG, "Search");
 
     *addinfo = 0;
 
+    session_enter(se, "session_search0");
+    if (se->clients_starting)
+    {
+        session_leave(se, "session_search0");
+        return PAZPAR2_NO_ERROR;
+    }
+    se->clients_starting = 1;
+    session_leave(se, "session_search0");
+
     if (se->settings_modified) {
         session_remove_cached_clients(se);
     }
@@ -784,6 +811,7 @@ enum pazpar2_error_code session_search(struct session *se,
     if (!live_channels)
     {
         session_leave(se, "session_search");
+        se->clients_starting = 0;
         return PAZPAR2_NO_TARGETS;
     }
 
@@ -793,14 +821,18 @@ enum pazpar2_error_code session_search(struct session *se,
     {
         *addinfo = "limit";
         session_leave(se, "session_search");
+        se->clients_starting = 0;
         return PAZPAR2_MALFORMED_PARAMETER_VALUE;
     }
 
-    l0 = se->clients_active;
-    se->clients_active = 0;
     session_leave(se, "session_search");
 
-    for (l = l0; l; l = l->next)
+    session_alert_watch(se, SESSION_WATCH_SHOW);
+    session_alert_watch(se, SESSION_WATCH_BYTARGET);
+    session_alert_watch(se, SESSION_WATCH_TERMLIST);
+    session_alert_watch(se, SESSION_WATCH_SHOW_PREF);
+
+    for (l = se->clients_active; l; l = l->next)
     {
         int parse_ret;
         struct client *cl = l->client;
@@ -823,8 +855,9 @@ enum pazpar2_error_code session_search(struct session *se,
             no_working++;
         }
     }
-    session_reset_active_clients(se, l0);
-
+    session_enter(se, "session_search2");
+    se->clients_starting = 0;
+    session_leave(se, "session_search2");
     if (no_working == 0)
     {
         if (no_failed_query > 0)
@@ -1004,6 +1037,7 @@ struct session *new_session(NMEM nmem, struct conf_service *service,
     session->facet_limits = 0;
     session->mergekey = 0;
     session->rank = 0;
+    session->clients_starting = 0;
 
     for (i = 0; i <= SESSION_WATCH_MAX; i++)
     {