IndexedStorageChunkStorageProvider class

Пакет: com.hypixel.hytale.server.core.universe.world.storage.provider

Файл: com/hypixel/hytale/server/core/universe/world/storage/provider/IndexedStorageChunkStorageProvider.java

implements: IChunkStorageProvider<IndexedStorageChunkStorageProvider.IndexedStorageCache>

Поля (68)

МодификаторыТипИмя
private static final Codec<IndexedStorageChunkStorageProvider.IndexedStorageCache.CacheEntryMetricData> CODEC
final String ID
public static final MetricsRegistry<IndexedStorageChunkStorageProvider.IndexedStorageCache> METRICS_REGISTRY
private final Long2ObjectConcurrentHashMap<IndexedStorageFile> cache
private final IndexedStorageChunkStorageProvider.IndexedStorageCache cache
private final IndexedStorageChunkStorageProvider.IndexedStorageCache cache
private final boolean flushOnWrite
private final boolean flushOnWrite
private long key
private final boolean ownsCache
private Path path
return
private IndexedStorageFile value
String[] var1
IOException var1
var1
LongArrayList var1
IOException var1
var1
int var10
LongIterator var10
int var11
long var11
int var12
IndexedStorageFile var12
int var13
int var13
int var14
World var2
int var2
Iterator var2
LongSet var2
IndexedStorageChunkStorageProvider.IndexedStorageCache var3
Path var3
IndexedStorageChunkStorageProvider.IndexedStorageCache var3
int var3
long var3
var3
int var3
int var3
int var4
IndexedStorageFile var4
int var4
int var4
IndexedStorageFile var4
int var5
int var5
int var5
IndexedStorageFile var5
int var5
Path var6
Path var6
int var6
int var6
int var6
int var6
IndexedStorageFile var7
IndexedStorageFile var7
IndexedStorageFile var7
int var7
int var7
int var7
int var7
IntList var8
int var8
int var8
IntListIterator var9
int var9

Методы (41)

МодификаторыВозвратСигнатура
public CacheEntryMetricDatapublic CacheEntryMetricData()
public CacheEntryMetricDatapublic CacheEntryMetricData(@Nonnull Entry<IndexedStorageFile> var1)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unexpected file name format!")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unexpected file extension!")
public IndexedStorageCachepublic IndexedStorageCache()
public IndexedStorageChunkLoaderpublic IndexedStorageChunkLoader(@Nonnull Store<ChunkStore> var1, @Nonnull IndexedStorageChunkStorageProvider.IndexedStorageCache var2, boolean var3, boolean var4)
protected IndexedStorageChunkSaverprotected IndexedStorageChunkSaver(@Nonnull Store<ChunkStore> var1, @Nonnull IndexedStorageChunkStorageProvider.IndexedStorageCache var2, boolean var3)
public Resource<ChunkStore> clonepublic Resource<ChunkStore> clone()
public void closevoid close(@NonNullDecl IndexedStorageChunkStorageProvider.IndexedStorageCache var1, @NonNullDecl Store<ChunkStore> var2)
public void closepublic void close()
public void closepublic void close()
public void closepublic void close()
public CompletableFuture<Void> compactpublic CompletableFuture<Void> compact(@Nullable long[] var1)
public void deletevoid delete(@Nonnull IndexedStorageChunkStorageProvider.IndexedStorageCache var1, @Nonnull Store<ChunkStore> var2)
public void flushpublic void flush()
public void flushpublic void flush()
for for(long var6 : var1)
static long fromFileNamelong fromFileName(@Nonnull String var0)
public Long2ObjectConcurrentHashMap<IndexedStorageFile> getCachepublic Long2ObjectConcurrentHashMap<IndexedStorageFile> getCache()
public LongList getIndexespublic LongList getIndexes()
public LongList getIndexespublic LongList getIndexes()
public LongList getIndexespublic LongList getIndexes()
public IndexedStorageFile getOrCreatepublic IndexedStorageFile getOrCreate(int var1, int var2, boolean var3)
public IndexedStorageFile getOrTryOpenpublic IndexedStorageFile getOrTryOpen(int var1, int var2, boolean var3)
if if(var1.length != 4)
if if(var1 == null)
if if(var1 != null)
if if(var7 != null)
if if(var1 == null)
if if(var1 != null)
if if(this.ownsCache)
if if(var4 != null)
if if(var1 != null)
public IndexedStorageChunkStorageProvider.IndexedStorageCache initializeIndexedStorageChunkStorageProvider.IndexedStorageCache initialize(@NonNullDecl Store<ChunkStore> var1)
public CompletableFuture<ByteBuffer> loadBufferpublic CompletableFuture<ByteBuffer> loadBuffer(int var1, int var2)
public CompletableFuture<Void> removeBufferpublic CompletableFuture<Void> removeBuffer(int var1, int var2)
public CompletableFuture<Void> saveBufferpublic CompletableFuture<Void> saveBuffer(int var1, int var2, @Nonnull ByteBuffer var3)
abstract super super(var1)
public MetricResults toMetricResultspublic MetricResults toMetricResults()
public MetricResults toMetricResultspublic MetricResults toMetricResults()
public MetricResults toMetricResultspublic MetricResults toMetricResults()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.storage.provider;

