Skip to content

Commit 80af196

Browse files
authored
Close mmap for ElevationProvider if not removed (graphhopper#1809)
* elevation: if temp files should be kept, still release memory mapped files * minor fix to remove them if specified
1 parent 7bd3e76 commit 80af196

File tree

4 files changed

+36
-42
lines changed

4 files changed

+36
-42
lines changed

core/src/main/java/com/graphhopper/reader/dem/AbstractSRTMElevationProvider.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,13 @@ int calcIntKey(double lat, double lon) {
6060
@Override
6161
public void release() {
6262
cacheData.clear();
63-
64-
// for memory mapped type we create temporary unpacked files which should be removed
65-
if (autoRemoveTemporary && dir != null)
66-
dir.clear();
67-
}
68-
69-
/**
70-
* Creating temporary files can take a long time to fill our DataAccess object, so this option
71-
* can be used to disable the default clear mechanism via specifying 'false'.
72-
*/
73-
public void setAutoRemoveTemporaryFiles(boolean autoRemoveTemporary) {
74-
this.autoRemoveTemporary = autoRemoveTemporary;
63+
if (dir != null) {
64+
// for memory mapped type we remove temporary files
65+
if (autoRemoveTemporary)
66+
dir.clear();
67+
else
68+
dir.close();
69+
}
7570
}
7671

7772
int down(double val) {

core/src/main/java/com/graphhopper/reader/dem/AbstractTiffElevationProvider.java

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,13 @@ public AbstractTiffElevationProvider(String baseUrl, String cacheDir, String dow
5757
@Override
5858
public void release() {
5959
cacheData.clear();
60-
61-
// for memory mapped type we create temporary unpacked files which should be removed
62-
if (autoRemoveTemporary && dir != null)
63-
dir.clear();
60+
if (dir != null) {
61+
// for memory mapped type we remove temporary files
62+
if (autoRemoveTemporary)
63+
dir.clear();
64+
else
65+
dir.close();
66+
}
6467
}
6568

6669
/**
@@ -186,14 +189,4 @@ private void fillDataAccessWithElevationData(Raster raster, DataAccess heights,
186189
throw new RuntimeException("Problem at x:" + x + ", y:" + y, ex);
187190
}
188191
}
189-
190-
/**
191-
* Creating temporary files can take a long time as we need to unpack tiff as well as to fill
192-
* our DataAccess object, so this option can be used to disable the default clear mechanism via
193-
* specifying 'false'.
194-
*/
195-
public void setAutoRemoveTemporaryFiles(boolean autoRemoveTemporary) {
196-
this.autoRemoveTemporary = autoRemoveTemporary;
197-
}
198-
199192
}

core/src/main/java/com/graphhopper/storage/Directory.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ public interface Directory {
4747

4848
DataAccess find(String name, DAType type);
4949

50-
/**
51-
* Renames the specified DataAccess object into one.
52-
*/
53-
// DataAccess rename( DataAccess da, String newName );
54-
5550
/**
5651
* Removes the specified object from the directory.
5752
*/
@@ -67,6 +62,11 @@ public interface Directory {
6762
*/
6863
void clear();
6964

65+
/**
66+
* Releases all allocated resources from the directory without removing backing files.
67+
*/
68+
void close();
69+
7070
/**
7171
* Returns all created directories.
7272
*/

core/src/main/java/com/graphhopper/storage/GHDirectory.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,30 +106,36 @@ public DataAccess find(String name, DAType type) {
106106
return da;
107107
}
108108

109+
@Override
110+
public void close() {
111+
for (DataAccess da : map.values()) {
112+
da.close();
113+
}
114+
map.clear();
115+
}
116+
109117
@Override
110118
public void clear() {
111119
for (DataAccess da : map.values()) {
112-
removeDA(da, da.getName());
120+
da.close();
121+
removeBackingFile(da, da.getName());
113122
}
114123
map.clear();
115124
}
116125

117126
@Override
118127
public void remove(DataAccess da) {
119-
removeFromMap(da.getName());
120-
removeDA(da, da.getName());
121-
}
128+
DataAccess old = map.remove(da.getName());
129+
if (old == null)
130+
throw new IllegalStateException("Couldn't remove DataAccess: " + da.getName());
122131

123-
void removeDA(DataAccess da, String name) {
124132
da.close();
125-
if (da.getType().isStoring())
126-
removeDir(new File(location + name));
133+
removeBackingFile(da, da.getName());
127134
}
128135

129-
void removeFromMap(String name) {
130-
DataAccess da = map.remove(name);
131-
if (da == null)
132-
throw new IllegalStateException("Couldn't remove dataAccess object:" + name);
136+
private void removeBackingFile(DataAccess da, String name) {
137+
if (da.getType().isStoring())
138+
removeDir(new File(location + name));
133139
}
134140

135141
@Override

0 commit comments

Comments
 (0)