[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