X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsession.c;h=ff0e038473092e757b69bda7695e84cbf1eb0ccd;hb=416ca0cb43d810bfa7de438da8735b607b7c763a;hp=6d7ab65177d26901d887755b60b5a4a3a48b4d8d;hpb=2b3bf0c05eac15dcb2c1466fced0370f34613cc4;p=pazpar2-moved-to-github.git diff --git a/src/session.c b/src/session.c index 6d7ab65..ff0e038 100644 --- a/src/session.c +++ b/src/session.c @@ -57,7 +57,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include -#define USE_TIMING 1 +#define USE_TIMING 0 #if USE_TIMING #include #endif @@ -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) @@ -883,7 +916,7 @@ void session_init_databases(struct session *se) // Probably session_init_databases_fun should be refactored instead of // called here. static struct session_database *load_session_database(struct session *se, - char *id) + const char *id) { struct database *db = new_database_inherit_settings(id, se->session_nmem, se->service->settings); session_init_databases_fun((void*) se, db); @@ -894,7 +927,7 @@ static struct session_database *load_session_database(struct session *se, // Find an existing session database. If not found, load it static struct session_database *find_session_database(struct session *se, - char *id) + const char *id) { struct session_database *sdb; @@ -905,36 +938,39 @@ static struct session_database *find_session_database(struct session *se, } // Apply a session override to a database -void session_apply_setting(struct session *se, char *dbname, char *setting, - char *value) +void session_apply_setting(struct session *se, const char *dbname, + const char *name, const char *value) { - struct session_database *sdb = find_session_database(se, dbname); - struct conf_service *service = se->service; - struct setting *new = nmem_malloc(se->session_nmem, sizeof(*new)); - int offset = settings_create_offset(service, setting); - - expand_settings_array(&sdb->settings, &sdb->num_settings, offset, - se->session_nmem); - new->precedence = 0; - new->target = dbname; - new->name = setting; - new->value = value; - new->next = sdb->settings[offset]; - sdb->settings[offset] = new; - - se->settings_modified = 1; - - // Force later recompute of settings-driven data structures - // (happens when a search starts and client connections are prepared) - switch (offset) - { - case PZ_XSLT: - if (sdb->map) - { + session_enter(se, "session_apply_setting"); + { + struct session_database *sdb = find_session_database(se, dbname); + struct conf_service *service = se->service; + struct setting *s; + int offset = settings_create_offset(service, name); + + expand_settings_array(&sdb->settings, &sdb->num_settings, offset, + se->session_nmem); + // Force later recompute of settings-driven data structures + // (happens when a search starts and client connections are prepared) + if (offset == PZ_XSLT) sdb->map = 0; + se->settings_modified = 1; + for (s = sdb->settings[offset]; s; s = s->next) + if (!strcmp(s->name, name) && + dbname && s->target && !strcmp(dbname, s->target)) + break; + if (!s) + { + s = nmem_malloc(se->session_nmem, sizeof(*s)); + s->precedence = 0; + s->target = nmem_strdup(se->session_nmem, dbname); + s->name = nmem_strdup(se->session_nmem, name); + s->next = sdb->settings[offset]; + sdb->settings[offset] = s; } - break; + s->value = nmem_strdup(se->session_nmem, value); } + session_leave(se, "session_apply_setting"); } void session_destroy(struct session *se) @@ -1001,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++) { @@ -1036,13 +1073,13 @@ static struct hitsbytarget *hitsbytarget_nb(struct session *se, WRBUF w = wrbuf_alloc(); const char *name = session_setting_oneval(client_get_database(cl), PZ_NAME); - res[*count].id = client_get_id(cl); res[*count].name = *name ? name : "Unknown"; res[*count].hits = client_get_hits(cl); res[*count].approximation = client_get_approximation(cl); - res[*count].records = client_get_num_records(cl); - res[*count].filtered = client_get_num_records_filtered(cl); + res[*count].records = client_get_num_records(cl, + &res[*count].filtered, + 0, 0); res[*count].diagnostic = client_get_diagnostic(cl, &res[*count].message, &res[*count].addinfo); @@ -1278,8 +1315,24 @@ int session_fetch_more(struct session *se) } else { - session_log(se, YLOG_LOG, "%s: no more to fetch", - client_get_id(cl)); + int filtered; + int ingest_failures; + int record_failures; + int num = client_get_num_records( + cl, &filtered, &ingest_failures, &record_failures); + + session_log(se, YLOG_LOG, "%s: hits=" ODR_INT_PRINTF + " fetched=%d filtered=%d", + client_get_id(cl), + client_get_hits(cl), + num, filtered); + if (ingest_failures || record_failures) + { + session_log(se, YLOG_WARN, "%s:" + " ingest failures=%d record failures=%d", + client_get_id(cl), + ingest_failures, record_failures); + } } } else @@ -1685,9 +1738,6 @@ static int ingest_sub_record(struct client *cl, xmlDoc *xdoc, xmlNode *root, { int ret = 0; struct session *se = client_get_session(cl); - struct conf_service *service = se->service; - - insert_settings_values(sdb, xdoc, root, service); if (!check_record_filter(root, sdb)) { @@ -1720,9 +1770,19 @@ int ingest_record(struct client *cl, const char *rec, struct session_database *sdb = client_get_database(cl); struct conf_service *service = se->service; xmlDoc *xdoc = normalize_record(se, sdb, service, rec, nmem); - int r = 0; - xmlNode *root; + int r = ingest_xml_record(cl, xdoc, record_no, nmem, 0); + client_store_xdoc(cl, record_no, xdoc); + return r; +} +int ingest_xml_record(struct client *cl, xmlDoc *xdoc, + int record_no, NMEM nmem, int cached_copy) +{ + struct session *se = client_get_session(cl); + struct session_database *sdb = client_get_database(cl); + struct conf_service *service = se->service; + xmlNode *root; + int r = 0; if (!xdoc) return -1; @@ -1779,6 +1839,8 @@ int ingest_record(struct client *cl, const char *rec, if (sroot->type == XML_ELEMENT_NODE && !strcmp((const char *) sroot->name, "record")) { + if (!cached_copy) + insert_settings_values(sdb, xdoc, root, service); r = ingest_sub_record(cl, xdoc, sroot, record_no, nmem, sdb, mk); } @@ -1796,6 +1858,8 @@ int ingest_record(struct client *cl, const char *rec, mk->value = nmem_strdup(nmem, mergekey_norm); mk->next = 0; + if (!cached_copy) + insert_settings_values(sdb, xdoc, root, service); r = ingest_sub_record(cl, xdoc, root, record_no, nmem, sdb, mk); } } @@ -1805,7 +1869,6 @@ int ingest_record(struct client *cl, const char *rec, (const char *) root->name); r = -1; } - xmlFreeDoc(xdoc); return r; } @@ -2065,8 +2128,6 @@ static int ingest_to_cluster(struct client *cl, if (check_limit_local(cl, record, record_no)) { - session_log(se, YLOG_LOG, "Facet filtered out record no %d from %s", - record_no, sdb->database->id); if (type) xmlFree(type); if (value)