Skip to content

Commit 023f2ff

Browse files
committed
Intergate with minecraft. Add worker
1 parent ac61276 commit 023f2ff

File tree

14 files changed

+242
-84
lines changed

14 files changed

+242
-84
lines changed
Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package ru.lionzxy.fastlogblock;
22

33
import net.minecraftforge.common.MinecraftForge;
4-
import net.minecraftforge.event.world.BlockEvent;
54
import net.minecraftforge.fml.common.FMLLog;
65
import net.minecraftforge.fml.common.Mod;
76
import net.minecraftforge.fml.common.Mod.EventHandler;
87
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
9-
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
10-
import ru.lionzxy.fastlogblock.config.LogConfig;
11-
import ru.lionzxy.fastlogblock.models.BlockChangeEventModel;
8+
import ru.lionzxy.fastlogblock.handlers.EventHandlingManager;
129

1310
import java.io.File;
1411
import java.io.IOException;
@@ -18,36 +15,13 @@ public class FastLogBlock {
1815
public static final File rootMinecraftPath = new File("./");
1916
public static final String MODID = "fastlogblock";
2017
public static final String VERSION = "1.0";
21-
@Mod.Instance
22-
public static FastLogBlock fastLogBlock;
23-
public File logFolderFile;
18+
private EventHandlingManager eventHandlingManager;
2419

2520
@EventHandler
2621
public void init(final FMLInitializationEvent event) throws IOException {
27-
logFolderFile = new File(rootMinecraftPath, LogConfig.logFolderPath);
28-
FMLLog.log.info("FullPath: " + logFolderFile.getAbsolutePath());
29-
MinecraftForge.EVENT_BUS.register(this);
30-
}
31-
32-
@SubscribeEvent
33-
public void onBlockBreak(final BlockEvent.BreakEvent event) {
34-
final BlockChangeEventModel blockChangeEventModel = BlockChangeEventModel.getChangeEvent(event);
35-
36-
if (blockChangeEventModel == null) {
37-
return;
38-
}
39-
40-
FMLLog.log.info(blockChangeEventModel.toString());
41-
}
42-
43-
@SubscribeEvent
44-
public void onBlockPlace(final BlockEvent.PlaceEvent event) {
45-
final BlockChangeEventModel blockChangeEventModel = BlockChangeEventModel.getChangeEvent(event);
46-
47-
if (blockChangeEventModel == null) {
48-
return;
49-
}
50-
51-
FMLLog.log.info(blockChangeEventModel.toString());
22+
FMLLog.log.info("Initializing eventHandlingManager...");
23+
eventHandlingManager = new EventHandlingManager();
24+
FMLLog.log.info("Done!");
25+
MinecraftForge.EVENT_BUS.register(eventHandlingManager);
5226
}
5327
}