class="kw">import com.hypixel.fastutil.longs.Long2ObjectConcurrentHashMap;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.component.Resource;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.metrics.MetricProvider;
class="kw">import com.hypixel.hytale.metrics.MetricResults;
class="kw">import com.hypixel.hytale.metrics.MetricsRegistry;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.BufferChunkLoader;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.BufferChunkSaver;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.IChunkLoader;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.IChunkSaver;
class="kw">import com.hypixel.hytale.server.core.util.io.FileUtil;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import com.hypixel.hytale.storage.IndexedStorageFile;
class="kw">import it.unimi.dsi.fastutil.ints.IntList;
class="kw">import it.unimi.dsi.fastutil.ints.IntListIterator;
class="kw">import it.unimi.dsi.fastutil.longs.LongArrayList;
class="kw">import it.unimi.dsi.fastutil.longs.LongIterator;
class="kw">import it.unimi.dsi.fastutil.longs.LongList;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.longs.LongSet;
class="kw">import it.unimi.dsi.fastutil.longs.Long2ObjectMap.Entry;
class="kw">import java.io.Closeable;
class="kw">import java.io.FileNotFoundException;
class="kw">import java.io.IOException;
class="kw">import java.nio.ByteBuffer;
class="kw">import java.nio.file.FileAlreadyExistsException;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.StandardOpenOption;
class="kw">import java.util.Iterator;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.stream.Stream;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.checkerframework.checker.nullness.compatqual.NonNullDecl;

class="kw">public class IndexedStorageChunkStorageProvider class="kw">implements IChunkStorageProvider<IndexedStorageChunkStorageProvider.IndexedStorageCache> {
   class="kw">public class="kw">static class="kw">final String ID = "IndexedStorage";
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<IndexedStorageChunkStorageProvider> CODEC = BuilderCodec.builder(
         IndexedStorageChunkStorageProvider.class, IndexedStorageChunkStorageProvider::new
      )
      .documentation("Uses the indexed storage file format to store chunks.")
      .<Boolean>appendInherited(
         new KeyedCodec<>("FlushOnWrite", Codec.BOOLEAN),
         (var0, var1) -> var0.flushOnWrite = var1,
         var0 -> var0.flushOnWrite,
         (var0, var1) -> var0.flushOnWrite = var1.flushOnWrite
      )
      .documentation(
         "Controls whether the indexed storage flushes during writes.\nRecommended to be enabled to prevent corruption of chunks during unclean shutdowns."
      )
      .add()
      .build();
   class="kw">private boolean flushOnWrite = false;

   class="kw">public IndexedStorageChunkStorageProvider() {
   }

