Skip to content

Commit 880b047

Browse files
committed
Merge branch 'feature/DSC-30265-file-pool' into develop
2 parents 26475e6 + d27f7c6 commit 880b047

File tree

7 files changed

+110
-18
lines changed

7 files changed

+110
-18
lines changed

src/eccodes_prototypes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,8 @@ void grib_file_pool_clean(void);
429429
grib_file* grib_file_pool_get_files(void);
430430
grib_file* grib_file_open(const char* filename, const char* mode, int* err);
431431
void grib_file_pool_delete_file(grib_file* file);
432+
grib_file* grib_file_pool_create_clone(grib_context* c, short clone_id, grib_file* file);
433+
void grib_file_pool_delete_clone(grib_file* clone);
432434
void grib_file_close(const char* filename, int force, int* err);
433435
void grib_file_close_all(int* err);
434436
grib_file* grib_get_file(const char* filename, int* err);

src/grib_api_internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,8 @@ struct grib_file
861861
char* buffer;
862862
long refcount;
863863
grib_file* next;
864+
grib_file* pool_file;
865+
long pool_file_refcount;
864866
short id;
865867
};
866868

src/grib_filepool.cc

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,51 @@ grib_file* grib_file_open(const char* filename, const char* mode, int* err)
256256
return file;
257257
}
258258

259+
grib_file* grib_file_pool_create_clone(grib_context* c, short clone_id, grib_file* pool_file)
260+
{
261+
if(pool_file)
262+
{
263+
grib_file* newfile = (grib_file*)grib_context_malloc_clear(c, sizeof(grib_file));
264+
newfile->id = clone_id;
265+
newfile->name = strdup(pool_file->name);
266+
newfile->handle = pool_file->handle;
267+
newfile->pool_file = pool_file;
268+
newfile->pool_file_refcount = 0;
269+
270+
GRIB_MUTEX_INIT_ONCE(&once, &init_mutex);
271+
GRIB_MUTEX_LOCK(&mutex1);
272+
273+
++pool_file->pool_file_refcount;
274+
275+
GRIB_MUTEX_UNLOCK(&mutex1);
276+
277+
return newfile;
278+
}
279+
else
280+
return 0;
281+
}
282+
283+
void grib_file_pool_delete_clone(grib_file* cloned_file)
284+
{
285+
grib_file* pool_file = cloned_file->pool_file;
286+
if(pool_file)
287+
{
288+
GRIB_MUTEX_INIT_ONCE(&once, &init_mutex);
289+
GRIB_MUTEX_LOCK(&mutex1);
290+
if(pool_file->pool_file_refcount > 0)
291+
{
292+
--pool_file->pool_file_refcount;
293+
294+
if (pool_file->pool_file_refcount == 0)
295+
grib_file_pool_delete_file(pool_file);
296+
}
297+
298+
GRIB_MUTEX_UNLOCK(&mutex1);
299+
}
300+
301+
grib_file_delete(cloned_file);
302+
}
303+
259304
void grib_file_pool_delete_file(grib_file* file)
260305
{
261306
grib_file* prev = NULL;
@@ -265,6 +310,7 @@ void grib_file_pool_delete_file(grib_file* file)
265310
if (file == file_pool.first) {
266311
file_pool.first = file->next;
267312
file_pool.current = file->next;
313+
file_pool.size--;
268314
}
269315
else {
270316
prev = file_pool.first;
@@ -277,10 +323,13 @@ void grib_file_pool_delete_file(grib_file* file)
277323
DEBUG_ASSERT(prev);
278324
if (prev) {
279325
prev->next = file->next;
326+
file_pool.size--;
280327
}
281328
}
282329

283330
if (file->handle) {
331+
fclose(file->handle);
332+
file->handle = NULL;
284333
file_pool.number_of_opened_files--;
285334
}
286335
grib_file_delete(file);
@@ -401,12 +450,14 @@ static grib_file* grib_file_new(grib_context* c, const char* name, int* err)
401450
next_id++;
402451
GRIB_MUTEX_UNLOCK(&mutex1);
403452

404-
file->mode = 0;
405-
file->handle = 0;
406-
file->refcount = 0;
407-
file->context = c;
408-
file->next = 0;
409-
file->buffer = 0;
453+
file->mode = 0;
454+
file->handle = 0;
455+
file->refcount = 0;
456+
file->context = c;
457+
file->next = 0;
458+
file->pool_file = 0;
459+
file->pool_file_refcount = 0;
460+
file->buffer = 0;
410461
return file;
411462
}
412463

