OSDN Git Service

* updated copyright.
[modchxj/mod_chxj.git] / src / chxj_mysql.c
index e609946..1bb0236 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2008 Atsushi Konno All rights reserved.
+ * Copyright (C) 2005-2011 Atsushi Konno All rights reserved.
  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
 #include <errmsg.h>
 
 
-#define CHXJ_MYSQL_RECONNECT_WAIT_TIME (1)
+#define CHXJ_MYSQL_RECONNECT_WAIT_TIME (5000)
 #define CHXJ_MYSQL_RECONNECT_COUNT (3)
 
 typedef struct {
-  MYSQL * handle;
+  MYSQL *handle;
   char host[255];
   char username[255];
   char database[255];
@@ -78,33 +78,39 @@ chxj_open_mysql_handle(request_rec *r, mod_chxj_config *m)
 {
   static MYSQL mysql_conn;
   char query[MAX_STRING_LEN];
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
 
   if (connection.handle && connection.reconnect == 0) {
     if ((!m->mysql.host || (strcasecmp(m->mysql.host, "localhost") == 0)) && connection.host[0] == '\0'
-        &&  (!m->mysql.username || (strcmp(m->mysql.username, connection.username) == 0))) {
+        &&  (m->mysql.username && strcmp(m->mysql.username, connection.username) == 0)) {
 
       if (m->mysql.database && strcmp(m->mysql.database, connection.database) == 0) {
+        DBG(r,"REQ[%X] already connected",TO_ADDR(r));
+        DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
         return 1;
       }
       else {
         if (mysql_select_db(connection.handle,m->mysql.database) != 0) {
-          ERR(r, "MySQL ERROR: %s", mysql_error(connection.handle));
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle));
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
           return 0;
         }
         else {
           strcpy (connection.database, m->mysql.database);
+          DBG(r,"REQ[%X] already connected. new database:[%s]", TO_ADDR(r),m->mysql.database);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
           return 1;
         }
       }
     }
-    else {
-      chxj_close_mysql_handle();
-    }
   }
 