   class="kw">public IndexedStorageChunkStorageProvider.IndexedStorageCache initialize(@NonNullDecl Store<ChunkStore> var1) class="kw">throws IOException {
      World var2 = var1.getExternalData().getWorld();
      IndexedStorageChunkStorageProvider.IndexedStorageCache var3 = new IndexedStorageChunkStorageProvider.IndexedStorageCache();
      var3.path = var2.getSavePath().resolve("chunks");
      class="kw">return var3;
   }

   class="kw">public void delete(@Nonnull IndexedStorageChunkStorageProvider.IndexedStorageCache var1, @Nonnull Store<ChunkStore> var2) class="kw">throws IOException {
      var1.close();
      FileUtil.deleteDirectory(var1.path);
   }

   class="kw">public void close(@NonNullDecl IndexedStorageChunkStorageProvider.IndexedStorageCache var1, @NonNullDecl Store<ChunkStore> var2) class="kw">throws IOException {
      var1.close();
   }

   @Nonnull
   class="kw">public IChunkLoader getLoader(@Nonnull IndexedStorageChunkStorageProvider.IndexedStorageCache var1, @Nonnull Store<ChunkStore> var2) {
      class="kw">return new IndexedStorageChunkStorageProvider.IndexedStorageChunkLoader(var2, var1, this.flushOnWrite, false);
   }

   @Nonnull
   class="kw">public IChunkSaver getSaver(@Nonnull IndexedStorageChunkStorageProvider.IndexedStorageCache var1, @Nonnull Store<ChunkStore> var2) {
      class="kw">return new IndexedStorageChunkStorageProvider.IndexedStorageChunkSaver(var2, var1, this.flushOnWrite);
   }

   @Override
   class="kw">public void beginRecovery(Path var1, Path var2) class="kw">throws IOException {
      FileUtil.atomicMove(var1.resolve("chunks"), var2.resolve("chunks"));
   }

   @Override
   class="kw">public void revertRecovery(Path var1, Path var2) class="kw">throws IOException {
      Path var3 = var1.resolve("chunks");
      if (Files.exists(var3)) {
         FileUtil.deleteDirectory(var3);
      }

      FileUtil.atomicMove(var2.resolve("chunks"), var3);
   }

   @Nullable
   @Override
   class="kw">public IChunkLoader getRecoveryLoader(@Nonnull Store<ChunkStore> var1, Path var2) {
      IndexedStorageChunkStorageProvider.IndexedStorageCache var3 = new IndexedStorageChunkStorageProvider.IndexedStorageCache();
      var3.path = var2.resolve("chunks");
      class="kw">return new IndexedStorageChunkStorageProvider.IndexedStorageChunkLoader(var1, var3, false, true);
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "IndexedStorageChunkStorageProvider{}";
   }

   @Nonnull
   class="kw">private class="kw">static String toFileName(int var0, int var1) {
      class="kw">return var0 + "." + var1 + ".region.bin";
   }

   class="kw">private class="kw">static long fromFileName(@Nonnull String var0) {
      String[] var1 = var0.split("\\.", -1);
      if (var1.length != 4) {
         throw new IllegalArgumentException("Unexpected file name format!");
      }

      if (!"region".equals(var1[2])) {
         throw new IllegalArgumentException("Unexpected file name format!");
      }

      if (!"bin".equals(var1[3])) {
         throw new IllegalArgumentException("Unexpected file extension!");
      }

      int var2 = Integer.parseInt(var1[0]);
      int var3 = Integer.parseInt(var1[1]);
      class="kw">return ChunkUtil.indexChunk(var2, var3);
   }

   class="kw">public class="kw">static class IndexedStorageCache class="kw">implements Closeable, MetricProvider, Resource<ChunkStore> {
      @Nonnull
      class="kw">public class="kw">static class="kw">final MetricsRegistry<IndexedStorageChunkStorageProvider.IndexedStorageCache> METRICS_REGISTRY = new MetricsRegistry<IndexedStorageChunkStorageProvider.IndexedStorageCache>()
         .register(
            "Files",
            var0 -> var0.cache
               .long2ObjectEntrySet()
               .stream()
               .map(IndexedStorageChunkStorageProvider.IndexedStorageCache.CacheEntryMetricData::new)
               .toArray(IndexedStorageChunkStorageProvider.IndexedStorageCache.CacheEntryMetricData[]::new),
            new ArrayCodec<>(
               IndexedStorageChunkStorageProvider.IndexedStorageCache.CacheEntryMetricData.CODEC,
               IndexedStorageChunkStorageProvider.IndexedStorageCache.CacheEntryMetricData[]::new
            )
         );
      class="kw">private class="kw">final Long2ObjectConcurrentHashMap<IndexedStorageFile> cache = new Long2ObjectConcurrentHashMap<>(true, ChunkUtil.NOT_FOUND);
      class="kw">private Path path;

