Fixed: missing release_session. Using HTTP module log level some places.
authorDennis Schafroth <dennis@indexdata.com>
Wed, 28 Apr 2010 16:14:06 +0000 (18:14 +0200)
committerDennis Schafroth <dennis@indexdata.com>
Wed, 28 Apr 2010 16:14:06 +0000 (18:14 +0200)
src/http_command.c

index 902957a..b37eca9 100644 (file)
@@ -61,6 +61,7 @@ struct http_session {
 struct http_sessions {
     struct http_session *session_list;
     YAZ_MUTEX mutex;
+    int log_level;
 };
 
 http_sessions_t http_sessions_create(void)
@@ -69,6 +70,7 @@ http_sessions_t http_sessions_create(void)
     hs->session_list = 0;
     hs->mutex = 0;
     pazpar2_mutex_create(&hs->mutex, "http_sessions");
+    hs->log_level = yaz_log_module_level("HTTP");
     return hs;
 }
 
@@ -121,7 +123,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, "%p HTTP session %u created. timeout chan=%p timeout=%d", r, sesid, r->timeout_iochan, service->session_timeout);
+    yaz_log(http_sessions->log_level, "%p 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);
@@ -134,7 +136,7 @@ void http_session_destroy(struct http_session *s)
 
     http_sessions_t http_sessions = s->http_sessions;
 
-    yaz_log(YLOG_LOG, "%p HTTP session destroy %u", s, s->session_id);
+    yaz_log(http_sessions->log_level, "%p 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) {
@@ -150,13 +152,14 @@ void http_session_destroy(struct http_session *s)
     yaz_mutex_leave(http_sessions->mutex);
     if (must_destroy)
     {   /* destroying for real */
-        yaz_log(YLOG_LOG, "Destroying session %u", s->session_id);
+        yaz_log(http_sessions->log_level, "%p Session %u destroyed", s, s->session_id);
         iochan_destroy(s->timeout_iochan);
         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);
+        yaz_log(http_sessions->log_level, "%p Session %u destroyed delayed. Active clients (%d-%d). Waiting for new timeout.", 
+                s, s->session_id, s->activity_counter, s->destroy_counter);
     }
 
 }
@@ -277,7 +280,7 @@ static struct http_session *locate_session(struct http_channel *c)
 }
 
 // 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) {
+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)
@@ -365,11 +368,11 @@ static void cmd_init(struct http_channel *c)
     sesid = make_sessionid();
     s = http_session_create(service, c->http_sessions, sesid);
     
-    yaz_log(YLOG_DEBUG, "HTTP Session init");
+    yaz_log(c->http_sessions->log_level, "%p Session init %u ", s, sesid);
     if (!clear || *clear == '0')
         session_init_databases(s->psession);
     else
-        yaz_log(YLOG_LOG, "No databases preloaded");
+        yaz_log(YLOG_LOG, "HTTP Session %u init: No databases preloaded", sesid);
     
     if (process_settings(s->psession, c->request, c->response) < 0)
         return;
@@ -423,8 +426,10 @@ static void cmd_settings(struct http_channel *c)
 
         xmlFreeDoc(doc);
     }
-    if (process_settings(s->psession, rq, rs) < 0)
+    if (process_settings(s->psession, rq, rs) < 0) {
+        release_session(c,s);
         return;
+    }
     rs->payload = HTTP_COMMAND_RESPONSE_PREFIX "<settings><status>OK</status></settings>";
     http_send_response(c);
     release_session(c,s);
@@ -929,12 +934,12 @@ static void cmd_show(struct http_channel *c)
             if (session_set_watch(s->psession, SESSION_WATCH_SHOW,
                                   show_records_ready, c, c) != 0)
             {
-                yaz_log(YLOG_DEBUG, "Blocking on cmd_show");
+                yaz_log(c->http_sessions->log_level, "%p Session %u: Blocking on cmd_show", s, s->session_id);
             }
+            release_session(c,s);
             return;
         }
     }
-
     show_records(c, status);
     release_session(c,s);
 }