IChunkStorageProvider interface

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

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

Поля (25)

МодификаторыТипИмя
ComponentRegistry.Data var10
Store var11
ComponentRegistry.Data var12
LongList var13
LongIterator var14
int var15
ArrayList var16
ArrayList var17
long[] var18
int var19
var19
long var20
int var22
int var23
double var24
long[] var25
Object var3
Object var4
long[] var41
CompletableFuture[] var42
IChunkLoader var5
IChunkSaver var6
IChunkSaver var7
World var8
HytaleLogger var9

Методы (14)

МодификаторыВозвратСигнатура
abstract throw new UnsupportedOperationExceptionthrow new UnsupportedOperationException()
default void beginRecoveryvoid beginRecovery(Path var1, Path var2)
abstract void closevoid close(@Nonnull Data var1, @Nonnull Store<ChunkStore> var2)
abstract void deletevoid delete(@Nonnull Data var1, @Nonnull Store<ChunkStore> var2)
if if(var4x != null)
if if(++var15 % 100 == 0)
if if(var19 == var18.length)
if if(var19 > 0)
if if(var2x != null)
abstract Data initializeData initialize(@Nonnull Store<ChunkStore> var1)
default boolean isSameboolean isSame(IChunkStorageProvider<?> var1)
default <OtherData> Data migrateFrom<OtherData> Data migrateFrom(@Nonnull Store<ChunkStore> var1, IChunkStorageProvider<OtherData> var2)
default void revertRecoveryvoid revertRecovery(Path var1, Path var2)
abstract try try(IChunkLoader var5 = var2.getLoader(var3, var1)

Исходный код

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

class="kw">import com.hypixel.hytale.codec.lookup.BuilderCodecMapCodec;
class="kw">import com.hypixel.hytale.component.ComponentRegistry;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.modules.migrations.ChunkMigrations;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
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 it.unimi.dsi.fastutil.longs.LongIterator;
class="kw">import it.unimi.dsi.fastutil.longs.LongList;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Path;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Arrays;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.ForkJoinPool;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class="kw">interface IChunkStorageProvider<Data> {
   @Nonnull
   BuilderCodecMapCodec<IChunkStorageProvider<?>> CODEC = new BuilderCodecMapCodec<>("Type", true);
   int MIGRATION_COMPACT_INTERVAL = 5000;
   int MIGRATION_MAX_PENDING_COMPACTS = 3;

   Data initialize(@Nonnull Store<ChunkStore> var1) class="kw">throws IOException;

   class="kw">default <OtherData> Data migrateFrom(@Nonnull Store<ChunkStore> var1, IChunkStorageProvider<OtherData> var2) class="kw">throws IOException {
      Object var3 = var2.initialize(var1);
      Object var4 = this.initialize(var1);

      try (
         IChunkLoader var5 = var2.getLoader(var3, var1);
         IChunkSaver var6 = var2.getSaver(var3, var1);
         IChunkSaver var7 = this.getSaver(var4, var1);
      ) {
         World var8 = var1.getExternalData().getWorld();
         HytaleLogger var9 = var8.getLogger();
         ComponentRegistry.Data var10 = ChunkStore.REGISTRY._internal_getData();
         Store var11 = var8.getEntityStore().getStore();
         ComponentRegistry.Data var12 = var11 != null ? EntityStore.REGISTRY._internal_getData() : null;
         LongList var13 = var5.getIndexes();
         LongIterator var14 = var13.iterator();
         ((HytaleLogger.Api)var9.atInfo()).log("Migrating %d chunks", var13.size());
         HytaleServer.get().reportSingleplayerStatus(Message.translation("client.gameLoadingView.status.migratingChunks").param("name", var8.getName()), 0.0);
         int var15 = 0;
         ArrayList var16 = new ArrayList<>();
         ArrayList var17 = new ArrayList<>();
         long[] var18 = new long[5000];
         int var19 = 0;

         while (var14.hasNext()) {
            long var20 = var14.nextLong();
            int var22 = ChunkUtil.xOfChunkIndex(var20);
            int var23 = ChunkUtil.zOfChunkIndex(var20);
            var16.add(
               var5.loadHolder(var22, var23)
                  .thenApply(var4x -> {
                     if (var4x != null) {
                        ChunkMigrations.migrate((Holder<ChunkStore>)var4x, var10, var1, var12, var11);
                     }

                     class="kw">return var4x;
                  })
                  .thenCompose(var3x -> var7.saveHolder(var22, var23, (Holder<ChunkStore>)var3x))
                  .thenCompose(var3x -> var6.removeHolder(var22, var23))
                  .exceptionally(var3x -> {
                     ((HytaleLogger.Api)((HytaleLogger.Api)var9.atSevere()).withCause(var3x)).log("Failed to load chunk at %d, %d, skipping", var22, var23);
                     class="kw">return null;
                  })
            );
            var18[var19++] = var20;
            if (++var15 % 100 == 0) {
               ((HytaleLogger.Api)var9.atInfo()).log("Migrated %d/%d chunks", var15, var13.size());
               double var24 = MathUtil.round((double)var15 / var13.size(), 2) * 100.0;
               HytaleServer.get()
                  .reportSingleplayerStatus(Message.translation("client.gameLoadingView.status.migratingChunks").param("name", var8.getName()), var24);
            }

            if (var19 == var18.length) {
               CompletableFuture[] var42 = var16.toArray(CompletableFuture[]::new);
               long[] var25 = (long[])var18.clone();
               var16.clear();
               var19 = 0;
               var17.add(
                  CompletableFuture.allOf(var42)
                     .thenCompose(var2x -> var6.compact(var25))
                     .exceptionally(
                        var1x -> {
                           ((HytaleLogger.Api)((HytaleLogger.Api)var9.atWarning()).withCause(var1x))
                              .log("Compaction of source storage during migration failed; continuing");
                           class="kw">return null;
                        }
                     )
               );
               var17.removeIf(CompletableFuture::isDone);

               while (var17.size() >= 3) {
                  CompletableFuture.anyOf(var17.toArray(CompletableFuture[]::new)).join();
                  var17.removeIf(CompletableFuture::isDone);
               }
            } else {
               var16.removeIf(CompletableFuture::isDone);
               if (var16.size() >= ForkJoinPool.getCommonPoolParallelism()) {
                  CompletableFuture.anyOf(var16.toArray(CompletableFuture[]::new)).join();
                  var16.removeIf(CompletableFuture::isDone);
               }
            }
         }

         CompletableFuture.allOf(var16.toArray(CompletableFuture[]::new)).join();
         var16.clear();
         if (var19 > 0) {
            long[] var41 = Arrays.copyOf(var18, var19);
            var17.add(
               var6.compact(var41)
                  .exceptionally(
                     var1x -> {
                        ((HytaleLogger.Api)((HytaleLogger.Api)var9.atWarning()).withCause(var1x))
                           .log("Final compaction of source storage during migration failed; continuing");
                        class="kw">return null;
                     }
                  )
            );
         }

         CompletableFuture.allOf(var17.toArray(CompletableFuture[]::new)).join();
         ((HytaleLogger.Api)var9.atInfo()).log("Compacting migrated storage...");
         var7.compact(null).whenComplete((var1x, var2x) -> {
            if (var2x != null) {
               ((HytaleLogger.Api)((HytaleLogger.Api)var9.atWarning()).withCause(var2x)).log("Final compaction of migrated storage failed; continuing");
            } else {
               ((HytaleLogger.Api)var9.atInfo()).log("Compaction complete");
            }
         });
         ((HytaleLogger.Api)var9.atInfo()).log("Finished migrating %d chunks", var13.size());
      } class="kw">finally {
         var2.delete(var3, var1);
      }

      class="kw">return var4;
   }

   void delete(@Nonnull Data var1, @Nonnull Store<ChunkStore> var2) class="kw">throws IOException;

   void close(@Nonnull Data var1, @Nonnull Store<ChunkStore> var2) class="kw">throws IOException;

   @Nonnull
   IChunkLoader getLoader(@Nonnull Data var1, @Nonnull Store<ChunkStore> var2) class="kw">throws IOException;

   @Nonnull
   IChunkSaver getSaver(@Nonnull Data var1, @Nonnull Store<ChunkStore> var2) class="kw">throws IOException;

   @Nullable
   class="kw">default IChunkLoader getRecoveryLoader(@Nonnull Store<ChunkStore> var1, Path var2) {
      class="kw">return null;
   }

   class="kw">default void beginRecovery(Path var1, Path var2) class="kw">throws IOException {
      throw new UnsupportedOperationException();
   }

   class="kw">default void revertRecovery(Path var1, Path var2) class="kw">throws IOException {
      throw new UnsupportedOperationException();
   }

   class="kw">default boolean isSame(IChunkStorageProvider<?> var1) {
      class="kw">return var1.getClass().equals(this.getClass());
   }
}