      class="kw">public IndexedStorageCache() {
      }

      @Nonnull
      class="kw">public Long2ObjectConcurrentHashMap<IndexedStorageFile> getCache() {
         class="kw">return this.cache;
      }

      @Override
      class="kw">public void close() class="kw">throws IOException {
         IOException var1 = null;
         Iterator var2 = this.cache.values().iterator();

         while (var2.hasNext()) {
            try {
               var2.next().close();
               var2.remove();
            } catch (Exception var4) {
               if (var1 == null) {
                  var1 = new IOException("Failed to close one or more loaders!");
               }

               var1.addSuppressed(var4);
            }
         }

         if (var1 != null) {
            throw var1;
         }
      }

      @Nullable
      class="kw">public IndexedStorageFile getOrTryOpen(int var1, int var2, boolean var3) {
         class="kw">return this.cache.computeIfAbsent(ChunkUtil.indexChunk(var1, var2), var4 -> {
            Path var6 = this.path.resolve(IndexedStorageChunkStorageProvider.toFileName(var1, var2));
            if (!Files.exists(var6)) {
               class="kw">return null;
            }

            try {
               IndexedStorageFile var7 = IndexedStorageFile.open(var6, StandardOpenOption.READ, StandardOpenOption.WRITE);
               var7.setFlushOnWrite(var3);
               class="kw">return var7;
            } catch (FileNotFoundException var8) {
               class="kw">return null;
            } catch (IOException var9) {
               throw SneakyThrow.sneakyThrow(var9);
            }
         });
      }

      @Nonnull
      class="kw">public IndexedStorageFile getOrCreate(int var1, int var2, boolean var3) {
         class="kw">return this.cache.computeIfAbsent(ChunkUtil.indexChunk(var1, var2), var4 -> {
            try {
               if (!Files.exists(this.path)) {
                  try {
                     Files.createDirectory(this.path);
                  } catch (FileAlreadyExistsException var8) {
                  }
               }

               Path var6 = this.path.resolve(IndexedStorageChunkStorageProvider.toFileName(var1, var2));
               IndexedStorageFile var7 = IndexedStorageFile.open(var6, StandardOpenOption.CREATE, StandardOpenOption.READ, StandardOpenOption.WRITE);
               var7.setFlushOnWrite(var3);
               class="kw">return var7;
            } catch (IOException var9) {
               throw SneakyThrow.sneakyThrow(var9);
            }
         });
      }

      @Nonnull
      class="kw">public LongList getIndexes() class="kw">throws IOException {
         if (!Files.exists(this.path)) {
            class="kw">return LongList.of();
         }

         LongArrayList var1 = new LongArrayList();

         try (Stream var2 = Files.list(this.path)) {
            var2.forEach(SneakyThrow.sneakyConsumer(var2x -> {
               if (!Files.isDirectory(var2x)) {
                  long var3;
                  try {
                     var3 = IndexedStorageChunkStorageProvider.fromFileName(var2x.getFileName().toString());
                  } catch (IllegalArgumentException var15) {
                     class="kw">return;
                  }

                  int var5 = ChunkUtil.xOfChunkIndex(var3);
                  int var6 = ChunkUtil.zOfChunkIndex(var3);
                  IndexedStorageFile var7 = this.getOrTryOpen(var5, var6, false);
                  if (var7 != null) {
                     IntList var8 = var7.keys();
                     IntListIterator var9 = var8.iterator();

                     while (var9.hasNext()) {
                        int var10 = var9.nextInt();
                        int var11 = ChunkUtil.xFromColumn(var10);
                        int var12 = ChunkUtil.zFromColumn(var10);
                        int var13 = var5 << 5 | var11;
                        int var14 = var6 << 5 | var12;
                        var1.add(ChunkUtil.indexChunk(var13, var14));
                     }
                  }
               }
            }));
         }

