Skip to content

Commit ac61276

Browse files
committed
Add runnable and test for this
1 parent d3ebf55 commit ac61276

File tree

18 files changed

+279
-41
lines changed

18 files changed

+279
-41
lines changed

src/main/java/ru/lionzxy/fastlogblock/FastLogBlock.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,24 @@
88
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
99
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
1010
import ru.lionzxy.fastlogblock.config.LogConfig;
11-
import ru.lionzxy.fastlogblock.io.WriteRunnable;
1211
import ru.lionzxy.fastlogblock.models.BlockChangeEventModel;
1312

1413
import java.io.File;
1514
import java.io.IOException;
1615

1716
@Mod(modid = FastLogBlock.MODID, version = FastLogBlock.VERSION)
1817
public class FastLogBlock {
19-
@Mod.Instance
20-
public static FastLogBlock fastLogBlock;
2118
public static final File rootMinecraftPath = new File("./");
22-
public File logFolderFile;
2319
public static final String MODID = "fastlogblock";
2420
public static final String VERSION = "1.0";
21+
@Mod.Instance
22+
public static FastLogBlock fastLogBlock;
23+
public File logFolderFile;
2524

2625
@EventHandler
2726
public void init(final FMLInitializationEvent event) throws IOException {
2827
logFolderFile = new File(rootMinecraftPath, LogConfig.logFolderPath);
2928
FMLLog.log.info("FullPath: " + logFolderFile.getAbsolutePath());
30-
final WriteRunnable writeRunnable = new WriteRunnable();
3129
MinecraftForge.EVENT_BUS.register(this);
3230
}
3331

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,18 @@
1414
public class LogConfig {
1515
@Config.Comment("Filepath from minecraft root folder to block log path")
1616
public static final String logFolderPath = "./blocklog/";
17-
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();
1820
@Config.Comment("File splitter type. SINGLE for single-file strategy, BLOCKHASH for file=HASH(BlockPos) strategy")
1921
public static FileSplitterEnum fileSplitterType = FileSplitterEnum.BLOCKHASH;
20-
2122
@Config.Comment("Utils information for migration")
2223
public static int logSchemeVersion = 1;
23-
24-
@Config.Comment("Path to mapper file from logFolderPath")
25-
public static final String nickToIntFilePath = "nicktoid.prop";
26-
2724
@Config.Comment("Path to mapper file from logFolderPath")
2825
public static String blockToIntFilePath = "blocktoid.prop";
29-
3026
@Config.Comment("Regular expression for block change event ignore")
3127
public static String[] ignoreBlockNamesRegExp = new String[]{"<minecraft:tallgrass:*>"};
3228

33-
public static final HashConfig HASH_CONFIG = new HashConfig();
34-
3529
public static class HashConfig {
3630
@Config.Comment("Max logfile count")
3731
public final int fileCount = 16;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package ru.lionzxy.fastlogblock.io;
2+
3+
import ru.lionzxy.fastlogblock.io.filesplitter.IFileSplitter;
4+
import ru.lionzxy.fastlogblock.io.log.LogReader;
5+
import ru.lionzxy.fastlogblock.io.mappers.BlockMapper;
6+
import ru.lionzxy.fastlogblock.io.mappers.NickMapper;
7+
import ru.lionzxy.fastlogblock.models.BlockChangeEventModel;
8+
import ru.lionzxy.fastlogblock.models.FindTask;
9+
10+
import java.io.File;
11+
import java.util.List;
12+
import java.util.concurrent.BlockingQueue;
13+
import java.util.concurrent.LinkedBlockingQueue;
14+
import java.util.concurrent.atomic.AtomicBoolean;
15+
16+
public class ReadRunnable implements Runnable {
17+
private final BlockingQueue<FindTask> findTasks = new LinkedBlockingQueue<>();
18+
private final NickMapper nickMapper;
19+
private final BlockMapper blockMapper;
20+
private final IFileSplitter fileSplitter;
21+
private final AtomicBoolean withoutWork = new AtomicBoolean(true);
22+
23+
public ReadRunnable(final IFileSplitter fileSplitter, final NickMapper nickMapper, final BlockMapper blockMapper) {
24+
this.nickMapper = nickMapper;
25+
this.blockMapper = blockMapper;
26+
this.fileSplitter = fileSplitter;
27+
}
28+
29+
@Override
30+
public void run() {
31+
while (!Thread.currentThread().isInterrupted()) {
32+
try {
33+
final FindTask findTask = findTasks.take();
34+
withoutWork.set(false);
35+
final File file = fileSplitter.getFileByPos(findTask.getBlockPos());
36+
final LogReader logReader = new LogReader(file, blockMapper, nickMapper);
37+
final List<BlockChangeEventModel> blockChangeEventModels = logReader.readEventByPos(findTask.getBlockPos());
38+
findTask.getFindListener().onResultAsync(blockChangeEventModels);
39+
} catch (Exception e) {
40+
e.printStackTrace();
41+
}
42+
withoutWork.set(true);
43+
}
44+
}
45+
46+
public void addTaskForSearch(FindTask findTask) {
47+
findTasks.add(findTask);
48+
}
49+
50+
public boolean isEmpty() {
51+
return findTasks.isEmpty() && withoutWork.get();
52+
}
53+
}
Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,68 @@
11
package ru.lionzxy.fastlogblock.io;
22

3-
import ru.lionzxy.fastlogblock.FastLogBlock;
4-
import ru.lionzxy.fastlogblock.config.LogConfig;
3+
import ru.lionzxy.fastlogblock.io.filesplitter.IFileSplitter;
4+
import ru.lionzxy.fastlogblock.io.log.LogWritter;
5+
import ru.lionzxy.fastlogblock.io.mappers.BlockMapper;
56
import ru.lionzxy.fastlogblock.io.mappers.NickMapper;
7+
import ru.lionzxy.fastlogblock.models.BlockChangeEventModel;
68

79
import java.io.File;
810
import java.io.IOException;
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
import java.util.concurrent.BlockingQueue;
14+
import java.util.concurrent.LinkedBlockingQueue;
15+
import java.util.concurrent.atomic.AtomicBoolean;
916

1017
public class WriteRunnable implements Runnable {
18+
private final BlockingQueue<BlockChangeEventModel> eventQueue = new LinkedBlockingQueue<>();
19+
private final Map<File, LogWritter> writterMap = new HashMap<>();
20+
private final NickMapper nickMapper;
21+
private final BlockMapper blockMapper;
22+
private final IFileSplitter fileSplitter;
23+
private final AtomicBoolean withoutWork = new AtomicBoolean(true);
1124

12-
public WriteRunnable() throws IOException {
13-
NickMapper nickMapper = new NickMapper(new File(FastLogBlock.fastLogBlock.logFolderFile,
14-
LogConfig.nickToIntFilePath));
15-
//nickMapper.putNewUser(new ASCIString("LionZXY"));
16-
nickMapper.sync();
25+
public WriteRunnable(final IFileSplitter fileSplitter, final NickMapper nickMapper, final BlockMapper blockMapper) {
26+
this.nickMapper = nickMapper;
27+
this.blockMapper = blockMapper;
28+
this.fileSplitter = fileSplitter;
1729
}
1830

1931
@Override
2032
public void run() {
33+
while (!Thread.currentThread().isInterrupted()) {
34+
try {
35+
do {
36+
final BlockChangeEventModel event = eventQueue.take();
37+
withoutWork.set(false);
38+
final File file = fileSplitter.getFileByPos(event.getBlockPos());
39+
LogWritter writter = writterMap.get(file);
40+
if (writter == null) {
41+
writter = new LogWritter(file, blockMapper, nickMapper);
42+
writterMap.put(file, writter);
43+
}
44+
writter.putEvent(event);
45+
} while (!eventQueue.isEmpty());
2146

47+
writterMap.values().forEach(it -> {
48+
try {
49+
it.sync();
50+
} catch (IOException e) {
51+
e.printStackTrace();
52+
}
53+
});
54+
withoutWork.set(true);
55+
} catch (Exception e) {
56+
e.printStackTrace();
57+
}
58+
}
59+
}
60+
61+
public void putEvent(BlockChangeEventModel blockChangeEventModel) {
62+
eventQueue.add(blockChangeEventModel);
63+
}
64+
65+
public boolean isEmpty() {
66+
return eventQueue.isEmpty() && withoutWork.get();
2267
}
2368
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ public BlockHashFileSplitter(final File modFolder) {
1515
super(modFolder);
1616
}
1717

18+
private static int hashByBlock(final BlockPos blockPos) {
19+
final int signedHash = ((blockPos.getX() * MAGIC_HASH_NUMBER +
20+
blockPos.getY()) * MAGIC_HASH_NUMBER +
21+
blockPos.getZ()) * MAGIC_HASH_NUMBER;
22+
final int hash = Math.abs(signedHash) % LogConfig.HASH_CONFIG.fileCount;
23+
return hash < 0 ? 0 : hash;
24+
}
25+
1826
@Override
1927
public File[] getAllLogFile() {
2028
final List<File> fileList = new ArrayList<>(LogConfig.HASH_CONFIG.fileCount);
@@ -31,13 +39,5 @@ public File getFileByPos(final BlockPos blockPos) {
3139
return new File(String.format(LogConfig.HASH_CONFIG.fileNamePattern, hashByBlock(blockPos)));
3240
}
3341

34-
private static int hashByBlock(final BlockPos blockPos) {
35-
final int signedHash = ((blockPos.getX() * MAGIC_HASH_NUMBER +
36-
blockPos.getY()) * MAGIC_HASH_NUMBER +
37-
blockPos.getZ()) * MAGIC_HASH_NUMBER;
38-
final int hash = Math.abs(signedHash) % LogConfig.HASH_CONFIG.fileCount;
39-
return hash < 0 ? 0 : hash;
40-
}
41-
4242

4343
}

src/main/java/ru/lionzxy/fastlogblock/io/log/LogReader.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import ru.lionzxy.fastlogblock.io.mappers.NickMapper;
1515
import ru.lionzxy.fastlogblock.models.ASCIString;
1616
import ru.lionzxy.fastlogblock.models.BlockChangeEventModel;
17+
import ru.lionzxy.fastlogblock.models.BlockChangeType;
1718
import ru.lionzxy.fastlogblock.models.PrepareReadBlockChangeEvent;
1819
import ru.lionzxy.fastlogblock.utils.CollectionUtils;
1920
import ru.lionzxy.fastlogblock.utils.Constants;
@@ -38,7 +39,8 @@ public LogReader(final File file, final BlockMapper blockMapper, final NickMappe
3839

3940

4041
public List<BlockChangeEventModel> readEventByPos(final BlockPos blockPos) throws IOException {
41-
FMLLog.log.warn("readEventByPos() has very long execution time!");
42+
FMLLog.log.info("readEventByPos() for has very long execution time! Start measuring...");
43+
long time = System.currentTimeMillis();
4244

4345
final int needPosX = blockPos.getX();
4446
final int needPosY = blockPos.getY();
@@ -63,6 +65,7 @@ public List<BlockChangeEventModel> readEventByPos(final BlockPos blockPos) throw
6365
final TIntObjectMap<ASCIString> idToNick = CollectionUtils.toHashMap(needNickName, id -> nickMapper.getById(id));
6466
final TLongObjectMap<ASCIString> idToBlock = blockMapper.idsToNames(needBlockName);
6567

68+
FMLLog.log.info("readEventByPos(): " + (System.currentTimeMillis() - time) + "ms");
6669
return prepareEvents.stream().map(pE -> pE.toBlockChangeEventModel(idToNick, idToBlock)).collect(Collectors.toList());
6770
}
6871

src/main/java/ru/lionzxy/fastlogblock/io/log/LogWritter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
import java.nio.ByteBuffer;
1414

1515
public class LogWritter {
16-
private BufferedOutputStream os;
1716
private final BlockMapper blockMapper;
1817
private final NickMapper nickMapper;
1918
private final File file;
19+
private BufferedOutputStream os;
2020

2121
public LogWritter(final File file, final BlockMapper blockMapper, final NickMapper nickMapper) throws IOException {
2222
this.file = file;

src/main/java/ru/lionzxy/fastlogblock/io/mappers/BlockMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public TLongObjectMap<ASCIString> idsToNames(final TLongSet longSet) {
108108
try {
109109
readWriteLock.readLock().lock();
110110
blockToId.forEachEntry((blockname, id) -> {
111-
if(!longSet.contains(id)){
111+
if (!longSet.contains(id)) {
112112
return true;
113113
}
114114
toReturn.put(id, (ASCIString) blockname);

src/main/java/ru/lionzxy/fastlogblock/models/ASCIString.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import java.nio.charset.Charset;
44

55
public class ASCIString implements CharSequence {
6+
private final static Charset asci = Charset.forName("ASCII");
67
private final byte[] shortString;
78
private int hashcode = -1;
8-
private final static Charset asci = Charset.forName("ASCII");
99

1010
public ASCIString(final byte[] fatString) {
1111
shortString = fatString;

src/main/java/ru/lionzxy/fastlogblock/models/BlockChangeEventModel.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import net.minecraft.util.ResourceLocation;
55
import net.minecraft.util.math.BlockPos;
66
import net.minecraftforge.event.world.BlockEvent;
7-
import ru.lionzxy.fastlogblock.io.log.BlockChangeType;
87

98
import java.sql.Timestamp;
109

@@ -75,6 +74,10 @@ public int getPosZ() {
7574
return posZ;
7675
}
7776

77+
public BlockPos getBlockPos() {
78+
return new BlockPos(posX, posY, posZ);
79+
}
80+
7881
public ASCIString getNameblock() {
7982
return nameblock;
8083
}

0 commit comments

Comments
 (0)