src/grib_index.cc

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ void grib_index_delete(grib_index* index)
767767
while (file) {
768768
grib_file* f = file;
769769
file = file->next;
770-
grib_file_delete(f);
770+
grib_file_pool_delete_clone(f);
771771
}
772772
grib_context_free(index->context, index);
773773
}
@@ -1076,7 +1076,6 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename
10761076
char buf[1024] = {0,};
10771077
int err = 0;
10781078
grib_file* indfile;
1079-
grib_file* newfile;
10801079

10811080
grib_index_key* index_key = NULL;
10821081
grib_handle* h = NULL;
@@ -1097,11 +1096,7 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename
10971096

10981097
if (!index->files) {
10991098
grib_filesid++;
1100-
newfile = (grib_file*)grib_context_malloc_clear(c, sizeof(grib_file));
1101-
newfile->id = grib_filesid;
1102-
newfile->name = strdup(file->name);
1103-
newfile->handle = file->handle;
1104-
index->files = newfile;
1099+
index->files = grib_file_pool_create_clone(c, grib_filesid, file);
11051100
}
11061101
else {
11071102
indfile = index->files;
@@ -1114,11 +1109,7 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename
11141109
while (indfile->next)
11151110
indfile = indfile->next;
11161111
grib_filesid++;
1117-
newfile = (grib_file*)grib_context_malloc_clear(c, sizeof(grib_file));
1118-
newfile->id = grib_filesid;
1119-
newfile->name = strdup(file->name);
1120-
newfile->handle = file->handle;
1121-
indfile->next = newfile;
1112+
indfile->next = grib_file_pool_create_clone(c, grib_filesid, file);
11221113
}
11231114

11241115
fseeko(file->handle, 0, SEEK_SET);

tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ if( HAVE_BUILD_TOOLS )
286286
grib_ecc-1941
287287
grib_ecc-1942
288288
grib_ecc-2002
289+
grib_ecc-2006
289290
grib_modelName
290291
grib_sub_hourly
291292
grib_set_bytes

tests/grib_ecc-2006.sh

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#!/bin/sh
2+
# (C) Copyright 2005- ECMWF.
3+
#
4+
# This software is licensed under the terms of the Apache Licence Version 2.0
5+
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6+
#
7+
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
8+
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
9+
#
10+
11+
. ./include.ctest.sh
12+
13+
# -------------------------------------------------------------------
14+
# This is the test for the JIRA issue ECC-2006.
15+
# Indexing: Performance degradation after reading thousands of files
16+
# -------------------------------------------------------------------
17+
18+
label="grib_ecc-2006_test"
19+
20+
tempIndex=temp.$label.idx
21+
tempLog=temp.$label.log
22+
tempOut=temp.$label.txt
23+
24+
export ECCODES_DEBUG=-1
25+
26+
gfiles="
27+
$data_dir/tigge_af_ecmwf.grib2
28+
$data_dir/tigge_cf_ecmwf.grib2
29+
$data_dir/tigge_ecmwf.grib2
30+
$data_dir/tigge_pf_ecmwf.grib2"
31+
32+
${tools_dir}/grib_index_build -o $tempIndex $gfiles >$tempLog 2>&1
33+
34+
# There should be no files in the pool after we call grib_index_delete
35+
grep "file_pool before grib_index_delete: size=4, num_opened_files=4" $tempLog
36+
grep "file_pool after grib_index_delete: size=0, num_opened_files=0" $tempLog
37+
38+
# Clean up
39+
rm -f $tempIndex $tempLog $tempOut

tools/grib_index_build.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,13 @@ int grib_tool_finalise_action(grib_runtime_options* options)
147147

148148
if (idx->count)
149149
grib_index_write(idx, options->outfile->name);
150+
151+
// See ECC-2006
152+
grib_context* c = grib_context_get_default();
153+
if (c->debug) grib_file_pool_print("ECCODES DEBUG file_pool before grib_index_delete", stderr);
150154
grib_index_delete(idx);
155+
if (c->debug) grib_file_pool_print("ECCODES DEBUG file_pool after grib_index_delete", stderr);
156+
151157
return 0;
152158
}
153159

0 commit comments

Comments
 (0)