         class="kw">return var1;
      }

      class="kw">public void flush() class="kw">throws IOException {
         IOException var1 = null;

         for (IndexedStorageFile var3 : this.cache.values()) {
            try {
               var3.force(false);
            } catch (Exception var5) {
               if (var1 == null) {
                  var1 = new IOException("Failed to close one or more loaders!");
               }

               var1.addSuppressed(var5);
            }
         }

         if (var1 != null) {
            throw var1;
         }
      }

      @Nonnull
      @Override
      class="kw">public MetricResults toMetricResults() {
         class="kw">return METRICS_REGISTRY.toMetricResults(this);
      }

      @Nonnull
      @Override
      class="kw">public Resource<ChunkStore> clone() {
         class="kw">return new IndexedStorageChunkStorageProvider.IndexedStorageCache();
      }

      class="kw">private class="kw">static class CacheEntryMetricData {
         @Nonnull
         class="kw">private class="kw">static class="kw">final Codec<IndexedStorageChunkStorageProvider.IndexedStorageCache.CacheEntryMetricData> CODEC = BuilderCodec.builder(
               IndexedStorageChunkStorageProvider.IndexedStorageCache.CacheEntryMetricData.class,
               IndexedStorageChunkStorageProvider.IndexedStorageCache.CacheEntryMetricData::new
            )
            .append(new KeyedCodec<>("Key", Codec.LONG), (var0, var1) -> var0.key = var1, var0 -> var0.key)
            .add()
            .append(new KeyedCodec<>("File", IndexedStorageFile.METRICS_REGISTRY), (var0, var1) -> var0.value = var1, var0 -> var0.value)
            .add()
            .build();
         class="kw">private long key;
         class="kw">private IndexedStorageFile value;

         class="kw">public CacheEntryMetricData() {
         }

         class="kw">public CacheEntryMetricData(@Nonnull Entry<IndexedStorageFile> var1) {
            this.key = var1.getLongKey();
            this.value = (IndexedStorageFile)var1.getValue();
         }
      }
   }

   class="kw">public class="kw">static class IndexedStorageChunkLoader class="kw">extends BufferChunkLoader class="kw">implements MetricProvider {
      @Nonnull
      class="kw">private class="kw">final IndexedStorageChunkStorageProvider.IndexedStorageCache cache;
      class="kw">private class="kw">final boolean flushOnWrite;
      class="kw">private class="kw">final boolean ownsCache;

      class="kw">public IndexedStorageChunkLoader(
         @Nonnull Store<ChunkStore> var1, @Nonnull IndexedStorageChunkStorageProvider.IndexedStorageCache var2, boolean var3, boolean var4
      ) {
         super(var1);
         this.cache = var2;
         this.flushOnWrite = var3;
         this.ownsCache = var4;
      }

      @Override
      class="kw">public void close() class="kw">throws IOException {
         if (this.ownsCache) {
            this.cache.close();
         }
      }

      @Nonnull
      @Override
      class="kw">public CompletableFuture<ByteBuffer> loadBuffer(int var1, int var2) {
         int var3 = var1 >> 5;
         int var4 = var2 >> 5;
         int var5 = var1 & 31;
         int var6 = var2 & 31;
         int var7 = ChunkUtil.indexColumn(var5, var6);
         class="kw">return CompletableFuture.supplyAsync(SneakyThrow.sneakySupplier(() -> {
            IndexedStorageFile var4 = this.cache.getOrTryOpen(var3, var4, this.flushOnWrite);
            class="kw">return var4 == null ? null : var4.readBlob(var7);
         }));
      }

      @Nonnull
      @Override
      class="kw">public LongList getIndexes() class="kw">throws IOException {
         class="kw">return this.cache.getIndexes();
      }

