You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by jm...@apache.org on 2021/03/31 17:36:20 UTC
[accumulo] branch main updated: Add created column to Fate Print
command (#1980)
This is an automated email from the ASF dual-hosted git repository.
jmanno pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/main by this push:
new aab34a9 Add created column to Fate Print command (#1980)
aab34a9 is described below
commit aab34a980d7a9ccad63797913b99b331c5cbbaae
Author: Jeffrey Manno <je...@gmail.com>
AuthorDate: Wed Mar 31 13:36:10 2021 -0400
Add created column to Fate Print command (#1980)
* Add timestamp of created time based on transaction Id's of FaTE operations
* Create a helper function to format the returned long value of the timestamp
* Formatted created time within the `fate print` shell command
---
.../apache/accumulo/core/logging/FateLogger.java | 5 ++++
.../java/org/apache/accumulo/fate/AdminUtil.java | 31 +++++++++++++++++++---
.../java/org/apache/accumulo/fate/AgeOffStore.java | 5 ++++
.../org/apache/accumulo/fate/ReadOnlyStore.java | 5 ++++
.../org/apache/accumulo/fate/ReadOnlyTStore.java | 8 ++++++
.../java/org/apache/accumulo/fate/ZooStore.java | 13 +++++++++
.../java/org/apache/accumulo/fate/SimpleStore.java | 5 ++++
7 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/core/src/main/java/org/apache/accumulo/core/logging/FateLogger.java b/core/src/main/java/org/apache/accumulo/core/logging/FateLogger.java
index c856275..6121bce 100644
--- a/core/src/main/java/org/apache/accumulo/core/logging/FateLogger.java
+++ b/core/src/main/java/org/apache/accumulo/core/logging/FateLogger.java
@@ -86,6 +86,11 @@ public class FateLogger {
}
@Override
+ public long timeCreated(long tid) {
+ return store.timeCreated(tid);
+ }
+
+ @Override
public long create() {
long tid = store.create();
if (storeLog.isTraceEnabled())
diff --git a/core/src/main/java/org/apache/accumulo/fate/AdminUtil.java b/core/src/main/java/org/apache/accumulo/fate/AdminUtil.java
index 3016d01..d4e45a8 100644
--- a/core/src/main/java/org/apache/accumulo/fate/AdminUtil.java
+++ b/core/src/main/java/org/apache/accumulo/fate/AdminUtil.java
@@ -20,8 +20,11 @@ package org.apache.accumulo.fate;
import static java.nio.charset.StandardCharsets.UTF_8;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Date;
import java.util.EnumSet;
import java.util.Formatter;
import java.util.HashMap;
@@ -80,9 +83,10 @@ public class AdminUtil<T> {
private final List<String> hlocks;
private final List<String> wlocks;
private final String top;
+ private final long timeCreated;
private TransactionStatus(Long tid, TStatus status, String debug, List<String> hlocks,
- List<String> wlocks, String top) {
+ List<String> wlocks, String top, Long timeCreated) {
this.txid = tid;
this.status = status;
@@ -90,6 +94,7 @@ public class AdminUtil<T> {
this.hlocks = Collections.unmodifiableList(hlocks);
this.wlocks = Collections.unmodifiableList(wlocks);
this.top = top;
+ this.timeCreated = timeCreated;
}
@@ -132,6 +137,21 @@ public class AdminUtil<T> {
public String getTop() {
return top;
}
+
+ /**
+ * @return The timestamp of when the operation was created in ISO format wiht UTC timezone.
+ */
+ public String getTimeCreatedFormatted() {
+ return timeCreated > 0 ? new Date(timeCreated).toInstant().atZone(ZoneOffset.UTC)
+ .format(DateTimeFormatter.ISO_DATE_TIME) : "ERROR";
+ }
+
+ /**
+ * @return The unformatted form of the timestamp.
+ */
+ public long getTimeCreated() {
+ return timeCreated;
+ }
}
public static class FateStatus {
@@ -373,13 +393,15 @@ public class AdminUtil<T> {
TStatus status = zs.getStatus(tid);
+ long timeCreated = zs.timeCreated(tid);
+
zs.unreserve(tid, 0);
if ((filterTxid != null && !filterTxid.contains(tid))
|| (filterStatus != null && !filterStatus.contains(status)))
continue;
- statuses.add(new TransactionStatus(tid, status, debug, hlocks, wlocks, top));
+ statuses.add(new TransactionStatus(tid, status, debug, hlocks, wlocks, top, timeCreated));
}
return new FateStatus(statuses, heldLocks, waitingLocks);
@@ -398,9 +420,10 @@ public class AdminUtil<T> {
FateStatus fateStatus = getStatus(zs, zk, lockPath, filterTxid, filterStatus);
for (TransactionStatus txStatus : fateStatus.getTransactions()) {
- fmt.format("txid: %s status: %-18s op: %-15s locked: %-15s locking: %-15s top: %s%n",
+ fmt.format(
+ "txid: %s status: %-18s op: %-15s locked: %-15s locking: %-15s top: %-15s created: %s%n",
txStatus.getTxid(), txStatus.getStatus(), txStatus.getDebug(), txStatus.getHeldLocks(),
- txStatus.getWaitingLocks(), txStatus.getTop());
+ txStatus.getWaitingLocks(), txStatus.getTop(), txStatus.getTimeCreatedFormatted());
}
fmt.format(" %s transactions", fateStatus.getTransactions().size());
diff --git a/core/src/main/java/org/apache/accumulo/fate/AgeOffStore.java b/core/src/main/java/org/apache/accumulo/fate/AgeOffStore.java
index ccc3aca..0c41d31 100644
--- a/core/src/main/java/org/apache/accumulo/fate/AgeOffStore.java
+++ b/core/src/main/java/org/apache/accumulo/fate/AgeOffStore.java
@@ -231,6 +231,11 @@ public class AgeOffStore<T> implements TStore<T> {
}
@Override
+ public long timeCreated(long tid) {
+ return store.timeCreated(tid);
+ }
+
+ @Override
public List<ReadOnlyRepo<T>> getStack(long tid) {
return store.getStack(tid);
}
diff --git a/core/src/main/java/org/apache/accumulo/fate/ReadOnlyStore.java b/core/src/main/java/org/apache/accumulo/fate/ReadOnlyStore.java
index c5361be..c53a73b 100644
--- a/core/src/main/java/org/apache/accumulo/fate/ReadOnlyStore.java
+++ b/core/src/main/java/org/apache/accumulo/fate/ReadOnlyStore.java
@@ -116,4 +116,9 @@ public class ReadOnlyStore<T> implements ReadOnlyTStore<T> {
public List<ReadOnlyRepo<T>> getStack(long tid) {
return store.getStack(tid);
}
+
+ @Override
+ public long timeCreated(long tid) {
+ return store.timeCreated(tid);
+ }
}
diff --git a/core/src/main/java/org/apache/accumulo/fate/ReadOnlyTStore.java b/core/src/main/java/org/apache/accumulo/fate/ReadOnlyTStore.java
index a302bc4..1d0d93b 100644
--- a/core/src/main/java/org/apache/accumulo/fate/ReadOnlyTStore.java
+++ b/core/src/main/java/org/apache/accumulo/fate/ReadOnlyTStore.java
@@ -139,4 +139,12 @@ public interface ReadOnlyTStore<T> {
*/
List<Long> list();
+ /**
+ * Retrieve the creation time of a FaTE transaction.
+ *
+ * @param tid
+ * Transaction id, previously reserved.
+ * @return creation time of transaction.
+ */
+ long timeCreated(long tid);
}
diff --git a/core/src/main/java/org/apache/accumulo/fate/ZooStore.java b/core/src/main/java/org/apache/accumulo/fate/ZooStore.java
index ee48b10..d84da1d 100644
--- a/core/src/main/java/org/apache/accumulo/fate/ZooStore.java
+++ b/core/src/main/java/org/apache/accumulo/fate/ZooStore.java
@@ -44,6 +44,7 @@ import org.apache.accumulo.fate.zookeeper.ZooUtil.NodeMissingPolicy;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.KeeperException.NoNodeException;
import org.apache.zookeeper.KeeperException.NodeExistsException;
+import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -479,6 +480,18 @@ public class ZooStore<T> implements TStore<T> {
}
@Override
+ public long timeCreated(long tid) {
+ verifyReserved(tid);
+
+ try {
+ Stat stat = zk.getZooKeeper().exists(getTXPath(tid), false);
+ return stat.getCtime();
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ @Override
public List<ReadOnlyRepo<T>> getStack(long tid) {
String txpath = getTXPath(tid);
diff --git a/core/src/test/java/org/apache/accumulo/fate/SimpleStore.java b/core/src/test/java/org/apache/accumulo/fate/SimpleStore.java
index 3d5bc34..0bdd017 100644
--- a/core/src/test/java/org/apache/accumulo/fate/SimpleStore.java
+++ b/core/src/test/java/org/apache/accumulo/fate/SimpleStore.java
@@ -126,6 +126,11 @@ public class SimpleStore<T> implements TStore<T> {
}
@Override
+ public long timeCreated(long tid) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public List<ReadOnlyRepo<T>> getStack(long tid) {
throw new UnsupportedOperationException();
}