New commands: sesion-status and server-status
authorDennis Schafroth <dennis@indexdata.com>
Thu, 24 Feb 2011 10:05:05 +0000 (11:05 +0100)
committerDennis Schafroth <dennis@indexdata.com>
Thu, 24 Feb 2011 10:05:05 +0000 (11:05 +0100)
src/http_command.c

index bdd68a8..fbda478 100644 (file)
@@ -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,49 @@ static void cmd_termlist(struct http_channel *c)
     release_session(c,s);
 }
 
+size_t session_get_memory_status(struct session *session);
+
+static void cmd_session_status(struct http_channel *c)
+{
+    struct http_response *rs = c->response;
+    struct http_session *s = locate_session(c);
+    size_t session_nmem;
+    if (!s)
+        return;
+
+    wrbuf_rewind(c->wrbuf);
+    wrbuf_puts(c->wrbuf, HTTP_COMMAND_RESPONSE_PREFIX "<sessionstatus><status>OK</status>\n");
+    wrbuf_printf(c->wrbuf, "<http_count>%u</http_count>\n", s->activity_counter);
+    wrbuf_printf(c->wrbuf, "<http_nmem>%zu</http_nmem>\n", nmem_total(s->nmem) );
+
+    session_nmem = session_get_memory_status(s->psession);
+    wrbuf_printf(c->wrbuf, "<session_nmem>%zu</session_nmem>\n", session_nmem);
+
+    wrbuf_puts(c->wrbuf, "</sessionstatus>\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);
+int resultsets_count(void);
+
+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 "<server-status><status>OK</status>\n");
+    wrbuf_printf(c->wrbuf, "Sessions %u Clients: %u Resultsets: %u\n</server-status>\n", sessions, clients, resultsets);
+    rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
+    http_send_response(c);
+}
+
+
 
 static void cmd_bytarget(struct http_channel *c)
 {
@@ -1120,6 +1182,8 @@ struct {
     { "search", cmd_search },
     { "termlist", cmd_termlist },
     { "exit", cmd_exit },
+    { "sessionstatus", cmd_session_status },
+    { "serverstatus", cmd_server_status },
     { "ping", cmd_ping },
     { "record", cmd_record },
     { "info", cmd_info },