Switch the block queue to cache blocks locally, then upload, to reduce lag when snapshotting.
This commit is contained in:
parent
c19e971e92
commit
c6e6ed9ffe
4 changed files with 68 additions and 2 deletions
|
@ -53,7 +53,7 @@ mod_name=Zontreck's Library Mod
|
||||||
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
|
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
|
||||||
mod_license=GPLv3
|
mod_license=GPLv3
|
||||||
# The mod version. See https://semver.org/
|
# The mod version. See https://semver.org/
|
||||||
mod_version=1201.13.042524.0327
|
mod_version=1201.13.042524.0409
|
||||||
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
|
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
|
||||||
# This should match the base package used for the mod sources.
|
# This should match the base package used for the mod sources.
|
||||||
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
|
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
|
||||||
|
|
|
@ -24,6 +24,7 @@ public abstract class BlockRestoreQueue
|
||||||
private List<PrimitiveBlock> BLOCK_QUEUE = new ArrayList<>();
|
private List<PrimitiveBlock> BLOCK_QUEUE = new ArrayList<>();
|
||||||
private final BlockRestoreRunner RUNNER;
|
private final BlockRestoreRunner RUNNER;
|
||||||
private ScheduledFuture<?> RUNNING_TASK;
|
private ScheduledFuture<?> RUNNING_TASK;
|
||||||
|
private ScheduledFuture<?> DATABASE_UPLOAD_RUNNER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When in database mode, this flag will be checked by the Restore Runner so a database call is not made unnecessarily.
|
* When in database mode, this flag will be checked by the Restore Runner so a database call is not made unnecessarily.
|
||||||
|
@ -75,13 +76,14 @@ public abstract class BlockRestoreQueue
|
||||||
*/
|
*/
|
||||||
public void enqueueBlock(PrimitiveBlock block)
|
public void enqueueBlock(PrimitiveBlock block)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
if(usesDatabase())
|
if(usesDatabase())
|
||||||
{
|
{
|
||||||
databaseUpdate(block);
|
databaseUpdate(block);
|
||||||
notifyDirtyQueue(true);
|
notifyDirtyQueue(true);
|
||||||
hasBlocks=true;
|
hasBlocks=true;
|
||||||
return;
|
return;
|
||||||
}
|
}*/
|
||||||
BLOCK_QUEUE.add(block);
|
BLOCK_QUEUE.add(block);
|
||||||
|
|
||||||
notifyDirtyQueue(true);
|
notifyDirtyQueue(true);
|
||||||
|
@ -94,6 +96,7 @@ public abstract class BlockRestoreQueue
|
||||||
public void databaseUpdate(PrimitiveBlock block)
|
public void databaseUpdate(PrimitiveBlock block)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
hasBlocks=true;
|
||||||
PreparedStatement pstmt = null;
|
PreparedStatement pstmt = null;
|
||||||
try {
|
try {
|
||||||
pstmt = DatabaseWrapper.get().prepareStatement("INSERT INTO `blocks` (queueName, posX, posY, posZ, snapshotID, block) VALUES (?, ?, ?, ?, ?, ?);");
|
pstmt = DatabaseWrapper.get().prepareStatement("INSERT INTO `blocks` (queueName, posX, posY, posZ, snapshotID, block) VALUES (?, ?, ?, ?, ?, ?);");
|
||||||
|
@ -256,6 +259,10 @@ public abstract class BlockRestoreQueue
|
||||||
public void schedule(long interval, TimeUnit unit)
|
public void schedule(long interval, TimeUnit unit)
|
||||||
{
|
{
|
||||||
RUNNING_TASK = LibZontreck.executor.scheduleAtFixedRate(RUNNER, 2000, interval, unit);
|
RUNNING_TASK = LibZontreck.executor.scheduleAtFixedRate(RUNNER, 2000, interval, unit);
|
||||||
|
|
||||||
|
DATABASE_UPLOAD_RUNNER = LibZontreck.executor.scheduleAtFixedRate(new DatabaseUploadRunner(this), 2000, 250, TimeUnit.MILLISECONDS);
|
||||||
|
|
||||||
|
isCancelled=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -263,9 +270,29 @@ public abstract class BlockRestoreQueue
|
||||||
*/
|
*/
|
||||||
public void cancel()
|
public void cancel()
|
||||||
{
|
{
|
||||||
|
isCancelled=true;
|
||||||
RUNNING_TASK.cancel(false);
|
RUNNING_TASK.cancel(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isCancelled=false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a block from the local queue. This does not impact the database and is used internally
|
||||||
|
* @param block
|
||||||
|
*/
|
||||||
|
public void dequeue(PrimitiveBlock block)
|
||||||
|
{
|
||||||
|
BLOCK_QUEUE.remove(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cancels the repeating upload to database task. This is automatically invoked when cancel has been invoked, and no more tasks are to be uploaded.
|
||||||
|
*/
|
||||||
|
public void cancelUploader()
|
||||||
|
{
|
||||||
|
DATABASE_UPLOAD_RUNNER.cancel(true);
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onServerStopping(ServerStoppingEvent event)
|
public void onServerStopping(ServerStoppingEvent event)
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package dev.zontreck.libzontreck.memory.world;
|
||||||
|
|
||||||
|
public class DatabaseUploadRunner implements Runnable {
|
||||||
|
private BlockRestoreQueue QUEUE;
|
||||||
|
public DatabaseUploadRunner(BlockRestoreQueue queue)
|
||||||
|
{
|
||||||
|
QUEUE = queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if(QUEUE.getQueuedBlocks() == 0)
|
||||||
|
{
|
||||||
|
if(QUEUE.isCancelled)
|
||||||
|
{
|
||||||
|
QUEUE.cancelUploader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PrimitiveBlock block = QUEUE.getQueue().get(0);
|
||||||
|
QUEUE.dequeue(block);
|
||||||
|
|
||||||
|
QUEUE.databaseUpdate(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,4 +29,17 @@ public class TagUtils
|
||||||
if(tag.contains(entry)) return tag.getString(entry);
|
if(tag.contains(entry)) return tag.getString(entry);
|
||||||
else return other;
|
else return other;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get either the entry, or supply a default value
|
||||||
|
* @param tag
|
||||||
|
* @param entry
|
||||||
|
* @param other
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean boolOr(CompoundTag tag, String entry, boolean other)
|
||||||
|
{
|
||||||
|
if(tag.contains(entry)) return tag.getBoolean(entry);
|
||||||
|
else return other;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue