improve rollbacks

- allow rollbacking up to 10k row/tick if the max editing time is not
exceeded
- better show percentages of long rollbacks
This commit is contained in:
Brokkonaut
2024-09-19 23:04:07 +02:00
parent 10b5bc8913
commit 0d04823ae1

View File

@@ -35,6 +35,7 @@ import java.io.File;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.text.NumberFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -53,6 +54,8 @@ import static de.diddiz.LogBlock.util.BukkitUtils.*;
public class WorldEditor implements Runnable { public class WorldEditor implements Runnable {
private final LogBlock logblock; private final LogBlock logblock;
private final ArrayList<Edit> edits = new ArrayList<>(); private final ArrayList<Edit> edits = new ArrayList<>();
private int rowsCompleted;
private int totalRows;
private final World world; private final World world;
/** /**
@@ -135,6 +138,7 @@ public class WorldEditor implements Runnable {
} }
started = true; started = true;
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
totalRows = edits.size();
taskID = logblock.getServer().getScheduler().scheduleSyncRepeatingTask(logblock, this, 0, 1); taskID = logblock.getServer().getScheduler().scheduleSyncRepeatingTask(logblock, this, 0, 1);
if (taskID == -1) { if (taskID == -1) {
throw new Exception("Failed to schedule task"); throw new Exception("Failed to schedule task");
@@ -151,8 +155,9 @@ public class WorldEditor implements Runnable {
public synchronized void run() { public synchronized void run() {
final List<WorldEditorException> errorList = new ArrayList<>(); final List<WorldEditorException> errorList = new ArrayList<>();
int counter = 0; int counter = 0;
float size = edits.size(); long t0 = System.nanoTime();
while (!edits.isEmpty() && counter < 100) { long maxEditTime = 5_000_000; // 5 ms
while (!edits.isEmpty() && counter < 10000 && (counter < 100 || counter % 10 != 0 || System.nanoTime() - t0 < maxEditTime)) {
try { try {
switch (edits.remove(edits.size() - 1).perform()) { switch (edits.remove(edits.size() - 1).perform()) {
case SUCCESS: case SUCCESS:
@@ -169,11 +174,12 @@ public class WorldEditor implements Runnable {
} catch (final Exception ex) { } catch (final Exception ex) {
logblock.getLogger().log(Level.WARNING, "[WorldEditor] Exeption: ", ex); logblock.getLogger().log(Level.WARNING, "[WorldEditor] Exeption: ", ex);
} }
rowsCompleted++;
counter++; counter++;
if (sender != null) { if (sender != null) {
float percentage = ((size - edits.size()) / size) * 100.0F; float percentage = rowsCompleted * 100.0f / totalRows;
if (percentage % 20 == 0) { if (rowsCompleted % 10000 == 0) {
sender.sendMessage(ChatColor.GOLD + "[LogBlock]" + ChatColor.YELLOW + " Rollback progress: " + percentage + "%" + sender.sendMessage(ChatColor.GOLD + "[LogBlock]" + ChatColor.YELLOW + " Rollback progress: " + NumberFormat.getNumberInstance().format(percentage) + "%" +
" Blocks edited: " + counter); " Blocks edited: " + counter);
} }
} }