[mapserver-commits] r12517 - trunk/mapserver/mapcache/src

svn at osgeo.org svn at osgeo.org
Tue Sep 6 08:05:07 EDT 2011


Author: tbonfort
Date: 2011-09-06 05:05:07 -0700 (Tue, 06 Sep 2011)
New Revision: 12517

Modified:
   trunk/mapserver/mapcache/src/cache_sqlite.c
   trunk/mapserver/mapcache/src/http.c
   trunk/mapserver/mapcache/src/mapcache_seed.c
Log:
avoid thread safety issues with curl requests
retry sqlite statements when busy, and augment the default busy timeout


Modified: trunk/mapserver/mapcache/src/cache_sqlite.c
===================================================================
--- trunk/mapserver/mapcache/src/cache_sqlite.c	2011-09-05 14:21:34 UTC (rev 12516)
+++ trunk/mapserver/mapcache/src/cache_sqlite.c	2011-09-06 12:05:07 UTC (rev 12517)
@@ -74,7 +74,7 @@
       ctx->set_error(ctx,500,"failed to connect to sqlite db %s: %s",dbfile,sqlite3_errmsg(handle));
       return NULL;
    }
-   sqlite3_busy_timeout(handle,3000);
+   sqlite3_busy_timeout(handle,300000);
    return handle;
 }
 
@@ -180,13 +180,16 @@
    sqlite3_stmt *stmt;
    sqlite3_prepare(handle,cache->get_stmt.sql,-1,&stmt,NULL);
    _bind_sqlite_params(ctx,stmt,tile);
-   int ret = sqlite3_step(stmt);
-   if(ret!=SQLITE_DONE && ret != SQLITE_ROW) {
-      ctx->set_error(ctx,500,"sqlite backend failed on get: %s",sqlite3_errmsg(handle));
-      sqlite3_finalize(stmt);
-      sqlite3_close(handle);
-      return MAPCACHE_FAILURE;
-   }
+   int ret;
+   do {
+      ret = sqlite3_step(stmt);
+      if(ret!=SQLITE_DONE && ret != SQLITE_ROW && ret!=SQLITE_BUSY && ret !=SQLITE_LOCKED) {
+         ctx->set_error(ctx,500,"sqlite backend failed on get: %s",sqlite3_errmsg(handle));
+         sqlite3_finalize(stmt);
+         sqlite3_close(handle);
+         return MAPCACHE_FAILURE;
+      }
+   } while (ret == SQLITE_BUSY || ret == SQLITE_LOCKED);
    if(ret == SQLITE_DONE) {
       sqlite3_finalize(stmt);
       sqlite3_close(handle);
@@ -224,10 +227,17 @@
    sqlite3_stmt *stmt;
    sqlite3_prepare(handle,cache->set_stmt.sql,-1,&stmt,NULL);
    _bind_sqlite_params(ctx,stmt,tile);
-   int ret = sqlite3_step(stmt);
-   if(ret != SQLITE_DONE && ret != SQLITE_ROW) {
-      ctx->set_error(ctx,500,"sqlite backend failed on set: %s",sqlite3_errmsg(handle));
-   }
+   int ret;
+   do {
+      ret = sqlite3_step(stmt);
+      if(ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_BUSY && ret != SQLITE_LOCKED) {
+         ctx->set_error(ctx,500,"sqlite backend failed on set: %s (%d)",sqlite3_errmsg(handle),ret);
+         break;
+      }
+      if(ret == SQLITE_BUSY) {
+         sqlite3_reset(stmt);
+      }
+   } while (ret == SQLITE_BUSY || ret == SQLITE_LOCKED);
    sqlite3_finalize(stmt);
    sqlite3_close(handle);
 }
@@ -278,6 +288,8 @@
 
 static void _mapcache_cache_sqlite_configuration_parse_xml(mapcache_context *ctx, ezxml_t node, mapcache_cache *cache) {
    ezxml_t cur_node;
+   sqlite3_initialize();
+   sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
    mapcache_cache_sqlite *dcache = (mapcache_cache_sqlite*)cache;
    if ((cur_node = ezxml_child(node,"base")) != NULL) {
       dcache->dbname_template = apr_pstrcat(ctx->pool,cur_node->txt,"/{tileset}#{grid}.db",NULL);

Modified: trunk/mapserver/mapcache/src/http.c
===================================================================
--- trunk/mapserver/mapcache/src/http.c	2011-09-05 14:21:34 UTC (rev 12516)
+++ trunk/mapserver/mapcache/src/http.c	2011-09-06 12:05:07 UTC (rev 12517)
@@ -275,6 +275,7 @@
 
 mapcache_http* mapcache_http_configuration_parse_xml(mapcache_context *ctx, ezxml_t node) {
    ezxml_t http_node;
+   curl_global_init(CURL_GLOBAL_ALL);
    mapcache_http *req = (mapcache_http*)apr_pcalloc(ctx->pool,
          sizeof(mapcache_http));
    if ((http_node = ezxml_child(node,"url")) != NULL) {

Modified: trunk/mapserver/mapcache/src/mapcache_seed.c
===================================================================
--- trunk/mapserver/mapcache/src/mapcache_seed.c	2011-09-05 14:21:34 UTC (rev 12516)
+++ trunk/mapserver/mapcache/src/mapcache_seed.c	2011-09-06 12:05:07 UTC (rev 12517)
@@ -319,7 +319,7 @@
       apr_queue_push(work_queue,cmd);
    }
 
-   if(error_detected) {
+   if(error_detected && ctx.get_error_message(&ctx)) {
       printf("%s\n",ctx.get_error_message(&ctx));
    }
 }
@@ -331,10 +331,11 @@
    mapcache_tile *tile = mapcache_tileset_tile_create(ctx.pool, tileset, grid_link);
    tile->dimensions = dimensions;
    while(1) {
+      apr_status_t ret;
       apr_pool_clear(seed_ctx.pool);
       struct seed_cmd *cmd;
-      apr_queue_pop(work_queue, (void**)&cmd);
-      if(cmd->command == MAPCACHE_CMD_STOP) break;
+      ret = apr_queue_pop(work_queue, (void**)&cmd);
+      if(ret != APR_SUCCESS || cmd->command == MAPCACHE_CMD_STOP) break;
       tile->x = cmd->x;
       tile->y = cmd->y;
       tile->z = cmd->z;



More information about the mapserver-commits mailing list