src/main/java/ru/lionzxy/fastlogblock/config/LogConfig.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,18 @@
1313
@Config.LangKey("fastlogblock.config.title")
1414
public class LogConfig {
1515
@Config.Comment("Filepath from minecraft root folder to block log path")
16-
public static final String logFolderPath = "./blocklog/";
17-
@Config.Comment("Path to mapper file from logFolderPath")
18-
public static final String nickToIntFilePath = "nicktoid.prop";
19-
public static final HashConfig HASH_CONFIG = new HashConfig();
16+
public static String logFolderPath = "blocklog";
17+
@Config.Comment("Path to nickname mapper file from logFolderPath")
18+
public static String nickToIntFilePath = "nicktoid.bytelog";
19+
@Config.Comment("Path to block mapper file from logFolderPath")
20+
public static String blockToLongFilePath = "blocktoid.bytelog";
21+
public static HashConfig HASH_CONFIG = new HashConfig();
2022
@Config.Comment("File splitter type. SINGLE for single-file strategy, BLOCKHASH for file=HASH(BlockPos) strategy")
2123
public static FileSplitterEnum fileSplitterType = FileSplitterEnum.BLOCKHASH;
2224
@Config.Comment("Utils information for migration")
2325
public static int logSchemeVersion = 1;
24-
@Config.Comment("Path to mapper file from logFolderPath")
25-
public static String blockToIntFilePath = "blocktoid.prop";
26+
@Config.Comment("Utils information for migration")
27+
public static int writeWorkersCount = 4;
2628
@Config.Comment("Regular expression for block change event ignore")
2729
public static String[] ignoreBlockNamesRegExp = new String[]{"<minecraft:tallgrass:*>"};
2830

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package ru.lionzxy.fastlogblock.handlers;
2+
3+
import net.minecraftforge.event.world.BlockEvent;
4+
import net.minecraftforge.fml.common.FMLLog;
5+
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
6+
import ru.lionzxy.fastlogblock.models.BlockChangeEventModel;
7+
import ru.lionzxy.fastlogblock.models.BlockChangeEventModelWithWorld;
8+
9+
import java.io.IOException;
10+
import java.util.concurrent.Executor;
11+
import java.util.concurrent.Executors;
12+
13+
public class EventHandlingManager {
14+
private final Executor executor = Executors.newCachedThreadPool();
15+
private final SplitterRunnable splitterRunnable;
16+
17+
public EventHandlingManager() throws IOException {
18+
this.splitterRunnable = new SplitterRunnable();
19+
splitterRunnable.runWorkers(executor);
20+
executor.execute(splitterRunnable);
21+
}
22+
23+
@SubscribeEvent
24+
public void onBlockBreak(final BlockEvent.BreakEvent event) {
25+
final BlockChangeEventModelWithWorld blockChangeEventModel = (BlockChangeEventModelWithWorld) BlockChangeEventModel.getChangeEvent(event);
26+
27+
if (blockChangeEventModel == null) {
28+
return;
29+
}
30+
31+
FMLLog.log.debug(blockChangeEventModel.toString());
32+
splitterRunnable.addEvent(blockChangeEventModel);
33+
}
34+
35+
@SubscribeEvent
36+
public void onBlockPlace(final BlockEvent.PlaceEvent event) {
37+
final BlockChangeEventModelWithWorld blockChangeEventModel = (BlockChangeEventModelWithWorld) BlockChangeEventModel.getChangeEvent(event);
38+
39+
if (blockChangeEventModel == null) {
40+
return;
41+
}
42+
43+
FMLLog.log.debug(blockChangeEventModel.toString());
44+
splitterRunnable.addEvent(blockChangeEventModel);
45+
}
46+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package ru.lionzxy.fastlogblock.handlers;
2+
3+
import ru.lionzxy.fastlogblock.config.LogConfig;
4+
import ru.lionzxy.fastlogblock.io.WriteRunnable;
5+
import ru.lionzxy.fastlogblock.io.filesplitter.IFileSplitter;
6+
import ru.lionzxy.fastlogblock.io.filesplitter.impl.BlockHashFileSplitter;
7+
import ru.lionzxy.fastlogblock.io.filesplitter.impl.SingleFileSplitter;
8+
import ru.lionzxy.fastlogblock.io.mappers.BlockMapper;
9+
import ru.lionzxy.fastlogblock.io.mappers.NickMapper;
10+
import ru.lionzxy.fastlogblock.models.BlockChangeEventModelWithWorld;
11+
12+
import java.io.File;
13+
import java.io.IOException;
14+
import java.util.HashMap;
15+
import java.util.Map;
16+
import java.util.concurrent.BlockingQueue;
17+
import java.util.concurrent.Executor;
18+
import java.util.concurrent.LinkedBlockingQueue;
19+
import java.util.concurrent.atomic.AtomicInteger;
20+
21+
public class SplitterRunnable implements Runnable {
22+
private final BlockingQueue<BlockChangeEventModelWithWorld> eventQueue = new LinkedBlockingQueue<>();
23+
private final WriteRunnable[] writeWorkers = new WriteRunnable[LogConfig.writeWorkersCount];
24+
private final Map<File, WriteRunnable> fileToWriteWorker = new HashMap<>();
25+
private final AtomicInteger counter = new AtomicInteger(0);
26+
27+
private final IFileSplitter fileSplitter;
28+
private final NickMapper nickMapper;
29+
private final BlockMapper blockMapper;
30+
31+
public SplitterRunnable() throws IOException {
32+
final File rootFile = new File(LogConfig.logFolderPath);
33+
34+
switch (LogConfig.fileSplitterType) {
35+
case SINGLE:
36+
fileSplitter = new SingleFileSplitter(rootFile);
37+
break;
38+
default:
39+
case BLOCKHASH:
40+
fileSplitter = new BlockHashFileSplitter(rootFile);
41+
break;
42+
}
43+
this.nickMapper = new NickMapper(new File(rootFile, LogConfig.nickToIntFilePath));
44+
this.blockMapper = new BlockMapper(new File(rootFile, LogConfig.blockToLongFilePath));
45+
46+
for (int i = 0; i < LogConfig.writeWorkersCount; i++) {
47+
writeWorkers[i] = new WriteRunnable(fileSplitter, nickMapper, blockMapper);
48+
}
49+
}
50+
51+
public void runWorkers(Executor executor) {
52+
for (int i = 0; i < LogConfig.writeWorkersCount; i++) {
53+
executor.execute(writeWorkers[i]);
54+
}
55+
}
56+
57+
@Override
58+
public void run() {
59+
while (!Thread.currentThread().isInterrupted()) {
60+
try {
61+
processEvent(eventQueue.take());
62+
nickMapper.sync();
63+
blockMapper.sync();
64+
} catch (Exception e) {
65+
e.printStackTrace();
66+
}
67+
}
68+
}
69+
70+
public void addEvent(BlockChangeEventModelWithWorld blockChangeEventModelWithWorld) {
71+
eventQueue.add(blockChangeEventModelWithWorld);
72+
}
73+
74+
private void processEvent(BlockChangeEventModelWithWorld event) {
75+
final File file = fileSplitter.getFileByPosAndWorld(event.getBlockPos(), event.getWorld());
76+
77+
if (event.isIgnore()) {
78+
return;
79+
}
80+
81+
WriteRunnable writeRunnable = fileToWriteWorker.get(file);
82+
if (writeRunnable != null) {
83+
writeRunnable.putEvent(event);
84+
return;
85+
}
86+
87+
if (counter.get() >= LogConfig.writeWorkersCount) {
88+
counter.set(0);
89+
}
90+
91+
writeRunnable = writeWorkers[counter.getAndIncrement()];
92+
fileToWriteWorker.put(file, writeRunnable);
93+
writeRunnable.putEvent(event);
94+
}
95+
}

src/main/java/ru/lionzxy/fastlogblock/io/ReadRunnable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public void run() {
3232
try {
3333
final FindTask findTask = findTasks.take();
3434
withoutWork.set(false);
35-
final File file = fileSplitter.getFileByPos(findTask.getBlockPos());
35+
final File file = fileSplitter.getFileByPosAndWorld(findTask.getBlockPos(), findTask.getWorld());
3636
final LogReader logReader = new LogReader(file, blockMapper, nickMapper);
3737
final List<BlockChangeEventModel> blockChangeEventModels = logReader.readEventByPos(findTask.getBlockPos());
3838
findTask.getFindListener().onResultAsync(blockChangeEventModels);

src/main/java/ru/lionzxy/fastlogblock/io/WriteRunnable.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import ru.lionzxy.fastlogblock.io.log.LogWritter;
55
import ru.lionzxy.fastlogblock.io.mappers.BlockMapper;
66
import ru.lionzxy.fastlogblock.io.mappers.NickMapper;
7-
import ru.lionzxy.fastlogblock.models.BlockChangeEventModel;
7+
import ru.lionzxy.fastlogblock.models.BlockChangeEventModelWithWorld;
88

99
import java.io.File;
1010
import java.io.IOException;
@@ -15,7 +15,7 @@
1515
import java.util.concurrent.atomic.AtomicBoolean;
1616

1717
public class WriteRunnable implements Runnable {
18-
private final BlockingQueue<BlockChangeEventModel> eventQueue = new LinkedBlockingQueue<>();
18+
private final BlockingQueue<BlockChangeEventModelWithWorld> eventQueue = new LinkedBlockingQueue<>();
1919
private final Map<File, LogWritter> writterMap = new HashMap<>();
2020
private final NickMapper nickMapper;
2121
private final BlockMapper blockMapper;
@@ -33,9 +33,9 @@ public void run() {
3333
while (!Thread.currentThread().isInterrupted()) {
3434
try {
3535
do {
36-
final BlockChangeEventModel event = eventQueue.take();
36+
final BlockChangeEventModelWithWorld event = eventQueue.take();
3737
withoutWork.set(false);
38-
final File file = fileSplitter.getFileByPos(event.getBlockPos());
38+
final File file = fileSplitter.getFileByPosAndWorld(event.getBlockPos(), event.getWorld());
3939
LogWritter writter = writterMap.get(file);
4040
if (writter == null) {
4141
writter = new LogWritter(file, blockMapper, nickMapper);
@@ -58,7 +58,7 @@ public void run() {
5858
}
5959
}
6060

61-
public void putEvent(BlockChangeEventModel blockChangeEventModel) {
61+
public void putEvent(BlockChangeEventModelWithWorld blockChangeEventModel) {
6262
eventQueue.add(blockChangeEventModel);
6363
}
6464

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,7 @@
11
package ru.lionzxy.fastlogblock.io.filesplitter;
22

3-
import ru.lionzxy.fastlogblock.FastLogBlock;
4-
import ru.lionzxy.fastlogblock.io.filesplitter.impl.BlockHashFileSplitter;
5-
import ru.lionzxy.fastlogblock.io.filesplitter.impl.SingleFileSplitter;
6-
73
public enum FileSplitterEnum {
8-
SINGLE(new SingleFileSplitter(FastLogBlock.rootMinecraftPath)),
9-
BLOCKHASH(new BlockHashFileSplitter(FastLogBlock.rootMinecraftPath));
10-
11-
private final IFileSplitter fileSplitter;
12-
13-
FileSplitterEnum(final IFileSplitter fileSplitter) {
14-
this.fileSplitter = fileSplitter;
15-
}
4+
SINGLE,
5+
BLOCKHASH;
166

17-
public IFileSplitter getFileSplitter() {
18-
return fileSplitter;
19-
}
207
}

src/main/java/ru/lionzxy/fastlogblock/io/filesplitter/IFileSplitter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ru.lionzxy.fastlogblock.io.filesplitter;
22

33
import net.minecraft.util.math.BlockPos;
4+
import net.minecraft.world.World;
45

56
import java.io.File;
67

@@ -13,5 +14,5 @@ public IFileSplitter(final File modFolder) {
1314

1415
public abstract File[] getAllLogFile();
1516

16-
public abstract File getFileByPos(BlockPos blockPos);
17+
public abstract File getFileByPosAndWorld(BlockPos blockPos, World world);
1718
}

src/main/java/ru/lionzxy/fastlogblock/io/filesplitter/impl/BlockHashFileSplitter.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package ru.lionzxy.fastlogblock.io.filesplitter.impl;
22

33
import net.minecraft.util.math.BlockPos;
4+
import net.minecraft.world.World;
5+
import net.minecraftforge.common.DimensionManager;
46
import ru.lionzxy.fastlogblock.config.LogConfig;
57
import ru.lionzxy.fastlogblock.io.filesplitter.IFileSplitter;
68

@@ -35,8 +37,22 @@ public File[] getAllLogFile() {
3537
}
3638

3739
@Override
38-
public File getFileByPos(final BlockPos blockPos) {
39-
return new File(String.format(LogConfig.HASH_CONFIG.fileNamePattern, hashByBlock(blockPos)));
40+
public File getFileByPosAndWorld(final BlockPos blockPos, World world) {
41+
if (world == null) {
42+
return new File(modFolder, String.format(LogConfig.HASH_CONFIG.fileNamePattern, hashByBlock(blockPos)));
43+
}
44+
45+
File saveFile = DimensionManager.getCurrentSaveRootDirectory();
46+
if (saveFile == null) {
47+
saveFile = new File("save0");
48+
}
49+
final File saveFolder = new File(modFolder, saveFile.getName());
50+
String worldSave = world.provider.getSaveFolder();
51+
if (worldSave == null) {
52+
worldSave = "DIM0";
53+
}
54+
final File dimFolder = new File(saveFolder, new File(worldSave).getName());
55+
return new File(dimFolder, String.format(LogConfig.HASH_CONFIG.fileNamePattern, hashByBlock(blockPos)));
4056
}
4157

4258

src/main/java/ru/lionzxy/fastlogblock/io/filesplitter/impl/SingleFileSplitter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ru.lionzxy.fastlogblock.io.filesplitter.impl;
22

33
import net.minecraft.util.math.BlockPos;
4+
import net.minecraft.world.World;
45
import ru.lionzxy.fastlogblock.io.filesplitter.IFileSplitter;
56

67
import java.io.File;
@@ -19,7 +20,7 @@ public File[] getAllLogFile() {
1920
}
2021

2122
@Override
22-
public File getFileByPos(final BlockPos blockPos) {
23+
public File getFileByPosAndWorld(final BlockPos blockPos, World world) {
2324
return logFile;
2425
}
2526
}

0 commit comments

Comments
 (0)