forked from LogBlock/LogBlock
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:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user