X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fhttp_command.c;h=902957a85dc06c6efe4ae6ec9b68ef257faae880;hb=d47362af8b5fa9d6298e783a662fa68ece809040;hp=6e80a52f153c28fbbebd85994d9545a3beedce48;hpb=2cfd7518dc740c913602ea8306ec8f27509b00d4;p=pazpar2-moved-to-github.git diff --git a/src/http_command.c b/src/http_command.c index 6e80a52..902957a 100644 --- a/src/http_command.c +++ b/src/http_command.c @@ -121,7 +121,7 @@ struct http_session *http_session_create(struct conf_service *service, r->timeout_iochan = iochan_create(-1, session_timeout, 0, "http_session_timeout"); iochan_setdata(r->timeout_iochan, r); - yaz_log(YLOG_LOG, "timeout=%d", service->session_timeout); + yaz_log(YLOG_LOG, "%p HTTP session %u created. timeout chan=%p timeout=%d", r, sesid, r->timeout_iochan, service->session_timeout); iochan_settimeout(r->timeout_iochan, service->session_timeout); iochan_add(service->server->iochan_man, r->timeout_iochan); @@ -130,27 +130,16 @@ struct http_session *http_session_create(struct conf_service *service, void http_session_destroy(struct http_session *s) { - int must_destroy = 1; + int must_destroy = 0; http_sessions_t http_sessions = s->http_sessions; - yaz_log(YLOG_LOG, "http_session_destroy %u", s->session_id); + yaz_log(YLOG_LOG, "%p HTTP session destroy %u", s, s->session_id); yaz_mutex_enter(http_sessions->mutex); - - /* only if http_session destroy was already called, we will allow it - to be destroyed */ - if (s->destroy_counter != s->activity_counter) - must_destroy = 0; - - /* only if there are no active Z39.50 clients we will allow it to be - destroyed */ - if (session_active_clients(s->psession)) - must_destroy = 0; - - s->destroy_counter = s->activity_counter = 0; - if (must_destroy) - { + /* only if http_session has no active http sessions on it can be destroyed */ + if (s->destroy_counter == s->activity_counter) { struct http_session **p = 0; + must_destroy = 1; for (p = &http_sessions->session_list; *p; p = &(*p)->next) if (*p == s) { @@ -166,6 +155,10 @@ void http_session_destroy(struct http_session *s) destroy_session(s->psession); nmem_destroy(s->nmem); } + else { + yaz_log(YLOG_DEBUG, "%p HTTP Session %d. Active clients (%d-%d). Waiting for new timeout.", s, s->session_id, s->activity_counter, s->destroy_counter); + } + } static const char *get_msg(enum pazpar2_error_code code) @@ -283,6 +276,15 @@ static struct http_session *locate_session(struct http_channel *c) return p; } +// Call after use of locate_session, in order to increment the destroy_counter +static void *release_session(struct http_channel *c, struct http_session *session) { + http_sessions_t http_sessions = c->http_sessions; + yaz_mutex_enter(http_sessions->mutex); + if (session) + session->destroy_counter++; + yaz_mutex_leave(http_sessions->mutex); +} + // Decode settings parameters and apply to session // Syntax: setting[target]=value static int process_settings(struct session *se, struct http_request *rq, @@ -425,6 +427,7 @@ static void cmd_settings(struct http_channel *c) return; rs->payload = HTTP_COMMAND_RESPONSE_PREFIX "OK"; http_send_response(c); + release_session(c,s); } // Compares two hitsbytarget nodes by hitcount @@ -547,6 +550,7 @@ static void cmd_termlist(struct http_channel *c) wrbuf_puts(c->wrbuf, "\n"); rs->payload = nmem_strdup(rq->channel->nmem, wrbuf_cstr(c->wrbuf)); http_send_response(c); + release_session(c,s); } @@ -600,6 +604,7 @@ static void cmd_bytarget(struct http_channel *c) wrbuf_puts(c->wrbuf, ""); rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf)); http_send_response(c); + release_session(c,s); } static void write_metadata(WRBUF w, struct conf_service *service, @@ -742,6 +747,7 @@ static void cmd_record(struct http_channel *c) { error(rs, PAZPAR2_RECORD_MISSING, idstr); } + release_session(c, s); return; } if (offsetstr) @@ -809,6 +815,7 @@ static void cmd_record(struct http_channel *c) http_send_response(c); } show_single_stop(s->psession, rec); + release_session(c, s); } static void cmd_record_ready(void *data) @@ -850,6 +857,7 @@ static void show_records(struct http_channel *c, int active) if (!(sp = reclist_parse_sortparms(c->nmem, sort, s->psession->service))) { error(rs, PAZPAR2_MALFORMED_PARAMETER_VALUE, "sort"); + release_session(c, s); return; } @@ -891,6 +899,7 @@ static void show_records(struct http_channel *c, int active) wrbuf_puts(c->wrbuf, "\n"); rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf)); http_send_response(c); + release_session(c, s); } static void show_records_ready(void *data) @@ -927,6 +936,7 @@ static void cmd_show(struct http_channel *c) } show_records(c, status); + release_session(c,s); } static void cmd_ping(struct http_channel *c) @@ -937,6 +947,7 @@ static void cmd_ping(struct http_channel *c) return; rs->payload = HTTP_COMMAND_RESPONSE_PREFIX "OK"; http_send_response(c); + release_session(c, s); } static int utf_8_valid(const char *str) @@ -981,21 +992,25 @@ static void cmd_search(struct http_channel *c) if (!query) { error(rs, PAZPAR2_MISSING_PARAMETER, "query"); + release_session(c,s); return; } if (!utf_8_valid(query)) { error(rs, PAZPAR2_MALFORMED_PARAMETER_ENCODING, "query"); + release_session(c,s); return; } code = search(s->psession, query, startrecs, maxrecs, filter, &addinfo); if (code) { error(rs, code, addinfo); + release_session(c,s); return; } rs->payload = HTTP_COMMAND_RESPONSE_PREFIX "OK"; http_send_response(c); + release_session(c,s); } @@ -1034,6 +1049,7 @@ static void cmd_stat(struct http_channel *c) wrbuf_puts(c->wrbuf, ""); rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf)); http_send_response(c); + release_session(c,s); } static void cmd_info(struct http_channel *c)