X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fsession.c;h=fb895deeb69f05dc6b5dc55ec2c28433557917f2;hb=2d670e10691d4d92d6e65a33d32295217cf67794;hp=69d05ae4fbaa0d482604e05363c8b6ae8ab54f05;hpb=22ac82b6522cc7ed34f93fa8dbdcbff383d23dab;p=pazpar2-moved-to-github.git diff --git a/src/session.c b/src/session.c index 69d05ae..fb895de 100644 --- a/src/session.c +++ b/src/session.c @@ -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,37 +692,40 @@ 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) -{ - //session_enter(se, "session_sort"); - session_sort_unlocked(se, sp, mergekey, rank); - //session_leave(se, "session_sort"); -} - - enum pazpar2_error_code session_search(struct session *se, const char *query, const char *startrecs, @@ -746,17 +742,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 +784,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 +794,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 +828,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 +1010,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++) {