X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fhttp_command.c;h=e8bba87fba3ed0e41fb0019ecd07486b3676fd6c;hb=fcf6233e96ba839efd79be52d4c85bab243881be;hp=426b038dc85a09e73db9ce76343ea244dca52f14;hpb=0e0ddf5be474a96ae8838fe9845858b7ca96b9d8;p=pazpar2-moved-to-github.git diff --git a/src/http_command.c b/src/http_command.c index 426b038..e8bba87 100644 --- a/src/http_command.c +++ b/src/http_command.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2010 Index Data + Copyright (C) 2006-2011 Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -64,6 +64,23 @@ struct http_sessions { int log_level; }; +static YAZ_MUTEX g_http_session_mutex = 0; +static int g_http_sessions = 0; + +int http_session_use(int delta) +{ + int sessions; + if (!g_http_session_mutex) + yaz_mutex_create(&g_http_session_mutex); + yaz_mutex_enter(g_http_session_mutex); + g_http_sessions += delta; + sessions = g_http_sessions; + yaz_mutex_leave(g_http_session_mutex); + yaz_log(YLOG_DEBUG, "%s sesions=%d", delta == 0 ? "" : (delta > 0 ? "INC" : "DEC"), sessions); + return sessions; + +} + http_sessions_t http_sessions_create(void) { http_sessions_t hs = xmalloc(sizeof(*hs)); @@ -127,6 +144,7 @@ struct http_session *http_session_create(struct conf_service *service, iochan_settimeout(r->timeout_iochan, service->session_timeout); iochan_add(service->server->iochan_man, r->timeout_iochan); + http_session_use(1); return r; } @@ -136,7 +154,7 @@ void http_session_destroy(struct http_session *s) http_sessions_t http_sessions = s->http_sessions; - yaz_log(http_sessions->log_level, "%p Session %u destroyed", s, s->session_id); + yaz_log(http_sessions->log_level, "%p HTTP Session %u destroyed", s, s->session_id); yaz_mutex_enter(http_sessions->mutex); /* only if http_session has no active http sessions on it can be destroyed */ if (s->destroy_counter == s->activity_counter) { @@ -152,13 +170,14 @@ void http_session_destroy(struct http_session *s) yaz_mutex_leave(http_sessions->mutex); if (must_destroy) { /* destroying for real */ - yaz_log(http_sessions->log_level, "%p Session %u destroyed", s, s->session_id); + yaz_log(http_sessions->log_level, "%p HTTP Session %u destroyed", s, s->session_id); iochan_destroy(s->timeout_iochan); destroy_session(s->psession); + http_session_use(-1); nmem_destroy(s->nmem); } else { - yaz_log(http_sessions->log_level, "%p Session %u destroyed delayed. Active clients (%d-%d). Waiting for new timeout.", + yaz_log(http_sessions->log_level, "%p HTTP Session %u destroyed delayed. Active clients (%d-%d). Waiting for new timeout.", s, s->session_id, s->activity_counter, s->destroy_counter); } @@ -566,6 +585,77 @@ static void cmd_termlist(struct http_channel *c) release_session(c,s); } +size_t session_get_memory_status(struct session *session); + +static void session_status(struct http_channel *c, struct http_session *s) +{ + size_t session_nmem; + wrbuf_printf(c->wrbuf, "%u\n", s->activity_counter); + wrbuf_printf(c->wrbuf, "%zu\n", nmem_total(s->nmem) ); + session_nmem = session_get_memory_status(s->psession); + wrbuf_printf(c->wrbuf, "%zu\n", session_nmem); +} + +static void cmd_session_status(struct http_channel *c) { + struct http_response *rs = c->response; + struct http_session *s = locate_session(c); + if (!s) + return; + + wrbuf_rewind(c->wrbuf); + wrbuf_puts(c->wrbuf, HTTP_COMMAND_RESPONSE_PREFIX "OK\n"); + session_status(c, s); + wrbuf_puts(c->wrbuf, "\n"); + rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf)); + http_send_response(c); + release_session(c,s); + +} + +int sessions_count(void); +int clients_count(void); +#ifdef HAVE_RESULTSETS_COUNT +int resultsets_count(void); +#else +#define resultsets_count() 0 +#endif + +static void cmd_server_status(struct http_channel *c) +{ + struct http_response *rs = c->response; + int sessions = sessions_count(); + int clients = clients_count(); + int resultsets = resultsets_count(); + wrbuf_rewind(c->wrbuf); + wrbuf_puts(c->wrbuf, HTTP_COMMAND_RESPONSE_PREFIX "\n"); + wrbuf_printf(c->wrbuf, " %u\n", sessions); + wrbuf_printf(c->wrbuf, " %u\n", clients); + /* Only works if yaz has been compiled with enabling of this */ + wrbuf_printf(c->wrbuf, " %u\n",resultsets); + +/* TODO add all sessions status */ +/* http_sessions_t http_sessions = c->http_sessions; */ +/* struct http_session *p; */ +/* + yaz_mutex_enter(http_sessions->mutex); + for (p = http_sessions->session_list; p; p = p->next) { + p->activity_counter++; + wrbuf_puts(c->wrbuf, "\n"); + wrbuf_printf(c->wrbuf, "%s\n", p->session_id); + yaz_mutex_leave(http_sessions->mutex); + session_status(c, p); + wrbuf_puts(c->wrbuf, "\n"); + yaz_mutex_enter(http_sessions->mutex); + p->activity_counter--; + } + yaz_mutex_leave(http_sessions->mutex); +*/ + wrbuf_puts(c->wrbuf, "\n"); + rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf)); + http_send_response(c); + xmalloc_trav(0); +} + static void cmd_bytarget(struct http_channel *c) { @@ -1085,7 +1175,7 @@ static void cmd_info(struct http_channel *c) wrbuf_rewind(c->wrbuf); wrbuf_puts(c->wrbuf, HTTP_COMMAND_RESPONSE_PREFIX "\n"); wrbuf_puts(c->wrbuf, " \n"); - wrbuf_puts(c->wrbuf, "wrbuf, " wrbuf, " sha1=\"%s\"", PAZPAR2_VERSION_SHA1); #endif @@ -1103,6 +1193,8 @@ static void cmd_info(struct http_channel *c) wrbuf_puts(c->wrbuf, " \n"); + info_services(c->server, c->wrbuf); + wrbuf_puts(c->wrbuf, ""); rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf)); http_send_response(c); @@ -1120,6 +1212,8 @@ struct { { "search", cmd_search }, { "termlist", cmd_termlist }, { "exit", cmd_exit }, + { "session-status", cmd_session_status }, + { "server-status", cmd_server_status }, { "ping", cmd_ping }, { "record", cmd_record }, { "info", cmd_info },