Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/pazpar2
authorDennis Schafroth <dennis@indexdata.com>
Wed, 30 Mar 2011 13:40:36 +0000 (15:40 +0200)
committerDennis Schafroth <dennis@indexdata.com>
Wed, 30 Mar 2011 13:40:36 +0000 (15:40 +0200)
1  2 
src/http_command.c
src/session.c

diff --combined src/http_command.c
@@@ -41,6 -41,29 +41,29 @@@ Foundation, Inc., 51 Franklin St, Fift
  #include "settings.h"
  #include "client.h"
  
+ #include <malloc.h>
+ void print_meminfo(WRBUF wrbuf) {
+ #ifdef __GNUC__
+     struct mallinfo minfo;
+     minfo = mallinfo();
+     wrbuf_printf(wrbuf, "  <memory>\n"
+                         "   <arena>%d</arena>\n" 
+                         "   <uordblks>%d</uordblks>\n"
+                         "   <fordblks>%d</fordblks>\n"
+                         "   <ordblks>%d</ordblks>\n"
+                         "   <keepcost>%d</keepcost>\n"
+                         "   <hblks>%d</hblks>\n" 
+                         "   <hblkhd>%d</hblkhd>\n"
+                         "   <virt>%d</virt>\n"
+                         "   <virtuse>%d</virtuse>\n"
+                         "  </memory>\n", 
+                  minfo.arena, minfo.uordblks, minfo.fordblks,minfo.ordblks, minfo.keepcost, minfo.hblks, minfo.hblkhd, minfo.arena + minfo.hblkhd, minfo.uordblks + minfo.hblkhd);
+ #endif
+ }
  // Update this when the protocol changes
  #define PAZPAR2_PROTOCOL_VERSION "1"
  
@@@ -246,7 -269,7 +269,7 @@@ unsigned int make_sessionid(void
      unsigned int res;
  
      seq++;
-     if (global_parameters.debug_mode)
+     if (global_parameters.predictable_sessions)
          res = seq;
      else
      {
@@@ -339,12 -362,7 +362,12 @@@ static int process_settings(struct sess
  
  static void cmd_exit(struct http_channel *c)
  {
 +    char buf[1024];
 +    struct http_response *rs = c->response;
      yaz_log(YLOG_WARN, "exit");
 +    sprintf(buf, HTTP_COMMAND_RESPONSE_PREFIX "<exit><status>OK</status></exit>");
 +    rs->payload = nmem_strdup(c->nmem, buf);
 +    http_send_response(c);
      http_close_server(c->server);
  }
  
@@@ -637,6 -655,7 +660,7 @@@ static void cmd_server_status(struct ht
      wrbuf_printf(c->wrbuf, "  <clients>%u</clients>\n",   clients);
      /* Only works if yaz has been compiled with enabling of this */
      wrbuf_printf(c->wrbuf, "  <resultsets>%u</resultsets>\n",resultsets);
+     print_meminfo(c->wrbuf);
  
  /* TODO add all sessions status                         */
  /*    http_sessions_t http_sessions = c->http_sessions; */
@@@ -702,11 -721,10 +726,10 @@@ static void cmd_bytarget(struct http_ch
          if (settings && *settings == '1')
          {
              wrbuf_puts(c->wrbuf, "<settings>\n");
-             wrbuf_puts(c->wrbuf, wrbuf_cstr(ht[i].settings_xml));
+             wrbuf_puts(c->wrbuf, ht[i].settings_xml);
              wrbuf_puts(c->wrbuf, "</settings>\n");
          }
          wrbuf_puts(c->wrbuf, "</target>");
-         wrbuf_destroy(ht[i].settings_xml);
      }
  
      wrbuf_puts(c->wrbuf, "</bytarget>");
diff --combined src/session.c
@@@ -86,7 -86,8 +86,8 @@@ Foundation, Inc., 51 Franklin St, Fift
  struct parameters global_parameters = 
  {
      0,   // dump_records
-     0    // debug_mode
+     0,   // debug_mode
+     0,   // predictable sessions
  };
  
  struct client_list {
@@@ -97,7 -98,6 +98,7 @@@
  /* session counting (1) , disable client counting (0) */
  static YAZ_MUTEX g_session_mutex = 0;
  static int no_sessions = 0;
 +static int no_session_total = 0;
  
  static int session_use(int delta)
  {
          yaz_mutex_create(&g_session_mutex);
      yaz_mutex_enter(g_session_mutex);
      no_sessions += delta;
 +    if (delta > 0)
 +        no_session_total += delta;
      sessions = no_sessions;
      yaz_mutex_leave(g_session_mutex);
      yaz_log(YLOG_DEBUG, "%s sesions=%d", delta == 0 ? "" : (delta > 0 ? "INC" : "DEC"), no_sessions);
@@@ -118,17 -116,6 +119,17 @@@ int sessions_count(void) 
      return session_use(0);
  }
  
 +int  session_count_total(void) {
 +    int total = 0;
 +    if (!g_session_mutex)
 +        return 0;
 +    yaz_mutex_enter(g_session_mutex);
 +    total = no_session_total;
 +    yaz_mutex_leave(g_session_mutex);
 +    return total;
 +}
 +
 +
  static void log_xml_doc(xmlDoc *doc)
  {
      FILE *lf = yaz_log_file();
@@@ -759,13 -746,8 +760,13 @@@ void session_apply_setting(struct sessi
      }
  }
  
 +/* Depreciated: use session_destroy */
  void destroy_session(struct session *se)
  {
 +    session_destroy(se);
 +}
 +
 +void session_destroy(struct session *se) {
      struct session_database *sdb;
      session_log(se, YLOG_DEBUG, "Destroying");
      session_use(-1);
      service_destroy(se->service);
      yaz_mutex_destroy(&se->session_mutex);
      wrbuf_destroy(se->wrbuf);
 +
  }
  
 +
  size_t session_get_memory_status(struct session *session) {
      size_t session_nmem;
      if (session == 0)
@@@ -859,7 -839,8 +860,8 @@@ struct hitsbytarget *hitsbytarget(struc
          res[*count].state = client_get_state_str(cl);
          res[*count].connected  = client_get_connection(cl) ? 1 : 0;
          session_settings_dump(se, client_get_database(cl), w);
-         res[*count].settings_xml = w;
+         res[*count].settings_xml = nmem_strdup(nmem, wrbuf_cstr(w));
+         wrbuf_destroy(w);
          (*count)++;
      }
      session_leave(se);
@@@ -1262,7 -1243,6 +1264,7 @@@ static int ingest_to_cluster(struct cli
      \param nmem working NMEM
      \retval 0 OK
      \retval -1 failure
 +    \retval -2 Filtered
  */
  int ingest_record(struct client *cl, const char *rec,
                    int record_no, NMEM nmem)
      
      if (!check_record_filter(root, sdb))
      {
 -        session_log(se, YLOG_WARN, "Filtered out record no %d from %s",
 +        session_log(se, YLOG_LOG, "Filtered out record no %d from %s",
                      record_no, sdb->database->url);
          xmlFreeDoc(xdoc);
 -        return -1;
 +        return -2;
      }
      
      mergekey_norm = get_mergekey(xdoc, cl, record_no, service, nmem);