      @Nullable
      @Override
      class="kw">public MetricResults toMetricResults() {
         class="kw">return this.getStore().getExternalData().getSaver() class="kw">instanceof IndexedStorageChunkStorageProvider.IndexedStorageChunkSaver
            ? null
            : this.cache.toMetricResults();
      }
   }

   class="kw">public class="kw">static class IndexedStorageChunkSaver class="kw">extends BufferChunkSaver class="kw">implements MetricProvider {
      @Nonnull
      class="kw">private class="kw">final IndexedStorageChunkStorageProvider.IndexedStorageCache cache;
      class="kw">private class="kw">final boolean flushOnWrite;

      class="kw">protected IndexedStorageChunkSaver(@Nonnull Store<ChunkStore> var1, @Nonnull IndexedStorageChunkStorageProvider.IndexedStorageCache var2, boolean var3) {
         super(var1);
         this.cache = var2;
         this.flushOnWrite = var3;
      }

      @Override
      class="kw">public void close() class="kw">throws IOException {
      }

      @Nonnull
      @Override
      class="kw">public CompletableFuture<Void> saveBuffer(int var1, int var2, @Nonnull ByteBuffer var3) {
         int var4 = var1 >> 5;
         int var5 = var2 >> 5;
         int var6 = var1 & 31;
         int var7 = var2 & 31;
         int var8 = ChunkUtil.indexColumn(var6, var7);
         class="kw">return CompletableFuture.runAsync(SneakyThrow.sneakyRunnable(() -> {
            IndexedStorageFile var5 = this.cache.getOrCreate(var4, var5, this.flushOnWrite);
            var5.writeBlob(var8, var3);
         }));
      }

      @Nonnull
      @Override
      class="kw">public CompletableFuture<Void> removeBuffer(int var1, int var2) {
         int var3 = var1 >> 5;
         int var4 = var2 >> 5;
         int var5 = var1 & 31;
         int var6 = var2 & 31;
         int var7 = ChunkUtil.indexColumn(var5, var6);
         class="kw">return CompletableFuture.runAsync(SneakyThrow.sneakyRunnable(() -> {
            IndexedStorageFile var4 = this.cache.getOrTryOpen(var3, var4, this.flushOnWrite);
            if (var4 != null) {
               var4.removeBlob(var7);
            }
         }));
      }

      @Nonnull
      @Override
      class="kw">public LongList getIndexes() class="kw">throws IOException {
         class="kw">return this.cache.getIndexes();
      }

      @Override
      class="kw">public void flush() class="kw">throws IOException {
         this.cache.flush();
      }

      @Nonnull
      @Override
      class="kw">public CompletableFuture<Void> compact(@Nullable long[] var1) {
         class="kw">return CompletableFuture.runAsync(SneakyThrow.sneakyRunnable(() -> {
            LongSet var2 = new LongOpenHashSet();
            if (var1 != null) {
               for (long var6 : var1) {
                  int var8 = ChunkUtil.xOfChunkIndex(var6) >> 5;
                  int var9 = ChunkUtil.zOfChunkIndex(var6) >> 5;
                  var2.add(ChunkUtil.indexChunk(var8, var9));
               }
            } else {
               var2.addAll(this.cache.getCache().keySet());
            }

            LongIterator var10 = var2.iterator();

            while (var10.hasNext()) {
               long var11 = var10.nextLong();
               IndexedStorageFile var12 = this.cache.getCache().get(var11);
               if (var12 != null && var12.getUsedBlobCount() == 0) {
                  int var7 = ChunkUtil.xOfChunkIndex(var11);
                  int var13 = ChunkUtil.zOfChunkIndex(var11);
                  var12.close();
                  this.cache.getCache().remove(var11);
                  Files.deleteIfExists(this.cache.path.resolve(IndexedStorageChunkStorageProvider.toFileName(var7, var13)));
               }
            }
         }));
      }

      @Override
      class="kw">public MetricResults toMetricResults() {
         class="kw">return this.cache.toMetricResults();
      }
   }
}