Skip to content

Commit 5a1dbc1

Browse files
axl8713github-actions[bot]
authored andcommitted
Refactored tile range deletion to be streamed.
1 parent e848489 commit 5a1dbc1

File tree

1 file changed

+20
-24
lines changed

1 file changed

+20
-24
lines changed

geowebcache/azureblob/src/main/java/org/geowebcache/azure/AzureBlobStore.java

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.io.InputStream;
2828
import java.io.UncheckedIOException;
2929
import java.time.OffsetDateTime;
30-
import java.util.ArrayList;
3130
import java.util.Iterator;
3231
import java.util.List;
3332
import java.util.Map;
@@ -38,6 +37,7 @@
3837
import java.util.regex.Matcher;
3938
import java.util.regex.Pattern;
4039
import java.util.stream.Collectors;
40+
import java.util.stream.IntStream;
4141
import java.util.stream.Stream;
4242
import javax.annotation.Nullable;
4343
import org.geotools.util.logging.Logging;
@@ -193,15 +193,14 @@ public boolean delete(TileRange tileRange) throws StorageException {
193193
return false;
194194
}
195195

196-
List<BlobItem> blobsToDelete = findTileBlobsToDelete(tileRange, coordsPrefix);
196+
Stream<BlobItem> blobsToDelete = findTileBlobsToDelete(tileRange, coordsPrefix);
197197

198198
if (listeners.isEmpty()) {
199199
// if there are no listeners, don't bother requesting every tile
200200
// metadata to notify the listeners
201-
// split the iteration in parts to avoid memory accumulation
202-
List<String> keysToDelete =
203-
blobsToDelete.stream().map(BlobItem::getName).collect(Collectors.toList());
201+
List<String> keysToDelete = blobsToDelete.map(BlobItem::getName).collect(Collectors.toList());
204202

203+
// split the iteration in parts to avoid memory accumulation
205204
Iterator<List<String>> partition = Iterators.partition(keysToDelete.iterator(), DeleteManager.PAGE_SIZE);
206205

207206
while (partition.hasNext() && !shutDown) {
@@ -212,7 +211,7 @@ public boolean delete(TileRange tileRange) throws StorageException {
212211
// if we need to gather info, we'll end up just calling "delete" on each tile
213212
// this is run here instead of inside the delete manager as we need high level info
214213
// about tiles, e.g., TileObject, to inform the listeners
215-
List<Callable<?>> tilesDeletions = blobsToDelete.stream()
214+
List<Callable<?>> tilesDeletions = blobsToDelete
216215
.map(blobItem -> {
217216
TileObject tile = createTileObject(blobItem, tileRange);
218217
tile.setParametersId(tileRange.getParametersId());
@@ -226,27 +225,24 @@ public boolean delete(TileRange tileRange) throws StorageException {
226225
return true;
227226
}
228227

229-
private List<BlobItem> findTileBlobsToDelete(TileRange tileRange, String coordsPrefix) {
230-
231-
List<BlobItem> blobsToDelete = new ArrayList<>();
232-
233-
for (int zoom = tileRange.getZoomStart(); zoom <= tileRange.getZoomStop(); zoom++) {
234-
235-
String zoomPrefix = coordsPrefix + "/" + zoom;
228+
private Stream<BlobItem> findTileBlobsToDelete(TileRange tileRange, String coordsPrefix) {
229+
return IntStream.rangeClosed(tileRange.getZoomStart(), tileRange.getZoomStop())
230+
.boxed()
231+
.flatMap(zoom -> {
232+
String zoomPrefix = coordsPrefix + "/" + zoom;
236233

237-
if (!client.prefixExists(zoomPrefix)) {
238-
// empty level, skipping
239-
continue;
240-
}
241-
242-
long[] rangeBoundsAtZoom = tileRange.rangeBounds(zoom);
234+
if (!client.prefixExists(zoomPrefix)) {
235+
// empty level, skipping
236+
return Stream.empty();
237+
}
243238

244-
client.listBlobs(zoomPrefix)
245-
.filter(tb -> isTileBlobInBounds(tb, rangeBoundsAtZoom))
246-
.forEach(blobsToDelete::add);
247-
}
239+
long[] rangeBoundsAtZoom = tileRange.rangeBounds(zoom);
248240

249-
return blobsToDelete;
241+
return client.listBlobs(zoomPrefix)
242+
.filter(tb ->
243+
TILE_BLOB_NAME_REGEXP.matcher(tb.getName()).find())
244+
.filter(tb -> isTileBlobInBounds(tb, rangeBoundsAtZoom));
245+
});
250246
}
251247

252248
private boolean isTileBlobInBounds(BlobItem tileBlob, long[] bounds) {

0 commit comments

Comments
 (0)