Return-Path: X-Original-To: apmail-hbase-commits-archive@www.apache.org Delivered-To: apmail-hbase-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 61F0E18E87 for ; Thu, 25 Feb 2016 18:55:07 +0000 (UTC) Received: (qmail 9849 invoked by uid 500); 25 Feb 2016 18:55:01 -0000 Delivered-To: apmail-hbase-commits-archive@hbase.apache.org Received: (qmail 9808 invoked by uid 500); 25 Feb 2016 18:55:01 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 9795 invoked by uid 99); 25 Feb 2016 18:55:01 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 25 Feb 2016 18:55:01 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id B26E7E8F11; Thu, 25 Feb 2016 18:55:00 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: mbertozzi@apache.org To: commits@hbase.apache.org Date: Thu, 25 Feb 2016 18:55:00 -0000 Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: [1/2] hbase git commit: HBASE-15144 Procedure v2 - Web UI displaying Store state Repository: hbase Updated Branches: refs/heads/branch-1 7c290e922 -> 210ed9768 refs/heads/master 77133fd22 -> 40c55915e HBASE-15144 Procedure v2 - Web UI displaying Store state Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/40c55915 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/40c55915 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/40c55915 Branch: refs/heads/master Commit: 40c55915e7a45a639adb7f7a370a04f38058ac26 Parents: 77133fd Author: Samir Ahmic Authored: Wed Feb 24 16:05:24 2016 +0100 Committer: Matteo Bertozzi Committed: Thu Feb 25 10:46:56 2016 -0800 ---------------------------------------------------------------------- .../procedure2/store/wal/ProcedureWALFile.java | 32 +++-- .../store/wal/ProcedureWALFormat.java | 9 +- .../store/wal/ProcedureWALFormatReader.java | 8 +- .../procedure2/store/wal/WALProcedureStore.java | 108 +++++++++++++---- .../org/apache/hadoop/hbase/master/HMaster.java | 8 +- .../hbase-webapps/master/procedures.jsp | 118 ++++++++++++++++++- 6 files changed, 244 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/40c55915/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.java ---------------------------------------------------------------------- diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.java index 6493526..097cd29 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.java @@ -22,12 +22,12 @@ import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hbase.classification.InterfaceAudience; -import org.apache.hadoop.hbase.classification.InterfaceStability; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hbase.classification.InterfaceAudience; +import org.apache.hadoop.hbase.classification.InterfaceStability; import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker; import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureWALHeader; import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureWALTrailer; @@ -42,24 +42,29 @@ public class ProcedureWALFile implements Comparable { private ProcedureWALHeader header; private FSDataInputStream stream; - private FileStatus logStatus; private FileSystem fs; private Path logFile; private long startPos; private long minProcId; private long maxProcId; + private long logSize; + private long timestamp; public ProcedureWALFile(final FileSystem fs, final FileStatus logStatus) { this.fs = fs; - this.logStatus = logStatus; this.logFile = logStatus.getPath(); + this.logSize = logStatus.getLen(); + this.timestamp = logStatus.getModificationTime(); } - public ProcedureWALFile(FileSystem fs, Path logFile, ProcedureWALHeader header, long startPos) { + public ProcedureWALFile(FileSystem fs, Path logFile, ProcedureWALHeader header, + long startPos, long timestamp) { this.fs = fs; - this.logFile = logFile; this.header = header; + this.logFile = logFile; this.startPos = startPos; + this.logSize = startPos; + this.timestamp = timestamp; } public void open() throws IOException { @@ -77,7 +82,7 @@ public class ProcedureWALFile implements Comparable { public ProcedureWALTrailer readTrailer() throws IOException { try { - return ProcedureWALFormat.readTrailer(stream, startPos, logStatus.getLen()); + return ProcedureWALFormat.readTrailer(stream, startPos, logSize); } finally { stream.seek(startPos); } @@ -112,6 +117,10 @@ public class ProcedureWALFile implements Comparable { return header; } + public long getTimestamp() { + return timestamp; + } + public boolean isCompacted() { return header.getType() == ProcedureWALFormat.LOG_TYPE_COMPACTED; } @@ -121,7 +130,14 @@ public class ProcedureWALFile implements Comparable { } public long getSize() { - return logStatus != null ? logStatus.getLen() : 0; + return logSize; + } + + /** + * Used to update in-progress log sizes. the FileStatus will report 0 otherwise. + */ + void addToSize(long size) { + this.logSize += size; } public void removeFile() throws IOException { http://git-wip-us.apache.org/repos/asf/hbase/blob/40c55915/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormat.java ---------------------------------------------------------------------- diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormat.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormat.java index 2b393c0..add7d03 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormat.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormat.java @@ -23,14 +23,14 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Iterator; -import org.apache.hadoop.hbase.classification.InterfaceAudience; -import org.apache.hadoop.hbase.classification.InterfaceStability; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; +import org.apache.hadoop.hbase.classification.InterfaceAudience; +import org.apache.hadoop.hbase.classification.InterfaceStability; import org.apache.hadoop.hbase.io.util.StreamUtils; import org.apache.hadoop.hbase.procedure2.Procedure; -import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker; import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureLoader; +import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker; import org.apache.hadoop.hbase.procedure2.util.ByteSlot; import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureWALEntry; import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureWALHeader; @@ -113,7 +113,7 @@ public final class ProcedureWALFormat { * | offset |-----+ * +-----------------+ */ - public static void writeTrailer(FSDataOutputStream stream, ProcedureStoreTracker tracker) + public static long writeTrailer(FSDataOutputStream stream, ProcedureStoreTracker tracker) throws IOException { long offset = stream.getPos(); @@ -128,6 +128,7 @@ public final class ProcedureWALFormat { stream.write(TRAILER_VERSION); StreamUtils.writeLong(stream, TRAILER_MAGIC); StreamUtils.writeLong(stream, offset); + return stream.getPos() - offset; } public static ProcedureWALHeader readHeader(InputStream stream) http://git-wip-us.apache.org/repos/asf/hbase/blob/40c55915/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.java ---------------------------------------------------------------------- diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.java index 73bd7bc..312eedb 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.java @@ -23,15 +23,17 @@ import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.FSDataInputStream; +import org.apache.hadoop.hbase.ProcedureInfo; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.classification.InterfaceStability; -import org.apache.hadoop.hbase.ProcedureInfo; import org.apache.hadoop.hbase.procedure2.Procedure; -import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker; import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator; +import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker; import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureWALEntry; +import com.google.protobuf.InvalidProtocolBufferException; + /** * Helper class that loads the procedures stored in a WAL */ @@ -142,7 +144,7 @@ public class ProcedureWALFormatReader { throw new CorruptedWALProcedureStoreException("Invalid entry: " + entry); } } - } catch (IOException e) { + } catch (InvalidProtocolBufferException e) { LOG.error("got an exception while reading the procedure WAL: " + log, e); loader.markCorruptedWAL(log, e); } http://git-wip-us.apache.org/repos/asf/hbase/blob/40c55915/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.java ---------------------------------------------------------------------- diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.java index 280c6ca..5ac421c 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.java @@ -18,23 +18,24 @@ package org.apache.hadoop.hbase.procedure2.store.wal; -import java.io.IOException; import java.io.FileNotFoundException; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.AtomicReference; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.LinkedTransferQueue; -import java.util.concurrent.TimeUnit; -import java.util.Arrays; +import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.Set; +import java.util.concurrent.LinkedTransferQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; +import org.apache.commons.collections.buffer.CircularFifoBuffer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -98,6 +99,10 @@ public class WALProcedureStore extends ProcedureStoreBase { private static final String ROLL_THRESHOLD_CONF_KEY = "hbase.procedure.store.wal.roll.threshold"; private static final long DEFAULT_ROLL_THRESHOLD = 32 * 1024 * 1024; // 32M + private static final String STORE_WAL_SYNC_STATS_COUNT = + "hbase.procedure.store.wal.sync.stats.count"; + private static final int DEFAULT_SYNC_STATS_COUNT = 10; + private final LinkedList logs = new LinkedList(); private final ProcedureStoreTracker storeTracker = new ProcedureStoreTracker(); private final ReentrantLock lock = new ReentrantLock(); @@ -133,6 +138,37 @@ public class WALProcedureStore extends ProcedureStoreBase { private boolean useHsync; private int syncWaitMsec; + // Variables used for UI display + private CircularFifoBuffer syncMetricsBuffer; + + public static class SyncMetrics { + private long timestamp; + private long syncWaitMs; + private long totalSyncedBytes; + private int syncedEntries; + private float syncedPerSec; + + public long getTimestamp() { + return timestamp; + } + + public long getSyncWaitMs() { + return syncWaitMs; + } + + public long getTotalSyncedBytes() { + return totalSyncedBytes; + } + + public long getSyncedEntries() { + return syncedEntries; + } + + public float getSyncedPerSec() { + return syncedPerSec; + } + } + public WALProcedureStore(final Configuration conf, final FileSystem fs, final Path logDir, final LeaseRecovery leaseRecovery) { this.fs = fs; @@ -166,6 +202,10 @@ public class WALProcedureStore extends ProcedureStoreBase { syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC); useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC); + // WebUI + syncMetricsBuffer = new CircularFifoBuffer( + conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT)); + // Init sync thread syncThread = new Thread("WALProcedureStoreSyncThread") { @Override @@ -509,6 +549,7 @@ public class WALProcedureStore extends ProcedureStoreBase { } private void syncLoop() throws Throwable { + long totalSyncedToStore = 0; inSync.set(false); lock.lock(); try { @@ -533,23 +574,37 @@ public class WALProcedureStore extends ProcedureStoreBase { continue; } } - // Wait SYNC_WAIT_MSEC or the signal of "slots full" before flushing - long syncWaitSt = System.currentTimeMillis(); + final long syncWaitSt = System.currentTimeMillis(); if (slotIndex != slots.length) { slotCond.await(syncWaitMsec, TimeUnit.MILLISECONDS); } - long syncWaitMs = System.currentTimeMillis() - syncWaitSt; + + final long currentTs = System.currentTimeMillis(); + final long syncWaitMs = currentTs - syncWaitSt; + final float rollSec = getMillisFromLastRoll() / 1000.0f; + final float syncedPerSec = totalSyncedToStore / rollSec; if (LOG.isTraceEnabled() && (syncWaitMs > 10 || slotIndex < slots.length)) { - float rollSec = getMillisFromLastRoll() / 1000.0f; LOG.trace(String.format("Sync wait %s, slotIndex=%s , totalSynced=%s (%s/sec)", StringUtils.humanTimeDiff(syncWaitMs), slotIndex, - StringUtils.humanSize(totalSynced.get()), - StringUtils.humanSize(totalSynced.get() / rollSec))); + StringUtils.humanSize(totalSyncedToStore), + StringUtils.humanSize(syncedPerSec))); } + // update webui circular buffers (TODO: get rid of allocations) + final SyncMetrics syncMetrics = new SyncMetrics(); + syncMetrics.timestamp = currentTs; + syncMetrics.syncWaitMs = syncWaitMs; + syncMetrics.syncedEntries = slotIndex; + syncMetrics.totalSyncedBytes = totalSyncedToStore; + syncMetrics.syncedPerSec = syncedPerSec; + syncMetricsBuffer.add(syncMetrics); + + // sync inSync.set(true); - totalSynced.addAndGet(syncSlots()); + long slotSize = syncSlots(); + logs.getLast().addToSize(slotSize); + totalSyncedToStore = totalSynced.addAndGet(slotSize); slotIndex = 0; inSync.set(false); } catch (InterruptedException e) { @@ -569,6 +624,15 @@ public class WALProcedureStore extends ProcedureStoreBase { } } + public ArrayList getSyncMetrics() { + lock.lock(); + try { + return new ArrayList(syncMetricsBuffer); + } finally { + lock.unlock(); + } + } + private long syncSlots() throws Throwable { int retry = 0; int logRolled = 0; @@ -647,14 +711,14 @@ public class WALProcedureStore extends ProcedureStoreBase { } } - private long getMillisToNextPeriodicRoll() { + public long getMillisToNextPeriodicRoll() { if (lastRollTs.get() > 0 && periodicRollMsec > 0) { return periodicRollMsec - getMillisFromLastRoll(); } return Long.MAX_VALUE; } - private long getMillisFromLastRoll() { + public long getMillisFromLastRoll() { return (System.currentTimeMillis() - lastRollTs.get()); } @@ -761,8 +825,9 @@ public class WALProcedureStore extends ProcedureStoreBase { stream = newStream; flushLogId = logId; totalSynced.set(0); - lastRollTs.set(System.currentTimeMillis()); - logs.add(new ProcedureWALFile(fs, newLogFile, header, startPos)); + long rollTs = System.currentTimeMillis(); + lastRollTs.set(rollTs); + logs.add(new ProcedureWALFile(fs, newLogFile, header, startPos, rollTs)); if (LOG.isDebugEnabled()) { LOG.debug("Roll new state log: " + logId); @@ -776,7 +841,8 @@ public class WALProcedureStore extends ProcedureStoreBase { try { ProcedureWALFile log = logs.getLast(); log.setProcIds(storeTracker.getUpdatedMinProcId(), storeTracker.getUpdatedMaxProcId()); - ProcedureWALFormat.writeTrailer(stream, storeTracker); + long trailerSize = ProcedureWALFormat.writeTrailer(stream, storeTracker); + log.addToSize(trailerSize); } catch (IOException e) { LOG.warn("Unable to write the trailer: " + e.getMessage()); } http://git-wip-us.apache.org/repos/asf/hbase/blob/40c55915/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 3cf750e..5d8c325 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -336,7 +336,7 @@ public class HMaster extends HRegionServer implements MasterServices { // handle table states private TableStateManager tableStateManager; - + private long splitPlanCount; private long mergePlanCount; @@ -2159,6 +2159,10 @@ public class HMaster extends HRegionServer implements MasterServices { return procedureStore != null ? procedureStore.getActiveLogs().size() : 0; } + public WALProcedureStore getWalProcedureStore() { + return procedureStore; + } + public int getRegionServerInfoPort(final ServerName sn) { RegionServerInfo info = this.regionServerTracker.getRegionServerInfo(sn); if (info == null || info.getInfoPort() == 0) { @@ -2358,7 +2362,7 @@ public class HMaster extends HRegionServer implements MasterServices { } return regionStates.getAverageLoad(); } - + /* * @return the count of region split plans executed */ http://git-wip-us.apache.org/repos/asf/hbase/blob/40c55915/hbase-server/src/main/resources/hbase-webapps/master/procedures.jsp ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/resources/hbase-webapps/master/procedures.jsp b/hbase-server/src/main/resources/hbase-webapps/master/procedures.jsp index 443d9d6..eb5ea39 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/procedures.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/procedures.jsp @@ -21,18 +21,31 @@ import="static org.apache.commons.lang.StringEscapeUtils.escapeXml" import="java.util.Collections" import="java.util.Comparator" + import="java.util.ArrayList" import="java.util.Date" import="java.util.List" + import="java.util.Set" + import="org.apache.hadoop.conf.Configuration" import="org.apache.hadoop.hbase.HBaseConfiguration" import="org.apache.hadoop.hbase.ProcedureInfo" import="org.apache.hadoop.hbase.master.HMaster" import="org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv" import="org.apache.hadoop.hbase.procedure2.ProcedureExecutor" + import="org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALFile" + import="org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore" + import="org.apache.hadoop.hbase.procedure2.util.StringUtils" + %> <% HMaster master = (HMaster)getServletContext().getAttribute(HMaster.MASTER); ProcedureExecutor procExecutor = master.getMasterProcedureExecutor(); + WALProcedureStore walStore = master.getWalProcedureStore(); + ArrayList syncMetricsBuff = walStore.getSyncMetrics(); + long millisToNextRoll = walStore.getMillisToNextPeriodicRoll(); + long millisFromLastRoll = walStore.getMillisFromLastRoll(); + ArrayList procedureWALFiles = walStore.getActiveLogs(); + Set corruptedWALFiles = walStore.getCorruptedLogs(); List procedures = procExecutor.listProcedures(); Collections.sort(procedures, new Comparator() { @Override @@ -118,7 +131,110 @@ <% } %> - +
+
+
+ +
+
+ +
+
+ <% if (procedureWALFiles != null && procedureWALFiles.size() > 0) { %> + + + + + + + + <% for (int i = procedureWALFiles.size() - 1; i >= 0; --i) { %> + <% ProcedureWALFile pwf = procedureWALFiles.get(i); %> + + + + + + <% } %> +
LogIDSizeTimestampPath
<%= pwf.getLogId() %> <%= StringUtils.humanSize(pwf.getSize()) %> <%= new Date(pwf.getTimestamp()) %> <%= escapeXml(pwf.toString()) %> +
+ <% } else {%> +

No WAL files

+ <% } %> +
+
+ <% if (corruptedWALFiles != null && corruptedWALFiles.size() > 0) { %> + + + + + + + + <% for (ProcedureWALFile cwf:corruptedWALFiles) { %> + + + + + + <% } %> +
LogIDSizeTimestampPath
<%= cwf.getLogId() %> <%= StringUtils.humanSize(cwf.getSize()) %> <%= new Date(cwf.getTimestamp()) %> <%= escapeXml(cwf.toString()) %> +
+ <% } else {%> +

No corrupted WAL files

+ <% } %> +
+
+ + + + + + + + + +
Milliseconds to next roll Milliseconds from last roll
<%=StringUtils.humanTimeDiff(millisToNextRoll) %> <%=StringUtils.humanTimeDiff(millisFromLastRoll) %>
+
+
+ + + + + + + + + <% for (int i = syncMetricsBuff.size() - 1; i >= 0; --i) { %> + <% WALProcedureStore.SyncMetrics syncMetrics = syncMetricsBuff.get(i); %> + + + + + + + + <%} %> +
Time Sync Wait Last num of synced entries Total Synced Synced per second
<%= new Date(syncMetrics.getTimestamp()) %> <%= StringUtils.humanTimeDiff(syncMetrics.getSyncWaitMs()) %> <%= syncMetrics.getSyncedEntries() %> <%= StringUtils.humanSize(syncMetrics.getTotalSyncedBytes()) %> <%= StringUtils.humanSize(syncMetrics.getSyncedPerSec()) %>
+
+
+
+