+  chxj_close_mysql_handle();
   connection.handle = mysql_init(&mysql_conn);
   if (! connection.handle) {
-    ERR(r, "MySQL ERROR: %s", mysql_error(&mysql_conn));
+    ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s", TO_ADDR(r),APLOG_MARK, mysql_error(&mysql_conn));
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+    return 0;
   }
 
   if (!m->mysql.host || strcmp(m->mysql.host,"localhost") == 0) {
@@ -116,19 +122,18 @@ chxj_open_mysql_handle(request_rec *r, mod_chxj_config *m)
   connection.handle = mysql_real_connect(&mysql_conn,connection.host,m->mysql.username,
                                  m->mysql.password, NULL, m->mysql.port, m->mysql.socket_path, 0);
   if (!connection.handle) {
-    ERR(r, "MySQL ERROR: %s. host:[%s] username:[%s] password:[%s] port:[%d] socket_path:[%s]", mysql_error(&mysql_conn), 
+    ERR(r, "REQ[%X] MySQL ERROR: %s. host:[%s] username:[%s] password:[%s] port:[%d] socket_path:[%s]", TO_ADDR(r),mysql_error(&mysql_conn), 
        connection.host, 
        m->mysql.username,
        m->mysql.password,
        m->mysql.port,
        m->mysql.socket_path);
+    DBG(r,"REQ[%X] end chxj_open_mysql_handle()", TO_ADDR(r));
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
-  if (!m->mysql.keep_alive) {
-    apr_pool_cleanup_register(r->pool, (void *)NULL, _mysql_cleanup, _mysql_cleanup_child);
-  }
-
+  apr_pool_cleanup_register(r->pool, (void *)NULL, _mysql_cleanup, _mysql_cleanup_child);
   if (m->mysql.username) {
     strcpy(connection.username, m->mysql.username);
   }
@@ -137,7 +142,8 @@ chxj_open_mysql_handle(request_rec *r, mod_chxj_config *m)
   }
 
   if (mysql_select_db(connection.handle,m->mysql.database) != 0) {
-    ERR(r, "MySQL ERROR: %s", mysql_error(connection.handle));
+    ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle));
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
@@ -145,11 +151,13 @@ chxj_open_mysql_handle(request_rec *r, mod_chxj_config *m)
   if (m->mysql.charset) {
     apr_snprintf(query, sizeof(query)-1, "SET CHARACTER SET %s", m->mysql.charset);
     if (mysql_query(connection.handle, query) != 0) {
-      ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
 
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return 1;
 }
 
@@ -159,22 +167,33 @@ chxj_mysql_exist_cookie_table(request_rec *r, mod_chxj_config *m)
 {
   MYSQL_RES *result;
   char query[MAX_STRING_LEN];
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   apr_snprintf(query, sizeof(query)-1, "desc %s", m->mysql.tablename);
-  DBG(r, "start chxj_mysql_exist_cookie_table() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
   do { 
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle() query:[%s]", TO_ADDR(r),APLOG_MARK, query);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0;
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      WRN(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
@@ -183,7 +202,8 @@ chxj_mysql_exist_cookie_table(request_rec *r, mod_chxj_config *m)
   result = mysql_store_result(connection.handle);
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_mysql_exist_cookie_table() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r), query);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return 1;
 }
@@ -194,24 +214,35 @@ chxj_mysql_exist_cookie_table_expire(request_rec *r, mod_chxj_config *m)
 {
   MYSQL_RES *result;
   char query[MAX_STRING_LEN];
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   apr_snprintf(query, sizeof(query)-1, "desc %s_expire", m->mysql.tablename);
 
   DBG(r, "start chxj_mysql_exist_cookie_table_expire() query:[%s]", query);
 
   do { 
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
+      ERR(r, "%s:%d failed chxj_open_mysql_handle() query:[%s]", APLOG_MARK, query);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0;
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      WRN(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   } while(0);
@@ -219,7 +250,8 @@ chxj_mysql_exist_cookie_table_expire(request_rec *r, mod_chxj_config *m)
   result = mysql_store_result(connection.handle);
   if (result) mysql_free_result(result);
 
-  DBG(r, "end chxj_mysql_exist_cookie_table_expire() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return 1;
 }
@@ -230,24 +262,35 @@ chxj_mysql_create_cookie_table(request_rec *r, mod_chxj_config *m)
 {
   MYSQL_RES *result;
   char query[MAX_STRING_LEN];
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   apr_snprintf(query, sizeof(query)-1, "CREATE TABLE %s  (cookie_id VARCHAR(%d) NOT NULL, data TEXT, PRIMARY KEY(cookie_id)) TYPE=InnoDB;",
     m->mysql.tablename,
     apr_base64_encode_len(APR_MD5_DIGESTSIZE) * 3);
-  DBG(r, "start chxj_mysql_create_cookie_table() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle() query:[%s]", TO_ADDR(r),APLOG_MARK, query);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0;
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      WRN(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
@@ -256,7 +299,8 @@ chxj_mysql_create_cookie_table(request_rec *r, mod_chxj_config *m)
   result = mysql_store_result(connection.handle);
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_mysql_create_cookie_table() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return 1;
 }
@@ -266,26 +310,37 @@ chxj_mysql_create_cookie_expire_table(request_rec *r, mod_chxj_config *m)
 {
   MYSQL_RES *result;
   char query[MAX_STRING_LEN];
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   apr_snprintf(query, sizeof(query)-1, "CREATE TABLE %s_expire  (cookie_id VARCHAR(%d) NOT NULL, created_at DATETIME, PRIMARY KEY(cookie_id)) TYPE=InnoDB;",
     m->mysql.tablename,
     apr_base64_encode_len(APR_MD5_DIGESTSIZE) * 3);
 
-  DBG(r, "start chxj_mysql_create_cookie_expire_table() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
 
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle() query:[%s]", TO_ADDR(r),APLOG_MARK, query);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0;
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      WRN(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
@@ -294,7 +349,8 @@ chxj_mysql_create_cookie_expire_table(request_rec *r, mod_chxj_config *m)
   result = mysql_store_result(connection.handle);
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_mysql_create_cookie_expire_table() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return 1;
 }
@@ -308,24 +364,35 @@ chxj_mysql_get_cookie_from_cookie_id(request_rec *r, mod_chxj_config *m, const c
   char *retval = NULL;
   apr_size_t clen = strlen(cookie_id);
   char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
 
-  apr_snprintf(query, sizeof(query)-1, "SELECT data, length(data) FROM %s WHERE cookie_id = '%s' FOR UPDATE;", m->mysql.tablename, sql_safe_cookie_id);
-  DBG(r, "start chxj_mysql_get_cookie_from_cookie_id() query:[%s]", query);
+  apr_snprintf(query, sizeof(query)-1, "SELECT data, length(data) FROM %s WHERE cookie_id = '%s'", m->mysql.tablename, sql_safe_cookie_id);
+  DBG(r, "REQ[%X] query:[%s]", TO_ADDR(r),query);
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle() query:[%s]", TO_ADDR(r),APLOG_MARK, query);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0;
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      WRN(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
   }
@@ -336,8 +403,9 @@ chxj_mysql_get_cookie_from_cookie_id(request_rec *r, mod_chxj_config *m, const c
     MYSQL_ROW data = mysql_fetch_row(result);
     int len;
     if (! data[0]) {
-      ERR(r, "MySQL cookie_id:[%s] has no valid cookie_id. %s", cookie_id, r->uri);
       mysql_free_result(result);
+      ERR(r,"REQ[%X] %s:%d MySQL cookie_id:[%s] has no valid cookie_id. %s", TO_ADDR(r), APLOG_MARK, cookie_id, r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
     len = atoi(data[1]);
@@ -345,8 +413,10 @@ chxj_mysql_get_cookie_from_cookie_id(request_rec *r, mod_chxj_config *m, const c
     memcpy(retval, data[0], len);
   }
   if (result) mysql_free_result(result);
+
   
-  DBG(r, "end chxj_mysql_get_cookie_from_cookie_id() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return retval;
 }
@@ -360,27 +430,38 @@ chxj_mysql_get_cookie_expire_from_cookie_id(request_rec *r, mod_chxj_config *m,
   apr_size_t clen = strlen(cookie_id);
   char *retval = NULL;
   char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
 
-  apr_snprintf(query, sizeof(query)-1, "SELECT DATE_FORMAT(created_at, '%%Y%%m%%d%%H%%i%%s') FROM %s_expire WHERE cookie_id = '%s' FOR UPDATE;", 
+  apr_snprintf(query, sizeof(query)-1, "SELECT DATE_FORMAT(created_at, '%%Y%%m%%d%%H%%i%%s') FROM %s_expire WHERE cookie_id = '%s'", 
     m->mysql.tablename, sql_safe_cookie_id);
 
-  DBG(r, "start chxj_mysql_get_cookie_expire_from_cookie_id() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
 
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle() query:[%s]", TO_ADDR(r),APLOG_MARK, query);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
     connection.reconnect = 0;
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      WRN(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
   }
@@ -390,8 +471,9 @@ chxj_mysql_get_cookie_expire_from_cookie_id(request_rec *r, mod_chxj_config *m,
   if (result && (mysql_num_rows(result) >= 1)) {
     MYSQL_ROW data = mysql_fetch_row(result);
     if (! data[0]) {
-      ERR(r, "MySQL cookie_id:[%s] has no valid cookie_id. %s", cookie_id, r->uri);
       mysql_free_result(result);
+      ERR(r,"REQ[%X] %s:%d MySQL cookie_id:[%s] has no valid cookie_id. %s", TO_ADDR(r),APLOG_MARK, cookie_id, r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
     retval = (char *) apr_palloc(r->pool, 19 + 1);
@@ -400,7 +482,8 @@ chxj_mysql_get_cookie_expire_from_cookie_id(request_rec *r, mod_chxj_config *m,
   }
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_mysql_get_cookie_expire_from_cookie_id() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s] retval:[%s]", TO_ADDR(r),query, retval);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return retval;
 }
@@ -413,57 +496,71 @@ chxj_mysql_insert_or_update_cookie(request_rec *r, mod_chxj_config *m, const cha
   char query[MAX_STRING_LEN];
   char *cid = ap_escape_logitem(r->pool, cookie_id);
   char *cdt = ap_escape_logitem(r->pool, data);
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
-  DBG(r, "start chxj_mysql_insert_or_update_cookie()");
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
+  DBG(r,"REQ[%X] data:[%s]", TO_ADDR(r),data);
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle()");
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle()", TO_ADDR(r), APLOG_MARK);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0;
     apr_snprintf(query, sizeof(query)-1, "BEGIN;");
-    DBG(r, "query:[%s]", query);
+    DBG(r, "REQ[%X] query:[%s]", TO_ADDR(r), query);
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
   while(0);
 
   apr_snprintf(query, sizeof(query)-1, "INSERT INTO %s (cookie_id, data) VALUES ('%s','%s');", m->mysql.tablename, cid, cdt);
-  DBG(r, "query:[%s]", query);
+  DBG(r, "REQ[%X] query:[%s]", TO_ADDR(r), query);
   if (mysql_query(connection.handle, query) != 0) {
     WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
     if (!chxj_mysql_get_cookie_from_cookie_id(r, m, cookie_id)) {
-      ERR(r, "failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", cookie_id);
+      ERR(r,"REQ[%X] %s:%d failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", TO_ADDR(r), APLOG_MARK, cookie_id);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     apr_snprintf(query, sizeof(query)-1, "UPDATE %s set data = '%s' WHERE cookie_id = '%s';", m->mysql.tablename, cdt, cid);
     DBG(r, "query:[%s]", query);
     if (mysql_query(connection.handle, query) != 0) {
-      ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r, "REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
       chxj_mysql_rollback(r, m);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
 
   apr_snprintf(query, sizeof(query)-1, "COMMIT;");
-  DBG(r, "query:[%s]", query);
+  DBG(r, "REQ[%X] query:[%s]", TO_ADDR(r), query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
   result = mysql_store_result(connection.handle);
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_mysql_get_cookie_from_cookie_id()");
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return 1;
 }
@@ -475,58 +572,71 @@ chxj_mysql_insert_or_update_cookie_expire(request_rec *r, mod_chxj_config *m, co
   MYSQL_RES *result;
   char query[MAX_STRING_LEN];
   char *cid = ap_escape_logitem(r->pool, cookie_id);
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
-  DBG(r, "start chxj_mysql_insert_or_update_cookie_expire()");
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
 
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle()");
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle()", TO_ADDR(r), APLOG_MARK);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0; 
     apr_snprintf(query, sizeof(query)-1, "BEGIN;");
-    DBG(r, "query:[%s]", query);
+    DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK,mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
   while(0);
 
   apr_snprintf(query, sizeof(query)-1, "INSERT INTO %s_expire (cookie_id, created_at) VALUES ('%s',localtime);", m->mysql.tablename, cid);
-  DBG(r, "query:[%s]", query);
+  DBG(r, "REQ[%X] query:[%s]", TO_ADDR(r),query);
   if (mysql_query(connection.handle, query) != 0) {
-    WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+    WRN(r, "REQ[%X] MySQL WARN: %s: %s", TO_ADDR(r),mysql_error(connection.handle), r->uri);
     if (!chxj_mysql_get_cookie_from_cookie_id(r, m, cookie_id)) {
-      ERR(r, "failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", cookie_id);
+      ERR(r,"REQ[%X] %s:%d failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", TO_ADDR(r),APLOG_MARK, cookie_id);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     apr_snprintf(query, sizeof(query)-1, "UPDATE %s_expire set created_at = localtime WHERE cookie_id = '%s';", m->mysql.tablename, cid);
-    DBG(r, "query:[%s]", query);
+    DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
     if (mysql_query(connection.handle, query) != 0) {
-      ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
       chxj_mysql_rollback(r, m);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
 
   apr_snprintf(query, sizeof(query)-1, "COMMIT;");
-  DBG(r, "query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
   result = mysql_store_result(connection.handle);
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_mysql_insert_or_update_cookie_expire()");
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return 1;
 }
@@ -537,18 +647,20 @@ chxj_mysql_rollback(request_rec *r, mod_chxj_config *m)
 {
   char query[MAX_STRING_LEN];
 
-  DBG(r, "start chxj_mysql_rollback()");
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
 
   apr_snprintf(query, sizeof(query)-1, "ROLLBACK;");
 
   if (!chxj_open_mysql_handle(r, m)) {
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 1; /* TRUE */
   }
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0; /* FALSE */
   }
-  DBG(r, "end chxj_mysql_rollback()");
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return 1;
 }
 
@@ -560,26 +672,37 @@ chxj_mysql_load_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id
   apr_size_t clen = strlen(cookie_id);
   char *retval = NULL;
   char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
   
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
 
   apr_snprintf(query, sizeof(query)-1, "SELECT data, length(data) FROM %s WHERE cookie_id = '%s';", m->mysql.tablename, sql_safe_cookie_id);
 
-  DBG(r, "start chxj_mysql_load_cookie() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r), query);
 
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle() query:[%s]", TO_ADDR(r), APLOG_MARK, query);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
-    connection.reconnect = 1;
+    connection.reconnect = 0;
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return NULL;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      WRN(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
   }
@@ -590,17 +713,20 @@ chxj_mysql_load_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id
     MYSQL_ROW data = mysql_fetch_row(result);
     int len;
     if (! data[0]) {
-      ERR(r, "MySQL cookie_id:[%s] has no valid cookie_id. %s", cookie_id, r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL cookie_id:[%s] has no valid cookie_id. %s", TO_ADDR(r),APLOG_MARK, cookie_id, r->uri);
       mysql_free_result(result);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
     len = atoi(data[1]);
     retval = (char *) apr_palloc(r->pool, len + 1);
+    memset(retval, 0, len + 1);
     memcpy(retval, data[0], len);
   }
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_load_mysql_cookie() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return retval;
 }
@@ -614,7 +740,10 @@ chxj_mysql_load_cookie_expire(request_rec *r, mod_chxj_config *m, const char *co
   char *retval = NULL;
   apr_size_t clen = strlen(cookie_id);
   char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
 
   apr_snprintf(query, 
@@ -623,21 +752,29 @@ chxj_mysql_load_cookie_expire(request_rec *r, mod_chxj_config *m, const char *co
                m->mysql.tablename, 
                sql_safe_cookie_id);
 
-  DBG(r, "start chxj_mysql_load_cookie_expire() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
 
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle() query:[%s]", TO_ADDR(r),APLOG_MARK,query);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
     connection.reconnect = 0;
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK,mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      WRN(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
   }
@@ -647,8 +784,9 @@ chxj_mysql_load_cookie_expire(request_rec *r, mod_chxj_config *m, const char *co
   if (result && (mysql_num_rows(result) >= 1)) {
     MYSQL_ROW data = mysql_fetch_row(result);
     if (! data[0]) {
-      ERR(r, "MySQL cookie_id:[%s] has no valid cookie_id. %s", cookie_id, r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL cookie_id:[%s] has no valid cookie_id. %s",TO_ADDR(r), APLOG_MARK,cookie_id, r->uri);
       mysql_free_result(result);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
     retval = (char *) apr_palloc(r->pool, 14 + 1);
@@ -656,7 +794,8 @@ chxj_mysql_load_cookie_expire(request_rec *r, mod_chxj_config *m, const char *co
   }
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_mysql_load_cookie_expire() query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return retval;
 }
@@ -668,12 +807,16 @@ chxj_mysql_delete_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_
   MYSQL_RES *result;
   char query[MAX_STRING_LEN];
   char *cid = ap_escape_logitem(r->pool, cookie_id);
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
-  DBG(r, "start chxj_mysql_delete_cookie() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
 
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle()");
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle()", TO_ADDR(r),APLOG_MARK);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0;
@@ -682,39 +825,49 @@ chxj_mysql_delete_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r),APLOG_MARK,mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
   while(0);
 
   if (!chxj_mysql_get_cookie_from_cookie_id(r, m, cookie_id)) {
-    ERR(r, "failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", cookie_id);
+    ERR(r,"REQ[%X] %s:%d failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", TO_ADDR(r), APLOG_MARK,cookie_id);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
   apr_snprintf(query, sizeof(query)-1, "DELETE FROM %s WHERE cookie_id = '%s';", m->mysql.tablename, cid);
-  DBG(r, "query:[%s]", query);
+  DBG(r, "REQ[%X] query:[%s]", TO_ADDR(r), query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
   apr_snprintf(query, sizeof(query)-1, "COMMIT;");
-  DBG(r, "query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r), query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
   result = mysql_store_result(connection.handle);
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_mysql_delete_cookie()");
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return 1;
 }
@@ -726,53 +879,68 @@ chxj_mysql_delete_cookie_expire(request_rec *r, mod_chxj_config *m, const char *
   MYSQL_RES *result;
   char query[MAX_STRING_LEN];
   char *cid = ap_escape_logitem(r->pool, cookie_id);
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
-  DBG(r, "start chxj_mysql_delete_cookie_expire() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
 
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle()");
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle()", TO_ADDR(r), APLOG_MARK);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0; 
     apr_snprintf(query, sizeof(query)-1, "BEGIN;");
-    DBG(r, "query:[%s]", query);
+    DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r), APLOG_MARK,mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r),APLOG_MARK,mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
   while(0);
 
   if (!chxj_mysql_get_cookie_expire_from_cookie_id(r, m, cookie_id)) {
-    ERR(r, "failed chxj_mysql_get_cookie_expire_from_cookie_id() cookie_id:[%s]", cookie_id);
+    ERR(r,"REQ[%X] %s:%d failed chxj_mysql_get_cookie_expire_from_cookie_id() cookie_id:[%s]", TO_ADDR(r),APLOG_MARK,cookie_id);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
   apr_snprintf(query, sizeof(query)-1, "DELETE FROM %s_expire WHERE cookie_id = '%s';", m->mysql.tablename, cid);
-  DBG(r, "query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK,mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
   apr_snprintf(query, sizeof(query)-1, "COMMIT;");
   DBG(r, "query:[%s]", query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
   result = mysql_store_result(connection.handle);
   if (result) mysql_free_result(result);
   
-  DBG(r, "end chxj_mysql_delete_cookie_expire() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%x] cookie_id:[%s]", TO_ADDR(r),cookie_id);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return 1;
 }
@@ -783,25 +951,34 @@ chxj_mysql_get_timeout_localtime(request_rec *r, mod_chxj_config *m)
   MYSQL_RES *result;
   char query[MAX_STRING_LEN];
   char *retval = NULL;
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
 
-  DBG(r, "start chxj_mysql_get_timeout_localtime()");
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle()");
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle()", TO_ADDR(r), APLOG_MARK);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0;
-
     apr_snprintf(query, sizeof(query)-1, "SELECT DATE_SUB(localtime, interval %ld second);",
       (m->cookie_timeout == 0) ? DEFAULT_COOKIE_TIMEOUT : m->cookie_timeout);
-    DBG(r, "query:[%s]", query);
+    DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
   }
@@ -810,8 +987,9 @@ chxj_mysql_get_timeout_localtime(request_rec *r, mod_chxj_config *m)
   if (result && (mysql_num_rows(result) >= 1)) {
     MYSQL_ROW data = mysql_fetch_row(result);
     if (! data[0]) {
-      ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
       mysql_free_result(result);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
     retval = (char *) apr_palloc(r->pool, 19 + 1);
@@ -820,7 +998,7 @@ chxj_mysql_get_timeout_localtime(request_rec *r, mod_chxj_config *m)
   }
   if (result) mysql_free_result(result);
    
-  DBG(r, "end chxj_mysql_get_timeout_localtime()");
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
 
   return retval;
 }
@@ -831,23 +1009,34 @@ chxj_mysql_delete_expired_cookie(request_rec *r, mod_chxj_config *m)
   MYSQL_RES *result;
   char query[MAX_STRING_LEN];
   char *timeout;
-  DBG(r, "start chxj_mysql_delete_expired_cookie()");
+  int retry_count = 0;
+  apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
+
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
 
   do {
     if (!chxj_open_mysql_handle(r, m)) {
-      ERR(r, "failed chxj_open_mysql_handle()");
+      ERR(r,"REQ[%X] %s:%d failed chxj_open_mysql_handle()", TO_ADDR(r), APLOG_MARK);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
     connection.reconnect = 0;
     apr_snprintf(query, sizeof(query)-1, "BEGIN;");
-    DBG(r, "query:[%s]", query);
+    DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r), query);
     if (mysql_query(connection.handle, query) != 0) {
       if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
         connection.reconnect = 1;
-        sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
+        retry_count++;
+        if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
+          ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s(retry over)", TO_ADDR(r), APLOG_MARK,mysql_error(connection.handle), r->uri);
+          DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+          return 0;
+        }
+        apr_sleep(wait_time);
         continue;
       }
-      ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
+      ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s", TO_ADDR(r),APLOG_MARK,mysql_error(connection.handle), r->uri);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return 0;
     }
   }
@@ -855,15 +1044,17 @@ chxj_mysql_delete_expired_cookie(request_rec *r, mod_chxj_config *m)
 
   timeout = chxj_mysql_get_timeout_localtime(r, m);
   if (! timeout) {
-    ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
   apr_snprintf(query, sizeof(query)-1, "SELECT * FROM %s_expire WHERE created_at <= '%s'", m->mysql.tablename, timeout);
-  DBG(r, "query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r), query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK,mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
   result = mysql_store_result(connection.handle);
@@ -879,10 +1070,11 @@ chxj_mysql_delete_expired_cookie(request_rec *r, mod_chxj_config *m)
      timeout,
      m->mysql.tablename,
      m->mysql.tablename);
-  DBG(r, "query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r), query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
   result = mysql_store_result(connection.handle);
@@ -895,10 +1087,11 @@ chxj_mysql_delete_expired_cookie(request_rec *r, mod_chxj_config *m)
      m->mysql.tablename,
      m->mysql.tablename,
      timeout);
-  DBG(r, "query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r), query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL ERROR: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
   result = mysql_store_result(connection.handle);
@@ -906,72 +1099,92 @@ chxj_mysql_delete_expired_cookie(request_rec *r, mod_chxj_config *m)
   result = NULL;
 
   apr_snprintf(query, sizeof(query)-1, "COMMIT;");
-  DBG(r, "query:[%s]", query);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r), query);
   if (mysql_query(connection.handle, query) != 0) {
-    ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
+    ERR(r,"REQ[%X] %s:%d MySQL WARN: %s: %s", TO_ADDR(r), APLOG_MARK, mysql_error(connection.handle), r->uri);
     chxj_mysql_rollback(r, m);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return 0;
   }
 
   result = mysql_store_result(connection.handle);
   if (result) mysql_free_result(result);
 
-  DBG(r, "end chxj_mysql_delete_expired_cookie()");
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return 1;
 }
 
 
+
+
+
+
+
+
+
+
+
 int
 chxj_save_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
 {
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
   if (! chxj_open_mysql_handle(r, m)) {
-    ERR(r, "Cannot open mysql connection");
+    ERR(r,"REQ[%X] Cannot open mysql connection", TO_ADDR(r));
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return CHXJ_FALSE;
   }
 
   if (!chxj_mysql_exist_cookie_table(r, m)) {
-    DBG(r, "not found cookie table:[%s]", m->mysql.tablename);
+    DBG(r,"REQ[%X] not found cookie table:[%s]",TO_ADDR(r), m->mysql.tablename);
     if (!chxj_mysql_create_cookie_table(r, m)) {
-      ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
+      ERR(r,"REQ[%X] cannot create cookie table:[%s]", TO_ADDR(r), m->mysql.tablename);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return CHXJ_FALSE;
     }
   }
   if (! chxj_mysql_insert_or_update_cookie(r, m, cookie_id, store_string)) {
-    ERR(r, "cannot store to cookie table:[%s]", m->mysql.tablename);
+    ERR(r,"REQ[%X] cannot store to cookie table:[%s]", TO_ADDR(r), m->mysql.tablename);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return CHXJ_FALSE;
   }
 
   /* *NEED NOT* close database. */
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return CHXJ_TRUE;
 }
 
 int
 chxj_update_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
 {
-  DBG(r, "start chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
   if (! chxj_open_mysql_handle(r, m)) {
-    ERR(r, "Cannot open mysql connection");
-    DBG(r, "end chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
+    ERR(r,"REQ[%X] Cannot open mysql connection", TO_ADDR(r));
+    DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return CHXJ_FALSE;
   }
 
   if (!chxj_mysql_exist_cookie_table(r, m)) {
-    DBG(r, "not found cookie table:[%s]", m->mysql.tablename);
+    DBG(r, "REQ[%X] not found cookie table:[%s]", TO_ADDR(r), m->mysql.tablename);
     if (!chxj_mysql_create_cookie_table(r, m)) {
-      ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
-      DBG(r, "end chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
+      ERR(r,"REQ[%X] cannot create cookie table:[%s]", TO_ADDR(r),m->mysql.tablename);
+      DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return CHXJ_FALSE;
     }
   }
   if (! chxj_mysql_insert_or_update_cookie(r, m, cookie_id, store_string)) {
-    ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
-    DBG(r, "end chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
+    ERR(r,"REQ[%X] cannot create cookie table:[%s]", TO_ADDR(r), m->mysql.tablename);
+    DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return CHXJ_FALSE;
   }
 
   /* *NEED NOT* close database. */
   /* chxj_close_mysql_handle(); */
-  DBG(r, "end chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return CHXJ_TRUE;
 }
 
@@ -981,30 +1194,35 @@ chxj_load_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id
 {
   char *load_string;
 
-  DBG(r, "start chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
   if (! chxj_open_mysql_handle(r, m)) {
-    ERR(r, "Cannot open mysql connection");
-    DBG(r, "end   chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
+    ERR(r,"REQ[%X] Cannot open mysql connection", TO_ADDR(r));
+    DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return NULL;
   }
 
   if (!chxj_mysql_exist_cookie_table(r, m)) {
-    DBG(r, "not found cookie table:[%s]", m->mysql.tablename);
+    DBG(r,"REQ[%X] not found cookie table:[%s]", TO_ADDR(r),m->mysql.tablename);
     if (!chxj_mysql_create_cookie_table(r, m)) {
-      ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
-      DBG(r, "end   chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
+      ERR(r,"REQ[%X] cannot create cookie table:[%s]",TO_ADDR(r), m->mysql.tablename);
+      DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return NULL;
     }
   }
   if (!(load_string = chxj_mysql_load_cookie(r, m, cookie_id))) {
-    ERR(r, "not found cookie. cookie_id:[%s]", cookie_id);
-    DBG(r, "end   chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
+    ERR(r,"REQ[%X] %s:%d not found cookie. cookie_id:[%s]", TO_ADDR(r), APLOG_MARK, cookie_id);
+    DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return NULL;
   }
 
   /* *NEED NOT* close database. */
   /* chxj_close_mysql_handle(); */
-  DBG(r, "end   chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return load_string;
 }
 
@@ -1012,13 +1230,30 @@ chxj_load_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id
 int
 chxj_delete_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
 {
-  DBG(r, "start chxj_delete_cookie_mysql() cookie_id=[%s]", cookie_id);
-  if (!chxj_mysql_delete_cookie(r, m, cookie_id)) {
-    ERR(r, "failed: chxj_mysql_delete_cookie() cookie_id:[%s]", cookie_id);
-    DBG(r, "end chxj_delete_cookie_mysql() cookie_id=[%s]", cookie_id);
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
+  DBG(r,"REQ[%X] cookie_id=[%s]", TO_ADDR(r), cookie_id);
+  if (! chxj_open_mysql_handle(r, m)) {
+    ERR(r,"REQ[%X] %s:%d Cannot open mysql connection cookie_id=[%s]", TO_ADDR(r), APLOG_MARK, cookie_id);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return CHXJ_FALSE;
   }
-  DBG(r, "end chxj_delete_cookie_mysql() cookie_id=[%s]", cookie_id);
+  if (!chxj_mysql_exist_cookie_table(r, m)) {
+    DBG(r,"REQ[%X] not found cookie table:[%s]", TO_ADDR(r), m->mysql.tablename);
+    if (!chxj_mysql_create_cookie_table(r, m)) {
+      ERR(r,"REQ[%X] %s:%d cannot create cookie table:[%s]", TO_ADDR(r), APLOG_MARK, m->mysql.tablename);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+      return CHXJ_FALSE;
+    }
+  }
+  else {
+    if (!chxj_mysql_delete_cookie(r, m, cookie_id)) {
+      ERR(r,"REQ[%X] %s:%d failed: chxj_mysql_delete_cookie() cookie_id:[%s]", TO_ADDR(r), APLOG_MARK, cookie_id);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+      return CHXJ_FALSE;
+    }
+  }
+  DBG(r,"REQ[%X] cookie_id=[%s]", TO_ADDR(r), cookie_id);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return CHXJ_TRUE;
 }
 
@@ -1026,31 +1261,33 @@ chxj_delete_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_
 int
 chxj_save_cookie_expire_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
 {
-  DBG(r, "start chxj_save_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
   if (! chxj_open_mysql_handle(r, m)) {
-    ERR(r, "Cannot open mysql connection");
-    DBG(r, "end   chxj_save_cookie_expire_mysql()");
+    ERR(r,"REQ[%X] %s:%d Cannot open mysql connection cookie_id=[%s]",TO_ADDR(r),APLOG_MARK, cookie_id);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return CHXJ_FALSE;
   }
 
   if (!chxj_mysql_exist_cookie_table_expire(r, m)) {
-    DBG(r, "not found cookie table:[%s_expire]", m->mysql.tablename);
+    DBG(r,"REQ[%X] not found cookie table:[%s_expire]", TO_ADDR(r), m->mysql.tablename);
     if (!chxj_mysql_create_cookie_expire_table(r, m)) {
-      ERR(r, "cannot create cookie table:[%s_expire]", m->mysql.tablename);
-      DBG(r, "end   chxj_save_cookie_expire_mysql()");
+      ERR(r,"REQ[%X] %s:%d cannot create cookie table:[%s_expire] cookie_id:[%s]", TO_ADDR(r),APLOG_MARK, m->mysql.tablename, cookie_id);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
       return CHXJ_FALSE;
     }
   }
   if (! chxj_mysql_insert_or_update_cookie_expire(r, m, cookie_id)) {
-    ERR(r, "cannot create cookie table:[%s_expire]", m->mysql.tablename);
-    DBG(r, "end   chxj_save_cookie_expire_mysql()");
+    ERR(r,"REQ[%X] %s:%d cannot create cookie table:[%s_expire] cookie_id:[%s]", TO_ADDR(r), APLOG_MARK, m->mysql.tablename, cookie_id);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return CHXJ_FALSE;
   }
 
   /* *NEED NOT* close database. */
   /* chxj_close_mysql_handle(); */
 
-  DBG(r, "end   chxj_save_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return CHXJ_TRUE;
 }
 
@@ -1058,13 +1295,30 @@ chxj_save_cookie_expire_mysql(request_rec *r, mod_chxj_config *m, const char *co
 int
 chxj_delete_cookie_expire_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
 {
-  DBG(r, "start chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
-  if (!chxj_mysql_delete_cookie_expire(r, m, cookie_id)) {
-    ERR(r, "failed: chxj_mysql_delete_cookie() cookie_id:[%s]", cookie_id);
-    DBG(r, "end   chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
+  if (! chxj_open_mysql_handle(r, m)) {
+    ERR(r,"REQ[%X] %s:%d Cannot open mysql connection", TO_ADDR(r), APLOG_MARK);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
     return CHXJ_FALSE;
   }
-  DBG(r, "end   chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
+
+  if (!chxj_mysql_exist_cookie_table_expire(r, m)) {
+    DBG(r,"REQ[%X] not found cookie table:[%s_expire]", TO_ADDR(r), m->mysql.tablename);
+    if (!chxj_mysql_create_cookie_expire_table(r, m)) {
+      ERR(r,"REQ[%X] %s:%d cannot create cookie table:[%s_expire] cookie_id:[%s]", TO_ADDR(r), APLOG_MARK, m->mysql.tablename, cookie_id);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+      return CHXJ_FALSE;
+    }
+  } else {
+    if (!chxj_mysql_delete_cookie_expire(r, m, cookie_id)) {
+      ERR(r,"REQ[%X] %s:%d failed: chxj_mysql_delete_cookie() cookie_id:[%s]", TO_ADDR(r), APLOG_MARK, cookie_id);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+      return CHXJ_FALSE;
+    }
+  }
+  DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r), cookie_id);
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return CHXJ_TRUE;
 }
 
@@ -1072,13 +1326,82 @@ chxj_delete_cookie_expire_mysql(request_rec *r, mod_chxj_config *m, const char *
 int
 chxj_cookie_expire_gc_mysql(request_rec *r, mod_chxj_config *m)
 {
-  DBG(r, "start chxj_cookie_expire_gc_mysql()");
-  if (!chxj_mysql_delete_expired_cookie(r, m)) {
-    ERR(r, "failed: chxj_mysql_delete_expired_cookie()");
-    DBG(r, "end   chxj_cookie_expire_gc_mysql()");
+  DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
+  if (! chxj_open_mysql_handle(r, m)) {
+    ERR(r,"REQ[%X] Cannot open mysql connection", TO_ADDR(r));
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+    return CHXJ_FALSE;
+  }
+  if (!chxj_mysql_exist_cookie_table_expire(r, m)) {
+    DBG(r,"REQ[%X] not found cookie table:[%s_expire]", TO_ADDR(r), m->mysql.tablename);
+    if (!chxj_mysql_create_cookie_expire_table(r, m)) {
+      ERR(r,"REQ[%X] %s:%d cannot create cookie table:[%s_expire]", TO_ADDR(r), APLOG_MARK, m->mysql.tablename);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+      return CHXJ_FALSE;
+    }
+  } else {
+    if (!chxj_mysql_delete_expired_cookie(r, m)) {
+      ERR(r,"REQ[%X] %s:%d failed: chxj_mysql_delete_expired_cookie()", TO_ADDR(r), APLOG_MARK);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+      return CHXJ_FALSE;
+    }
+  }
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+  return CHXJ_TRUE;
+}
+
+
+int
+chxj_cookie_lock_mysql(request_rec *r, mod_chxj_config *m)
+{
+  MYSQL_RES *result;
+  char query[MAX_STRING_LEN];
+
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+  if (! chxj_open_mysql_handle(r, m)) {
+    ERR(r,"REQ[%X] Cannot open mysql connection", TO_ADDR(r));
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+    return CHXJ_FALSE;
+  }
+  if (!chxj_mysql_exist_cookie_table_expire(r, m)) {
+    DBG(r,"REQ[%X] not found cookie table:[%s_expire]", TO_ADDR(r), m->mysql.tablename);
+    if (!chxj_mysql_create_cookie_expire_table(r, m)) {
+      ERR(r,"REQ[%X] cannot create cookie table:[%s_expire]", TO_ADDR(r), m->mysql.tablename);
+      DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+      return CHXJ_FALSE;
+    }
+  }
+  apr_snprintf(query, sizeof(query)-1, "LOCK TABLES %s WRITE", m->mysql.tablename);
+  DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r), query);
+  if (mysql_query(connection.handle, query) != 0) {
+    chxj_mysql_rollback(r, m);
+    ERR(r,"REQ[%X] MySQL WARN: %s: %s", TO_ADDR(r), mysql_error(connection.handle), r->uri);
+    DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+    return CHXJ_FALSE;
+  }
+
+  result = mysql_store_result(connection.handle);
+  if (result) mysql_free_result(result);
+  
+  DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+  return CHXJ_TRUE;
+}
+
+
+int
+chxj_cookie_unlock_mysql(request_rec *r, mod_chxj_config *UNUSED(m))
+{
+  char query[MAX_STRING_LEN];
+  if (r) DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+  apr_snprintf(query, sizeof(query)-1, "UNLOCK TABLES");
+  if (mysql_query(connection.handle, query) != 0) {
+     if (r) {
+       ERR(r,"REQ[%X] MySQL WARN: %s: %s", TO_ADDR(r), mysql_error(connection.handle), r->uri);
+       DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
+     }
     return CHXJ_FALSE;
   }
-  DBG(r, "end   chxj_cookie_expire_gc_mysql()");
+  if (r) DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
   return CHXJ_TRUE;
 }
 #endif