Skip to content

Commit 2ac1a61

Browse files
authored
LMDB: minimize transaction duration (#323)
* LMDB: minimize transaction duration Readers do not block anything but tie-up resources; Writers block other writers and thus it's good idea to keep them short. * LMDB: do not pass data variable when deleting tiles As MapCache LMDB uses single entry per key, there is no need to pass data to mdb_del call.
1 parent 885f784 commit 2ac1a61

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

lib/cache_lmdb.c

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -69,23 +69,24 @@ static int _mapcache_cache_lmdb_has_tile(mapcache_context *ctx, mapcache_cache *
6969
MDB_val key, data;
7070
MDB_txn *txn;
7171
mapcache_cache_lmdb *cache = (mapcache_cache_lmdb*)pcache;
72-
char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
72+
char *skey;
7373

7474
if (lmdb_env->is_open == 0) {
7575
ctx->set_error(ctx,500,"lmdb is not open %s",cache->basedir);
7676
return MAPCACHE_FALSE;
7777
}
78+
79+
skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
80+
key.mv_size = strlen(skey)+1;
81+
key.mv_data = skey;
82+
7883
rc = mdb_txn_begin(lmdb_env->env, NULL, MDB_RDONLY, &txn);
7984
if (rc) {
8085
ctx->set_error(ctx,500,"lmdb failed to begin transaction for has_tile in %s:%s",cache->basedir,mdb_strerror(rc));
8186
return MAPCACHE_FALSE;
8287
}
8388

84-
key.mv_size = strlen(skey)+1;
85-
key.mv_data = skey;
86-
8789
rc = mdb_get(txn, lmdb_env->dbi, &key, &data);
88-
8990
if(rc == 0) {
9091
ret = MAPCACHE_TRUE;
9192
} else if(rc == MDB_NOTFOUND) {
@@ -107,24 +108,27 @@ static int _mapcache_cache_lmdb_has_tile(mapcache_context *ctx, mapcache_cache *
107108
static void _mapcache_cache_lmdb_delete(mapcache_context *ctx, mapcache_cache *pcache, mapcache_tile *tile)
108109
{
109110
int rc;
110-
MDB_val key, data;
111+
MDB_val key;
111112
MDB_txn *txn;
112113
mapcache_cache_lmdb *cache = (mapcache_cache_lmdb*)pcache;
113-
char *skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
114+
char *skey;
114115

115116
if (lmdb_env->is_open == 0) {
116117
ctx->set_error(ctx,500,"lmdb is not open %s",cache->basedir);
117118
return;
118119
}
120+
121+
skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
122+
key.mv_size = strlen(skey)+1;
123+
key.mv_data = skey;
124+
119125
rc = mdb_txn_begin(lmdb_env->env, NULL, 0, &txn);
120126
if (rc) {
121127
ctx->set_error(ctx,500,"lmdb failed to begin transaction for delete in %s:%s",cache->basedir,mdb_strerror(rc));
122128
return;
123129
}
124130

125-
key.mv_size = strlen(skey)+1;
126-
key.mv_data = skey;
127-
rc = mdb_del(txn, lmdb_env->dbi, &key, &data);
131+
rc = mdb_del(txn, lmdb_env->dbi, &key, NULL);
128132
if (rc) {
129133
if (rc == MDB_NOTFOUND) {
130134
ctx->log(ctx,MAPCACHE_DEBUG,"attempt to delete tile %s absent in the db %s",skey,cache->basedir);
@@ -152,18 +156,18 @@ static int _mapcache_cache_lmdb_get(mapcache_context *ctx, mapcache_cache *pcach
152156
ctx->set_error(ctx,500,"lmdb is not open %s",cache->basedir);
153157
return MAPCACHE_FALSE;
154158
}
159+
160+
skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
161+
key.mv_size = strlen(skey)+1;
162+
key.mv_data = skey;
163+
155164
rc = mdb_txn_begin(lmdb_env->env, NULL, MDB_RDONLY, &txn);
156165
if (rc) {
157166
ctx->set_error(ctx,500,"lmdb failed to begin transaction for get in %s:%s",cache->basedir,mdb_strerror(rc));
158167
return MAPCACHE_FALSE;
159168
}
160169

161-
skey = mapcache_util_get_tile_key(ctx,tile,cache->key_template,NULL,NULL);
162-
key.mv_size = strlen(skey)+1;
163-
key.mv_data = skey;
164-
165170
rc = mdb_get(txn, lmdb_env->dbi, &key, &data);
166-
167171
if(rc == 0) {
168172
if(((char*)(data.mv_data))[0] == '#') {
169173
tile->encoded_data = mapcache_empty_png_decode(ctx,tile->grid_link->grid->tile_sx, tile->grid_link->grid->tile_sy, (unsigned char*)data.mv_data,&tile->nodata);
@@ -232,6 +236,7 @@ static void _mapcache_cache_lmdb_set(mapcache_context *ctx, mapcache_cache *pcac
232236
ctx->set_error(ctx,500,"lmdb is not open %s",cache->basedir);
233237
return;
234238
}
239+
235240
rc = mdb_txn_begin(lmdb_env->env, NULL, 0, &txn);
236241
if (rc) {
237242
ctx->set_error(ctx,500,"lmdb failed to begin transaction for set in %s:%s",cache->basedir,mdb_strerror(rc));
@@ -264,6 +269,7 @@ static void _mapcache_cache_lmdb_multiset(mapcache_context *ctx, mapcache_cache
264269
ctx->set_error(ctx,500,"lmdb is not open %s",cache->basedir);
265270
return;
266271
}
272+
267273
rc = mdb_txn_begin(lmdb_env->env, NULL, 0, &txn);
268274
if (rc) {
269275
ctx->set_error(ctx,500,"lmdb failed to begin transaction for multiset in %s:%s",cache->basedir,mdb_strerror(rc));

0 commit comments

Comments
 (0)