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());
}
}