diff --git a/core/src/main/java/org/apache/accumulo/core/fate/AdminUtil.java b/core/src/main/java/org/apache/accumulo/core/fate/AdminUtil.java index df2d72f4d19..d9a9650e5fc 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/AdminUtil.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/AdminUtil.java @@ -74,10 +74,11 @@ public static class TransactionStatus { private final String top; private final long timeCreated; private final LockRange lockRange; + private final String details; private TransactionStatus(FateId fateId, FateInstanceType instanceType, TStatus status, Fate.FateOperation fateOp, List hlocks, List wlocks, String top, - Long timeCreated, LockRange lockRange) { + Long timeCreated, LockRange lockRange, String details) { this.fateId = fateId; this.instanceType = instanceType; @@ -88,7 +89,7 @@ private TransactionStatus(FateId fateId, FateInstanceType instanceType, TStatus this.top = top; this.timeCreated = timeCreated; this.lockRange = lockRange; - + this.details = details; } /** @@ -153,6 +154,13 @@ public long getTimeCreated() { public LockRange getLockRange() { return lockRange; } + + /** + * @return details of transaction, may contain protected information + */ + public String getDetails() { + return details; + } } public static class FateStatus { @@ -214,7 +222,7 @@ public List getTransactionStatus( FateStatus status = getTransactionStatus(readOnlyFateStores, fateIdFilter, statusFilter, typesFilter, Collections.>emptyMap(), - Collections.>emptyMap(), Map.of()); + Collections.>emptyMap(), Map.of(), false); return status.getTransactions(); } @@ -243,7 +251,7 @@ public FateStatus getStatus(ReadOnlyFateStore readOnlyMFS, ZooSession zk, findLocks(zk, lockPath, heldLocks, waitingLocks, lockRanges); return getTransactionStatus(Map.of(FateInstanceType.META, readOnlyMFS), fateIdFilter, - statusFilter, typesFilter, heldLocks, waitingLocks, lockRanges); + statusFilter, typesFilter, heldLocks, waitingLocks, lockRanges, false); } public FateStatus getStatus(ReadOnlyFateStore readOnlyUFS, Set fateIdFilter, @@ -251,12 +259,12 @@ public FateStatus getStatus(ReadOnlyFateStore readOnlyUFS, Set fateId throws KeeperException, InterruptedException { return getTransactionStatus(Map.of(FateInstanceType.USER, readOnlyUFS), fateIdFilter, - statusFilter, typesFilter, new HashMap<>(), new HashMap<>(), Map.of()); + statusFilter, typesFilter, new HashMap<>(), new HashMap<>(), Map.of(), false); } public FateStatus getStatus(Map> readOnlyFateStores, ZooSession zk, ServiceLockPath lockPath, Set fateIdFilter, - EnumSet statusFilter, EnumSet typesFilter) + EnumSet statusFilter, EnumSet typesFilter, boolean includeDetails) throws KeeperException, InterruptedException { Map> heldLocks = new HashMap<>(); Map> waitingLocks = new HashMap<>(); @@ -265,7 +273,7 @@ public FateStatus getStatus(Map> readOnlyF findLocks(zk, lockPath, heldLocks, waitingLocks, lockRanges); return getTransactionStatus(readOnlyFateStores, fateIdFilter, statusFilter, typesFilter, - heldLocks, waitingLocks, lockRanges); + heldLocks, waitingLocks, lockRanges, includeDetails); } /** @@ -363,7 +371,7 @@ public static FateStatus getTransactionStatus( Map> readOnlyFateStores, Set fateIdFilter, EnumSet statusFilter, EnumSet typesFilter, Map> heldLocks, Map> waitingLocks, - Map lockRanges) { + Map lockRanges, boolean includeDetails) { final List statuses = new ArrayList<>(); readOnlyFateStores.forEach((type, store) -> { @@ -388,9 +396,13 @@ public static FateStatus getTransactionStatus( } String top = null; + String details = null; ReadOnlyRepo repo = txStore.top(); if (repo != null) { top = repo.getName(); + if (includeDetails) { + details = repo.getDetails(); + } } TStatus status = txStore.getStatus(); @@ -400,7 +412,7 @@ public static FateStatus getTransactionStatus( if (includeByStatus(status, statusFilter) && includeByFateId(fateId, fateIdFilter) && includeByInstanceType(fateId.getType(), typesFilter)) { statuses.add(new TransactionStatus(fateId, type, status, fateOp, hlocks, wlocks, top, - timeCreated, lockRanges.getOrDefault(fateId, LockRange.infinite()))); + timeCreated, lockRanges.getOrDefault(fateId, LockRange.infinite()), details)); } }); } @@ -423,10 +435,10 @@ private static boolean includeByInstanceType(FateInstanceType type, public void print(Map> readOnlyFateStores, ZooSession zk, ServiceLockPath tableLocksPath, Formatter fmt, Set fateIdFilter, - EnumSet statusFilter, EnumSet typesFilter) + EnumSet statusFilter, EnumSet typesFilter, boolean includeDetails) throws KeeperException, InterruptedException { - FateStatus fateStatus = - getStatus(readOnlyFateStores, zk, tableLocksPath, fateIdFilter, statusFilter, typesFilter); + FateStatus fateStatus = getStatus(readOnlyFateStores, zk, tableLocksPath, fateIdFilter, + statusFilter, typesFilter, includeDetails); for (TransactionStatus txStatus : fateStatus.getTransactions()) { fmt.format( @@ -434,6 +446,10 @@ public void print(Map> readOnlyFateStores, txStatus.getFateOp(), txStatus.getFateId(), txStatus.getStatus(), txStatus.getHeldLocks(), txStatus.getWaitingLocks(), txStatus.getTop(), txStatus.getTimeCreatedFormatted(), txStatus.getLockRange()); + if (includeDetails) { + fmt.format("\t Transaction details: %s%n", + txStatus.getDetails() == null ? "" : txStatus.getDetails()); + } } fmt.format(" %s transactions", fateStatus.getTransactions().size()); } diff --git a/core/src/main/java/org/apache/accumulo/core/fate/ReadOnlyRepo.java b/core/src/main/java/org/apache/accumulo/core/fate/ReadOnlyRepo.java index 79d7b70fd0c..5643869a509 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/ReadOnlyRepo.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/ReadOnlyRepo.java @@ -29,4 +29,12 @@ public interface ReadOnlyRepo { String getName(); + /** + * Returns detailed information about the transaction. This information may include protected + * information and should only be used in server-side tools (not the Monitor). + * + * @return json details + */ + String getDetails(); + } diff --git a/core/src/main/java/org/apache/accumulo/core/fate/TraceRepo.java b/core/src/main/java/org/apache/accumulo/core/fate/TraceRepo.java index f9c709eb239..64693e68b88 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/TraceRepo.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/TraceRepo.java @@ -119,4 +119,10 @@ public static String toLogString(Repo repo) { return repo.getClass() + " " + repo.getName(); } + + @Override + public String getDetails() { + return repo.getDetails(); + } + } diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/adminCommand/Fate.java b/server/base/src/main/java/org/apache/accumulo/server/util/adminCommand/Fate.java index 588a654dde7..a3caf0f9757 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/adminCommand/Fate.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/adminCommand/Fate.java @@ -148,6 +148,10 @@ static class FateOpts extends ServerOpts { @Parameter(names = {"-t", "--type"}, description = "... Print transactions of fate instance type(s) {USER, META}") List instanceTypes = new ArrayList<>(); + + @Parameter(names = {"-i", "--info"}, + description = "Includes detailed transaction information when printing") + boolean printDetails; } private final CountDownLatch lockAcquiredLatch = new CountDownLatch(1); @@ -245,7 +249,7 @@ public void execute(JCommander cl, FateOpts options) throws Exception { getCmdLineInstanceTypeFilters(options.instanceTypes); readOnlyFateStores = createReadOnlyFateStores(context, zk); admin.print(readOnlyFateStores, zk, zTableLocksPath, new Formatter(System.out), - fateIdFilter, statusFilter, typesFilter); + fateIdFilter, statusFilter, typesFilter, options.printDetails); // print line break at the end System.out.println(); } @@ -354,7 +358,7 @@ private void summarizeFateTx(ServerContext context, FateOpts cmd, AdminUtilcom.github.ben-manes.caffeine caffeine + + com.google.code.gson + gson + com.google.guava guava diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/CommitCompaction.java b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/CommitCompaction.java index bf54f9b836f..a1eb21efc99 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/CommitCompaction.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/CommitCompaction.java @@ -24,6 +24,7 @@ import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.LOCATION; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.OPID; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.SELECTED; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.time.Duration; import java.util.HashSet; @@ -55,6 +56,8 @@ import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; +import com.google.gson.Gson; +import com.google.gson.JsonObject; public class CommitCompaction extends AbstractFateOperation { private static final long serialVersionUID = 1L; @@ -280,4 +283,13 @@ public static boolean canCommitCompaction(ExternalCompactionId ecid, return true; } + + @Override + public String getDetails() { + Gson gson = GSON.get(); + JsonObject details = gson.toJsonTree(commitData).getAsJsonObject(); + details.addProperty("NewDataFile", newDatafile); + return gson.toJson(details); + } + } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/CompactionCommitData.java b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/CompactionCommitData.java index 6a2270f4fc6..60f233ac020 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/CompactionCommitData.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/CompactionCommitData.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.compaction.coordinator.commit; import java.io.Serializable; +import java.lang.reflect.Type; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -31,8 +32,39 @@ import org.apache.accumulo.core.metadata.schema.ExternalCompactionId; import org.apache.accumulo.core.spi.compaction.CompactionKind; import org.apache.accumulo.core.tabletserver.thrift.TCompactionStats; +import org.apache.accumulo.manager.compaction.coordinator.commit.CompactionCommitData.CompactionCommitDataSerializer; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.annotations.JsonAdapter; + +@JsonAdapter(CompactionCommitDataSerializer.class) public class CompactionCommitData implements Serializable { + + public static class CompactionCommitDataSerializer + implements JsonSerializer { + + @Override + public JsonElement serialize(CompactionCommitData src, Type typeOfSrc, + JsonSerializationContext context) { + JsonObject obj = new JsonObject(); + obj.addProperty("kind", src.kind.name()); + obj.addProperty("ecid", src.ecid); + obj.addProperty("extent", src.textent.toString()); + obj.addProperty("outputTmpPath", src.outputTmpPath); + obj.addProperty("entriesRead", src.stats.entriesRead); + obj.addProperty("entriesWritten", src.stats.entriesWritten); + obj.addProperty("fileSize", src.stats.fileSize); + JsonArray arr = new JsonArray(); + src.inputPaths.forEach(arr::add); + obj.add("inputs", arr); + return obj; + } + } + private static final long serialVersionUID = 1L; final CompactionKind kind; final HashSet inputPaths; // type must be serializable diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/PutGcCandidates.java b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/PutGcCandidates.java index b7c1dc53d67..e764037c8e0 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/PutGcCandidates.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/PutGcCandidates.java @@ -18,11 +18,16 @@ */ package org.apache.accumulo.manager.compaction.coordinator.commit; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.fate.FateId; import org.apache.accumulo.core.fate.Repo; import org.apache.accumulo.manager.tableOps.AbstractFateOperation; import org.apache.accumulo.manager.tableOps.FateEnv; +import com.google.gson.Gson; +import com.google.gson.JsonObject; + public class PutGcCandidates extends AbstractFateOperation { private static final long serialVersionUID = 1L; private final CompactionCommitData commitData; @@ -47,4 +52,13 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { // refresh as part of this compaction commit as it may run sooner. return new RefreshTablet(commitData.textent, refreshLocation); } + + @Override + public String getDetails() { + Gson gson = GSON.get(); + JsonObject details = gson.toJsonTree(commitData).getAsJsonObject(); + details.addProperty("refreshLocation", refreshLocation); + return gson.toJson(details); + } + } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/RefreshTablet.java b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/RefreshTablet.java index c193a3736b8..9680ec3e1b8 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/RefreshTablet.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/RefreshTablet.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.compaction.coordinator.commit; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; @@ -33,6 +35,7 @@ import org.apache.accumulo.manager.tableOps.bulkVer2.TabletRefresher; import com.google.common.util.concurrent.MoreExecutors; +import com.google.gson.JsonObject; public class RefreshTablet extends AbstractFateOperation { private static final long serialVersionUID = 1L; @@ -62,4 +65,13 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { return null; } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("extent", extent.toString()); + details.addProperty("TServerInstance", tserverInstance); + return GSON.get().toJson(details); + } + } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/RenameCompactionFile.java b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/RenameCompactionFile.java index 35846463c51..404196a694a 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/RenameCompactionFile.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/commit/RenameCompactionFile.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.compaction.coordinator.commit; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.io.IOException; import org.apache.accumulo.core.dataImpl.KeyExtent; @@ -96,4 +98,10 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { return new CommitCompaction(commitData, newDatafile == null ? null : newDatafile.getNormalizedPathStr()); } + + @Override + public String getDetails() { + return GSON.get().toJson(commitData); + } + } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/ChangeTableState.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/ChangeTableState.java index 406b046d528..850a9ad88c9 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/ChangeTableState.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/ChangeTableState.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.util.EnumSet; import org.apache.accumulo.core.clientImpl.thrift.TableOperation; @@ -30,6 +32,8 @@ import org.apache.accumulo.core.manager.state.tables.TableState; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + public class ChangeTableState extends AbstractFateOperation { private static final long serialVersionUID = 1L; @@ -79,4 +83,14 @@ public void undo(FateId fateId, FateEnv env) { Utils.unreserveNamespace(env.getContext(), namespaceId, fateId, LockType.READ); Utils.unreserveTable(env.getContext(), tableId, fateId, LockType.WRITE); } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + details.addProperty("newState", top.name()); + return GSON.get().toJson(details); + } + } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/LockTable.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/LockTable.java index 7b5abfa3ada..82bdffa58a8 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/LockTable.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/LockTable.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.availability; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.client.admin.TabletAvailability; import org.apache.accumulo.core.clientImpl.thrift.TableOperation; import org.apache.accumulo.core.data.NamespaceId; @@ -37,6 +39,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + public class LockTable extends AbstractFateOperation { private static final long serialVersionUID = 1L; private static final Logger LOG = LoggerFactory.getLogger(LockTable.class); @@ -110,4 +114,15 @@ private LockRange getLockRange(FateEnv env) { return LockRange.infinite(); } } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + details.addProperty("availability", tabletAvailability.name()); + details.addProperty("tabletRange", tRange.toString()); + return GSON.get().toJson(details); + } + } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/SetTabletAvailability.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/SetTabletAvailability.java index e31923444df..187ea8c6fd9 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/SetTabletAvailability.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/SetTabletAvailability.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tableOps.availability; import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; @@ -50,6 +51,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + public class SetTabletAvailability extends AbstractFateOperation { private static final long serialVersionUID = 1L; @@ -154,4 +157,15 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { Utils.unreserveTable(env.getContext(), tableId, fateId, LockType.WRITE); return null; } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + details.addProperty("availability", tabletAvailability.name()); + details.addProperty("tabletRange", tRange.toString()); + return GSON.get().toJson(details); + } + } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/AbstractBulkFateOperation.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/AbstractBulkFateOperation.java index a91520ad7dc..64aa9a92311 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/AbstractBulkFateOperation.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/AbstractBulkFateOperation.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.bulkVer2; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.time.Instant; import org.apache.accumulo.core.data.TableId; @@ -56,4 +58,10 @@ public String getDestDir() { public Instant getCreationTime() { return creation; } + + @Override + public String getDetails() { + return GSON.get().toJson(bulkInfo); + } + } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java index 47bfc4c432d..e96198850c5 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java @@ -19,13 +19,44 @@ package org.apache.accumulo.manager.tableOps.bulkVer2; import java.io.Serializable; +import java.lang.reflect.Type; import org.apache.accumulo.core.data.TableId; +import org.apache.accumulo.manager.tableOps.bulkVer2.BulkInfo.BulkInfoSerializer; +import org.apache.hadoop.io.Text; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.annotations.JsonAdapter; /** * Package private class to hold all the information used for bulk import2 */ +@JsonAdapter(BulkInfoSerializer.class) class BulkInfo implements Serializable { + + public static class BulkInfoSerializer implements JsonSerializer { + + @Override + public JsonElement serialize(BulkInfo src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject obj = new JsonObject(); + obj.addProperty("tableId", src.tableId.canonical()); + obj.addProperty("sourceDir", src.sourceDir); + obj.addProperty("bulkDir", src.bulkDir); + obj.addProperty("setTime", src.setTime); + if (src.firstSplit != null) { + obj.addProperty("firstSplit", new Text(src.firstSplit).toString()); + } + if (src.lastSplit != null) { + obj.addProperty("lastSplit", new Text(src.lastSplit).toString()); + } + return obj; + } + + } + private static final long serialVersionUID = 1L; TableId tableId; diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneMetadata.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneMetadata.java index 9e0d38f0c6a..656b4b99fd7 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneMetadata.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneMetadata.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.clone; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.fate.FateId; import org.apache.accumulo.core.fate.Repo; import org.apache.accumulo.manager.tableOps.AbstractFateOperation; @@ -59,4 +61,8 @@ public void undo(FateId fateId, FateEnv environment) throws Exception { environment.getServiceLock()); } + @Override + public String getDetails() { + return GSON.get().toJson(cloneInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/ClonePermissions.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/ClonePermissions.java index c8b80a0b5ee..9bcd72d7c3e 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/ClonePermissions.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/ClonePermissions.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.clone; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.client.NamespaceNotFoundException; import org.apache.accumulo.core.clientImpl.AcceptableThriftTableOperationException; import org.apache.accumulo.core.clientImpl.thrift.TableOperation; @@ -76,4 +78,9 @@ public void undo(FateId fateId, FateEnv environment) throws Exception { environment.getContext().getSecurityOperation().deleteTable(environment.getContext().rpcCreds(), cloneInfo.getTableId(), cloneInfo.getNamespaceId()); } + + @Override + public String getDetails() { + return GSON.get().toJson(cloneInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneTable.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneTable.java index 5017f32ee91..d112f860491 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneTable.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneTable.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.clone; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.util.Map; import java.util.Set; @@ -68,4 +70,8 @@ public void undo(FateId fateId, FateEnv environment) { LockType.READ); } + @Override + public String getDetails() { + return GSON.get().toJson(cloneInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneZookeeper.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneZookeeper.java index c92a599d235..dd87c7c21c0 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneZookeeper.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/CloneZookeeper.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.clone; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.client.NamespaceNotFoundException; import org.apache.accumulo.core.clientImpl.ClientContext; import org.apache.accumulo.core.clientImpl.thrift.TableOperation; @@ -76,4 +78,8 @@ public void undo(FateId fateId, FateEnv environment) throws Exception { environment.getContext().clearTableListCache(); } + @Override + public String getDetails() { + return GSON.get().toJson(cloneInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/FinishCloneTable.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/FinishCloneTable.java index c74ce14f432..65f32f7214b 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/FinishCloneTable.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/clone/FinishCloneTable.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.clone; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.util.EnumSet; import org.apache.accumulo.core.fate.FateId; @@ -85,4 +87,8 @@ public Repo call(FateId fateId, FateEnv environment) { @Override public void undo(FateId fateId, FateEnv environment) {} + @Override + public String getDetails() { + return GSON.get().toJson(cloneInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CleanUp.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CleanUp.java index d7ce8f78823..7b9a2fe9a5e 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CleanUp.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CleanUp.java @@ -21,6 +21,7 @@ import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.COMPACTED; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.PREV_ROW; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.USER_COMPACTION_REQUESTED; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; @@ -39,9 +40,12 @@ import org.apache.accumulo.manager.tableOps.FateEnv; import org.apache.accumulo.manager.tableOps.Utils; import org.apache.accumulo.server.compaction.CompactionConfigStorage; +import org.apache.hadoop.io.Text; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + public class CleanUp extends AbstractFateOperation { private static final Logger log = LoggerFactory.getLogger(CleanUp.class); @@ -123,4 +127,14 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { Utils.getReadLock(env.getContext(), namespaceId, fateId, LockRange.infinite()).unlock(); return null; } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + details.addProperty("startRow", startRow == null ? null : new Text(startRow).toString()); + details.addProperty("endRow", endRow == null ? null : new Text(endRow).toString()); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactRange.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactRange.java index e1d88a69cf7..a19fb7de8ac 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactRange.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactRange.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tableOps.compact; import static java.util.Objects.requireNonNull; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.util.Optional; @@ -43,6 +44,7 @@ import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; +import com.google.gson.JsonObject; public class CompactRange extends AbstractFateOperation { @@ -115,4 +117,13 @@ public void undo(FateId fateId, FateEnv env) throws Exception { } } + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + details.addProperty("startRow", startRow == null ? null : new Text(startRow).toString()); + details.addProperty("endRow", endRow == null ? null : new Text(endRow).toString()); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactionDriver.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactionDriver.java index 2a75361e938..543797dd516 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactionDriver.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactionDriver.java @@ -25,6 +25,7 @@ import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.PREV_ROW; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.SELECTED; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.USER_COMPACTION_REQUESTED; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.time.Duration; import java.util.Set; @@ -68,6 +69,7 @@ import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; +import com.google.gson.JsonObject; public class CompactionDriver extends AbstractFateOperation { @@ -419,4 +421,13 @@ private void cleanupTabletMetadata(FateId fateId, ServerContext ctx) throws Exce } } + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + details.addProperty("startRow", startRow == null ? null : new Text(startRow).toString()); + details.addProperty("endRow", endRow == null ? null : new Text(endRow).toString()); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/RefreshTablets.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/RefreshTablets.java index f642e49f645..8ba54647a28 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/RefreshTablets.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/RefreshTablets.java @@ -19,6 +19,8 @@ package org.apache.accumulo.manager.tableOps.compact; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.data.NamespaceId; import org.apache.accumulo.core.data.TableId; import org.apache.accumulo.core.fate.FateId; @@ -26,6 +28,9 @@ import org.apache.accumulo.manager.tableOps.AbstractFateOperation; import org.apache.accumulo.manager.tableOps.FateEnv; import org.apache.accumulo.manager.tableOps.bulkVer2.TabletRefresher; +import org.apache.hadoop.io.Text; + +import com.google.gson.JsonObject; public class RefreshTablets extends AbstractFateOperation { @@ -49,4 +54,14 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { return new CleanUp(tableId, namespaceId, startRow, endRow); } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + details.addProperty("startRow", startRow == null ? null : new Text(startRow).toString()); + details.addProperty("endRow", endRow == null ? null : new Text(endRow).toString()); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/cancel/CancelCompactions.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/cancel/CancelCompactions.java index dd47d24825c..4a2230417b4 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/cancel/CancelCompactions.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/cancel/CancelCompactions.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.compact.cancel; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.clientImpl.thrift.TableOperation; import org.apache.accumulo.core.data.NamespaceId; import org.apache.accumulo.core.data.TableId; @@ -31,6 +33,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + public class CancelCompactions extends AbstractFateOperation { private static final long serialVersionUID = 1L; @@ -70,4 +74,11 @@ public void undo(FateId fateId, FateEnv env) { Utils.unreserveNamespace(env.getContext(), namespaceId, fateId, LockType.READ); } + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/cancel/FinishCancelCompaction.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/cancel/FinishCancelCompaction.java index 3530b1154f4..08d8ab273ba 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/cancel/FinishCancelCompaction.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/cancel/FinishCancelCompaction.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.compact.cancel; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.data.NamespaceId; import org.apache.accumulo.core.data.TableId; import org.apache.accumulo.core.fate.FateId; @@ -27,6 +29,8 @@ import org.apache.accumulo.manager.tableOps.FateEnv; import org.apache.accumulo.manager.tableOps.Utils; +import com.google.gson.JsonObject; + class FinishCancelCompaction extends AbstractFateOperation { private static final long serialVersionUID = 1L; private final TableId tableId; @@ -48,4 +52,12 @@ public Repo call(FateId fateId, FateEnv environment) { public void undo(FateId fateId, FateEnv environment) { } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/create/ChooseDir.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/create/ChooseDir.java index 19d421ce442..787268983eb 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/create/ChooseDir.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/create/ChooseDir.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tableOps.create; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.io.IOException; import java.util.Iterator; @@ -127,4 +128,8 @@ private void writeTabletDirectoriesToFileSystem(ServerContext ctx, SortedSet createSplitDirectoryMap(SortedMap call(FateId fateId, FateEnv env) throws Exception { return new CleanUp(tableId, namespaceId); } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/CountFiles.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/CountFiles.java index 70ff88b13a7..fccc8eb524a 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/CountFiles.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/CountFiles.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tableOps.merge; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.FILES; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import static org.apache.accumulo.manager.tableOps.merge.MergeInfo.Operation.SYSTEM_MERGE; import org.apache.accumulo.core.conf.Property; @@ -88,4 +89,9 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { }; } } + + @Override + public String getDetails() { + return GSON.get().toJson(data); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/DeleteRows.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/DeleteRows.java index 8b709bab030..33b1d43d263 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/DeleteRows.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/DeleteRows.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.manager.tableOps.merge; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import static org.apache.accumulo.manager.tableOps.merge.MergeTablets.validateTablet; import java.util.ArrayList; @@ -313,4 +314,9 @@ private List createRangesForDeletion(FateId fateId, TabletMetadata tablet return ranges; } + + @Override + public String getDetails() { + return GSON.get().toJson(data); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/DeleteTablets.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/DeleteTablets.java index 37af6b75cda..7887b1b656f 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/DeleteTablets.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/DeleteTablets.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.merge; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.util.Objects; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; @@ -36,6 +38,8 @@ import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; +import com.google.gson.Gson; +import com.google.gson.JsonObject; /** * Delete tablets that were merged into another tablet. @@ -124,4 +128,13 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { return new FinishTableRangeOp(data); } + + @Override + public String getDetails() { + Gson gson = GSON.get(); + JsonObject details = gson.toJsonTree(data).getAsJsonObject(); + details.addProperty("lastTabletEndRow", + lastTabletEndRow == null ? null : new Text(lastTabletEndRow).toString()); + return gson.toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/FinishTableRangeOp.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/FinishTableRangeOp.java index aa5ff0acfef..4aa0c59a323 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/FinishTableRangeOp.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/FinishTableRangeOp.java @@ -21,6 +21,7 @@ import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.LOCATION; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.OPID; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.PREV_ROW; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; @@ -107,4 +108,8 @@ static void removeOperationIds(Logger log, MergeInfo data, FateId fateId, FateEn rejectedCount.get()); } + @Override + public String getDetails() { + return GSON.get().toJson(data); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/MergeInfo.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/MergeInfo.java index 6b84e16e7f0..2861974177a 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/MergeInfo.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/MergeInfo.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tableOps.merge; import java.io.Serializable; +import java.lang.reflect.Type; import java.util.Objects; import org.apache.accumulo.core.clientImpl.AcceptableThriftTableOperationException; @@ -30,11 +31,37 @@ import org.apache.accumulo.core.data.TableId; import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.util.TextUtil; +import org.apache.accumulo.manager.tableOps.merge.MergeInfo.MergeInfoSerializer; import org.apache.hadoop.io.Text; import com.google.common.base.Preconditions; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.annotations.JsonAdapter; +@JsonAdapter(MergeInfoSerializer.class) public class MergeInfo implements Serializable { + + public static class MergeInfoSerializer implements JsonSerializer { + + @Override + public JsonElement serialize(MergeInfo src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject obj = new JsonObject(); + obj.addProperty("namespaceId", src.namespaceId.canonical()); + obj.addProperty("tableId", src.tableId.canonical()); + obj.addProperty("operation", src.op.name()); + obj.addProperty("startRow", new Text(src.startRow).toString()); + obj.addProperty("endRow", new Text(src.endRow).toString()); + if (src.mergeRangeSet) { + obj.addProperty("mergeStartRow", new Text(src.mergeStartRow).toString()); + obj.addProperty("mergeEndRow", new Text(src.mergeEndRow).toString()); + } + return obj; + } + } + private static final long serialVersionUID = 1L; public enum Operation { diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/MergeTablets.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/MergeTablets.java index d184b39cb4e..de3484c4fa4 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/MergeTablets.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/MergeTablets.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.manager.tableOps.merge; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import static org.apache.accumulo.manager.tableOps.merge.DeleteRows.verifyAccepted; import java.util.ArrayList; @@ -296,4 +297,9 @@ private static StoredTabletFile fenceFile(KeyExtent extent, StoredTabletFile fil fenced = file.hasRange() ? file.getRange().clip(fenced) : fenced; return StoredTabletFile.of(file.getPath(), fenced); } + + @Override + public String getDetails() { + return GSON.get().toJson(data); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/ReserveTablets.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/ReserveTablets.java index 32967a794a3..d43249af588 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/ReserveTablets.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/ReserveTablets.java @@ -23,6 +23,7 @@ import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.LOGS; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.OPID; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.PREV_ROW; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; @@ -137,4 +138,9 @@ public Repo call(FateId fateId, FateEnv environment) throws Exception { case MERGE, DELETE -> new CountFiles(data); }; } + + @Override + public String getDetails() { + return GSON.get().toJson(data); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/TableRangeOp.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/TableRangeOp.java index 5be5efbbc80..481b5d245d0 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/TableRangeOp.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/TableRangeOp.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.manager.tableOps.merge; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import static org.apache.accumulo.manager.ManagerClientServiceHandler.mustBeOnline; import org.apache.accumulo.core.clientImpl.thrift.TableOperation; @@ -78,4 +79,9 @@ public void undo(FateId fateId, FateEnv env) throws Exception { Utils.unreserveNamespace(env.getContext(), data.namespaceId, fateId, LockType.READ); Utils.unreserveTable(env.getContext(), data.tableId, fateId, LockType.WRITE); } + + @Override + public String getDetails() { + return GSON.get().toJson(data); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/UnreserveAndError.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/UnreserveAndError.java index eb647fef662..47eb8e26470 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/UnreserveAndError.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/UnreserveAndError.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.merge; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.clientImpl.AcceptableThriftTableOperationException; import org.apache.accumulo.core.clientImpl.thrift.TableOperation; import org.apache.accumulo.core.clientImpl.thrift.TableOperationExceptionType; @@ -28,6 +30,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.Gson; +import com.google.gson.JsonObject; + public class UnreserveAndError extends AbstractFateOperation { private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(UnreserveAndError.class); @@ -51,4 +56,13 @@ public Repo call(FateId fateId, FateEnv environment) throws Exception { "Aborted merge because it would produce a tablets with more files than the configured limit of " + maxFiles + ". Observed " + totalFiles + " files in the merge range."); } + + @Override + public String getDetails() { + Gson gson = GSON.get(); + JsonObject details = gson.toJsonTree(mergeInfo).getAsJsonObject(); + details.addProperty("totalFiles", totalFiles); + details.addProperty("maxFiles", maxFiles); + return gson.toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/UnreserveSystemMerge.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/UnreserveSystemMerge.java index de283569227..50bca95c26b 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/UnreserveSystemMerge.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/UnreserveSystemMerge.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.merge; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.clientImpl.AcceptableThriftTableOperationException; import org.apache.accumulo.core.clientImpl.thrift.TableOperation; import org.apache.accumulo.core.clientImpl.thrift.TableOperationExceptionType; @@ -29,6 +31,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.Gson; +import com.google.gson.JsonObject; + public class UnreserveSystemMerge extends AbstractFateOperation { private static final long serialVersionUID = 1L; @@ -75,4 +80,14 @@ private String formatReason() { }; } + + @Override + public String getDetails() { + Gson gson = GSON.get(); + JsonObject details = gson.toJsonTree(mergeInfo).getAsJsonObject(); + details.addProperty("maxTotalSize", maxTotalSize); + details.addProperty("maxFiles", maxFileCount); + details.addProperty("reason", reason.name()); + return gson.toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/VerifyMergeability.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/VerifyMergeability.java index 5ac281bfaa3..d1345c84aa0 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/VerifyMergeability.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/merge/VerifyMergeability.java @@ -20,6 +20,7 @@ import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.FILES; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.MERGEABILITY; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.fate.FateId; @@ -77,4 +78,8 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { return new MergeTablets(data); } + @Override + public String getDetails() { + return GSON.get().toJson(data); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/CreateNamespace.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/CreateNamespace.java index b44e2d308c2..90a8209afb0 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/CreateNamespace.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/CreateNamespace.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tableOps.namespace.create; import static java.util.Objects.requireNonNull; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.util.HashMap; import java.util.Map; @@ -60,4 +61,8 @@ public void undo(FateId fateId, FateEnv env) { // nothing to do, the namespace id was allocated! } + @Override + public String getDetails() { + return GSON.get().toJson(namespaceInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/FinishCreateNamespace.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/FinishCreateNamespace.java index f29ea05e7bc..0836eafb967 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/FinishCreateNamespace.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/FinishCreateNamespace.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.namespace.create; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.fate.FateId; import org.apache.accumulo.core.fate.Repo; import org.apache.accumulo.core.fate.zookeeper.DistributedReadWriteLock.LockType; @@ -62,4 +64,8 @@ public String getReturn() { @Override public void undo(FateId fateId, FateEnv env) {} + @Override + public String getDetails() { + return GSON.get().toJson(namespaceInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/PopulateZookeeperWithNamespace.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/PopulateZookeeperWithNamespace.java index 320b65e5116..3fd6f50206e 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/PopulateZookeeperWithNamespace.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/PopulateZookeeperWithNamespace.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.namespace.create; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.clientImpl.thrift.TableOperation; import org.apache.accumulo.core.fate.FateId; import org.apache.accumulo.core.fate.Repo; @@ -68,4 +70,8 @@ public void undo(FateId fateId, FateEnv env) throws Exception { Utils.unreserveNamespace(env.getContext(), namespaceInfo.namespaceId, fateId, LockType.WRITE); } + @Override + public String getDetails() { + return GSON.get().toJson(namespaceInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/SetupNamespacePermissions.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/SetupNamespacePermissions.java index d54a858cbfc..c0f0c4723c0 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/SetupNamespacePermissions.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/create/SetupNamespacePermissions.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.namespace.create; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException; import org.apache.accumulo.core.fate.FateId; import org.apache.accumulo.core.fate.Repo; @@ -57,4 +59,9 @@ public Repo call(FateId fate, FateEnv env) throws Exception { // error return new PopulateZookeeperWithNamespace(namespaceInfo); } + + @Override + public String getDetails() { + return GSON.get().toJson(namespaceInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/delete/DeleteNamespace.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/delete/DeleteNamespace.java index 41799908cdf..1f218059681 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/delete/DeleteNamespace.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/delete/DeleteNamespace.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.namespace.delete; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.clientImpl.thrift.TableOperation; import org.apache.accumulo.core.data.NamespaceId; import org.apache.accumulo.core.fate.FateId; @@ -27,6 +29,8 @@ import org.apache.accumulo.manager.tableOps.FateEnv; import org.apache.accumulo.manager.tableOps.Utils; +import com.google.gson.JsonObject; + public class DeleteNamespace extends AbstractFateOperation { private static final long serialVersionUID = 1L; @@ -54,4 +58,10 @@ public void undo(FateId fateId, FateEnv environment) { Utils.unreserveNamespace(environment.getContext(), namespaceId, fateId, LockType.WRITE); } + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/delete/NamespaceCleanUp.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/delete/NamespaceCleanUp.java index 46d1b88853c..0bbbab3c49e 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/delete/NamespaceCleanUp.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/delete/NamespaceCleanUp.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.namespace.delete; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException; import org.apache.accumulo.core.data.NamespaceId; import org.apache.accumulo.core.fate.FateId; @@ -29,6 +31,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + class NamespaceCleanUp extends AbstractFateOperation { private static final Logger log = LoggerFactory.getLogger(NamespaceCleanUp.class); @@ -77,4 +81,10 @@ public void undo(FateId fateId, FateEnv environment) { // nothing to do } + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/rename/RenameNamespace.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/rename/RenameNamespace.java index f745ca22833..effddf77bc1 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/rename/RenameNamespace.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/namespace/rename/RenameNamespace.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.namespace.rename; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.clientImpl.thrift.TableOperation; import org.apache.accumulo.core.data.NamespaceId; import org.apache.accumulo.core.fate.FateId; @@ -28,6 +30,8 @@ import org.apache.accumulo.manager.tableOps.Utils; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + public class RenameNamespace extends AbstractFateOperation { private static final long serialVersionUID = 1L; @@ -68,4 +72,12 @@ public void undo(FateId fateId, FateEnv env) { Utils.unreserveNamespace(env.getContext(), namespaceId, fateId, LockType.WRITE); } + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("oldName", oldName); + details.addProperty("newName", newName); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/rename/RenameTable.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/rename/RenameTable.java index b80a682dee0..1ba40347436 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/rename/RenameTable.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/rename/RenameTable.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.rename; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.client.NamespaceNotFoundException; import org.apache.accumulo.core.clientImpl.thrift.TableOperation; import org.apache.accumulo.core.data.NamespaceId; @@ -32,6 +34,8 @@ import org.apache.accumulo.manager.tableOps.Utils; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + public class RenameTable extends AbstractFateOperation { private static final long serialVersionUID = 1L; @@ -85,4 +89,13 @@ public void undo(FateId fateId, FateEnv env) { Utils.unreserveNamespace(env.getContext(), namespaceId, fateId, LockType.READ); } + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("namespaceId", namespaceId.canonical()); + details.addProperty("tableId", tableId.canonical()); + details.addProperty("oldName", oldTableName); + details.addProperty("newName", newTableName); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/AllocateDirsAndEnsureOnline.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/AllocateDirsAndEnsureOnline.java index e6bba8e6e36..cf57134def0 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/AllocateDirsAndEnsureOnline.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/AllocateDirsAndEnsureOnline.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.split; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.util.ArrayList; import org.apache.accumulo.core.clientImpl.AcceptableThriftTableOperationException; @@ -105,4 +107,9 @@ public boolean test(TabletMetadata tabletMetadata) { return new UpdateTablets(splitInfo, dirs); } } + + @Override + public String getDetails() { + return GSON.get().toJson(splitInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/DeleteOperationIds.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/DeleteOperationIds.java index 1accc8ad18a..a20909b9779 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/DeleteOperationIds.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/DeleteOperationIds.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.split; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.util.stream.Collectors; import org.apache.accumulo.core.clientImpl.TableOperationsImpl; @@ -82,4 +84,9 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { public String getReturn() { return TableOperationsImpl.SPLIT_SUCCESS_MSG; } + + @Override + public String getDetails() { + return GSON.get().toJson(splitInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java index a7036e9a21f..2e55d4905c0 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java @@ -20,6 +20,7 @@ import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.FILES; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.UNSPLITTABLE; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.util.Optional; import java.util.SortedSet; @@ -159,4 +160,8 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { return new PreSplit(extent, splits); } + @Override + public String getDetails() { + return GSON.get().toJson(splitInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/PreSplit.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/PreSplit.java index ed6879eaffd..c1c82d01c48 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/PreSplit.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/PreSplit.java @@ -22,6 +22,7 @@ import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.LOGS; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.OPID; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.PREV_ROW; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.util.Map; import java.util.Objects; @@ -153,4 +154,9 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { @Override public void undo(FateId fateId, FateEnv env) throws Exception {} + + @Override + public String getDetails() { + return GSON.get().toJson(splitInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/SplitInfo.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/SplitInfo.java index c13862905cc..c2c76238aa6 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/SplitInfo.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/SplitInfo.java @@ -21,6 +21,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import java.io.Serializable; +import java.lang.reflect.Type; import java.nio.ByteBuffer; import java.util.NavigableMap; import java.util.SortedMap; @@ -31,11 +32,39 @@ import org.apache.accumulo.core.data.TableId; import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.util.TextUtil; +import org.apache.accumulo.manager.tableOps.split.SplitInfo.SplitInfoSerializer; import org.apache.hadoop.io.Text; import com.google.common.base.Preconditions; - +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.annotations.JsonAdapter; + +@JsonAdapter(SplitInfoSerializer.class) public class SplitInfo implements Serializable { + + public static class SplitInfoSerializer implements JsonSerializer { + + @Override + public JsonElement serialize(SplitInfo src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject obj = new JsonObject(); + obj.addProperty("tableId", src.tableId.canonical()); + obj.addProperty("prevEndRow", new Text(src.prevEndRow).toString()); + obj.addProperty("endRow", new Text(src.endRow).toString()); + if (src.splits.length > 0) { + JsonArray arr = new JsonArray(); + for (byte[] split : src.splits) { + arr.add(new Text(split).toString()); + } + obj.add("splits", arr); + } + return obj; + } + } + private static final long serialVersionUID = 1L; private final TableId tableId; diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/UpdateTablets.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/UpdateTablets.java index f4d2d6df00f..81df0f8d50e 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/UpdateTablets.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/UpdateTablets.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.split; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -52,6 +54,9 @@ import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; public class UpdateTablets extends AbstractFateOperation { private static final Logger log = LoggerFactory.getLogger(UpdateTablets.class); @@ -360,4 +365,15 @@ private void updateExistingTablet(FateId fateId, ServerContext ctx, TabletMetada result.getExtent()); } } + + @Override + public String getDetails() { + Gson gson = GSON.get(); + JsonObject details = gson.toJsonTree(splitInfo).getAsJsonObject(); + JsonArray dirs = new JsonArray(dirNames.size()); + dirNames.forEach(dirs::add); + details.add("dirs", dirs); + return gson.toJson(details); + } + } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableExport/ExportTable.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableExport/ExportTable.java index 004cd16af7f..4ff76cd04b6 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableExport/ExportTable.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableExport/ExportTable.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.tableExport; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.data.NamespaceId; import org.apache.accumulo.core.data.TableId; import org.apache.accumulo.core.fate.FateId; @@ -70,4 +72,8 @@ public void undo(FateId fateId, FateEnv env) throws Exception { public static final String DATA_VERSION_PROP = "srcDataVersion"; public static final String EXPORT_VERSION_PROP = "exportVersion"; + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableExport/WriteExportFiles.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableExport/WriteExportFiles.java index a70ffb32df6..d9b89a5dc1a 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableExport/WriteExportFiles.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableExport/WriteExportFiles.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tableOps.tableExport; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.io.BufferedOutputStream; import java.io.BufferedWriter; @@ -298,4 +299,9 @@ private static void exportConfig(ServerContext context, TableId tableID, ZipOutp osw.flush(); } + + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/CreateImportDir.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/CreateImportDir.java index 97b176396c7..ca001303178 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/CreateImportDir.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/CreateImportDir.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.tableImport; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.io.IOException; import java.util.Iterator; import java.util.Set; @@ -85,4 +87,9 @@ void create(Set tableDirs, ServerContext ctx) throws IOException { log.info("Using import dir: {}", dm.importDir); } } + + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/FinishImportTable.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/FinishImportTable.java index 17a33bacc82..9a5d08f87e7 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/FinishImportTable.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/FinishImportTable.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tableOps.tableImport; import static org.apache.accumulo.core.Constants.IMPORT_MAPPINGS_FILE; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.util.EnumSet; @@ -83,4 +84,8 @@ public String getReturn() { @Override public void undo(FateId fateId, FateEnv env) {} + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportPopulateZookeeper.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportPopulateZookeeper.java index 4c507c30641..bb016a559a3 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportPopulateZookeeper.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportPopulateZookeeper.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.tableImport; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.io.IOException; import java.util.Map; @@ -98,4 +100,9 @@ public void undo(FateId fateId, FateEnv env) throws Exception { Utils.unreserveTable(env.getContext(), tableInfo.tableId, fateId, LockType.WRITE); context.clearTableListCache(); } + + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportSetupPermissions.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportSetupPermissions.java index 474e513d73b..70fc382bd9e 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportSetupPermissions.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportSetupPermissions.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.tableImport; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException; import org.apache.accumulo.core.fate.FateId; import org.apache.accumulo.core.fate.Repo; @@ -66,4 +68,9 @@ public void undo(FateId fateId, FateEnv env) throws Exception { env.getContext().getSecurityOperation().deleteTable(env.getContext().rpcCreds(), tableInfo.tableId, tableInfo.namespaceId); } + + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportTable.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportTable.java index c464a0c16a6..79863853664 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportTable.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/ImportTable.java @@ -20,6 +20,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.function.Predicate.not; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.io.BufferedReader; import java.io.IOException; @@ -172,4 +173,9 @@ static ArrayList parseExportDir(Set .map(ImportedTableInfo.DirectoryMapping::new) .collect(Collectors.toCollection(ArrayList::new)); } + + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/MapImportFileNames.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/MapImportFileNames.java index 0abf91afadc..8ae5cfd28d2 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/MapImportFileNames.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/MapImportFileNames.java @@ -20,6 +20,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.accumulo.core.Constants.IMPORT_MAPPINGS_FILE; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import java.io.BufferedWriter; import java.io.IOException; @@ -125,4 +126,9 @@ public void undo(FateId fateId, FateEnv env) throws Exception { env.getVolumeManager().deleteRecursively(new Path(dm.importDir)); } } + + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/MoveExportedFiles.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/MoveExportedFiles.java index efcf9dd1023..34cdcadf530 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/MoveExportedFiles.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/MoveExportedFiles.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tableOps.tableImport; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import java.io.IOException; import java.util.Arrays; import java.util.HashMap; @@ -116,4 +118,9 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { return new FinishImportTable(tableInfo); } + + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/PopulateMetadataTable.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/PopulateMetadataTable.java index 15c21acbfd7..3e827830159 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/PopulateMetadataTable.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/tableImport/PopulateMetadataTable.java @@ -20,6 +20,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.accumulo.core.Constants.IMPORT_MAPPINGS_FILE; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import static org.apache.accumulo.manager.tableOps.tableExport.ExportTable.VERSION_2; import java.io.BufferedInputStream; @@ -215,4 +216,9 @@ public void undo(FateId fateId, FateEnv environment) throws Exception { MetadataTableUtil.deleteTable(tableInfo.tableId, false, environment.getContext(), environment.getServiceLock()); } + + @Override + public String getDetails() { + return GSON.get().toJson(tableInfo); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tserverOps/BeginTserverShutdown.java b/server/manager/src/main/java/org/apache/accumulo/manager/tserverOps/BeginTserverShutdown.java index 358595ebcac..3e9f4bb4a7a 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tserverOps/BeginTserverShutdown.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tserverOps/BeginTserverShutdown.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.tserverOps; +import static org.apache.accumulo.core.util.LazySingletons.GSON; + import org.apache.accumulo.core.Constants; import org.apache.accumulo.core.data.ResourceGroupId; import org.apache.accumulo.core.fate.FateId; @@ -30,6 +32,7 @@ import org.slf4j.LoggerFactory; import com.google.common.net.HostAndPort; +import com.google.gson.JsonObject; public class BeginTserverShutdown extends AbstractFateOperation { @@ -77,4 +80,14 @@ public void undo(FateId fateId, FateEnv environment) throws Exception { log.trace("{} removed {}", fateId, path); } } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("resourceGroup", resourceGroup.canonical()); + details.addProperty("hostAndPort", hostAndPort.toString()); + details.addProperty("serverSession", serverSession); + details.addProperty("force", force); + return GSON.get().toJson(details); + } } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tserverOps/ShutdownTServer.java b/server/manager/src/main/java/org/apache/accumulo/manager/tserverOps/ShutdownTServer.java index eb456a8a3c6..6858ce5e929 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tserverOps/ShutdownTServer.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tserverOps/ShutdownTServer.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tserverOps; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import static org.apache.accumulo.manager.tserverOps.BeginTserverShutdown.createPath; import org.apache.accumulo.core.data.ResourceGroupId; @@ -40,6 +41,7 @@ import org.slf4j.LoggerFactory; import com.google.common.net.HostAndPort; +import com.google.gson.JsonObject; public class ShutdownTServer extends AbstractFateOperation { @@ -126,4 +128,14 @@ public Repo call(FateId fateId, FateEnv env) throws Exception { @Override public void undo(FateId fateId, FateEnv env) {} + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("resourceGroup", resourceGroup.canonical()); + details.addProperty("hostAndPort", hostAndPort.toString()); + details.addProperty("serverSession", serverSession); + details.addProperty("force", force); + return GSON.get().toJson(details); + } } diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/next/InformationFetcher.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/next/InformationFetcher.java index 3014993ac08..8d2d7ea34ac 100644 --- a/server/monitor/src/main/java/org/apache/accumulo/monitor/next/InformationFetcher.java +++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/next/InformationFetcher.java @@ -434,7 +434,7 @@ public void run() { AdminUtil admin = new AdminUtil<>(); var zTableLocksPath = ctx.getServerPaths().createTableLocksPath(); var zk = ctx.getZooSession(); - FateStatus status = admin.getStatus(stores, zk, zTableLocksPath, null, null, null); + FateStatus status = admin.getStatus(stores, zk, zTableLocksPath, null, null, null, false); summary.processFateTransactions(status.getTransactions()); } catch (KeeperException | InterruptedException e) { throw new IllegalStateException(e); diff --git a/server/monitor/src/main/resources/org/apache/accumulo/monitor/templates/fate.ftl b/server/monitor/src/main/resources/org/apache/accumulo/monitor/templates/fate.ftl index b460c4a9478..3041a0fbbc5 100644 --- a/server/monitor/src/main/resources/org/apache/accumulo/monitor/templates/fate.ftl +++ b/server/monitor/src/main/resources/org/apache/accumulo/monitor/templates/fate.ftl @@ -22,7 +22,7 @@
<#include "table_loading.ftl" >
Fate Transaction Details
- The table contains the last known Fate transaction status.
+ Use the accumulo inst fate server-side utility with the -l and -i options to see detailed information about a transaction.
diff --git a/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompaction_1_IT.java b/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompaction_1_IT.java index 264011fc7e5..6cd9c977b13 100644 --- a/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompaction_1_IT.java +++ b/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompaction_1_IT.java @@ -377,6 +377,12 @@ public long isReady(FateId fateId, FateEnv environment) throws Exception { public Repo call(FateId fateId, FateEnv environment) throws Exception { return null; } + + @Override + public String getDetails() { + return null; + } + } private FateId createCompactionCommitAndDeadMetadata(AccumuloClient c, diff --git a/test/src/main/java/org/apache/accumulo/test/fate/FateExecutionOrderITBase.java b/test/src/main/java/org/apache/accumulo/test/fate/FateExecutionOrderITBase.java index 4bbf06e0a1a..375f35ff672 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/FateExecutionOrderITBase.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/FateExecutionOrderITBase.java @@ -141,6 +141,11 @@ public void undo(FateId fateId, FeoTestEnv environment) throws Exception { public String getReturn() { return ""; } + + @Override + public String getDetails() { + return null; + } } public static class SecondOp extends FirstOp { diff --git a/test/src/main/java/org/apache/accumulo/test/fate/FateITBase.java b/test/src/main/java/org/apache/accumulo/test/fate/FateITBase.java index 1f79505ff22..2535e2cadc6 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/FateITBase.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/FateITBase.java @@ -26,6 +26,7 @@ import static org.apache.accumulo.core.fate.ReadOnlyFateStore.TStatus.SUBMITTED; import static org.apache.accumulo.core.fate.ReadOnlyFateStore.TStatus.SUCCESSFUL; import static org.apache.accumulo.core.fate.ReadOnlyFateStore.TStatus.UNKNOWN; +import static org.apache.accumulo.core.util.LazySingletons.GSON; import static org.apache.accumulo.test.fate.FateTestUtil.TEST_FATE_OP; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -67,6 +68,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + public abstract class FateITBase extends SharedMiniClusterBase implements FateTestRunner { private static final Logger LOG = LoggerFactory.getLogger(FateITBase.class); @@ -123,6 +126,13 @@ public void undo(FateId fateId, TestEnv environment) throws Exception { public String getReturn() { return data + "_ret"; } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("data", data); + return GSON.get().toJson(details); + } } public static class TestOperationFails implements Repo { @@ -184,6 +194,14 @@ public Repo call(FateId fateId, TestEnv environment) throws Exception { public String getReturn() { return "none"; } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("opName", opName); + details.addProperty("opNum", opNum); + return GSON.get().toJson(details); + } } /** @@ -231,6 +249,13 @@ public void undo(FateId fateId, TestEnv environment) { public String getReturn() { return data + "_ret"; } + + @Override + public String getDetails() { + JsonObject details = new JsonObject(); + details.addProperty("data", data); + return GSON.get().toJson(details); + } } @Test @@ -666,6 +691,11 @@ public long isReady(FateId fateId, TestEnv environment) throws Exception { public String getName() { return "none"; } + + @Override + public String getDetails() { + return null; + } } @Test diff --git a/test/src/main/java/org/apache/accumulo/test/fate/FateOpsCommandsITBase.java b/test/src/main/java/org/apache/accumulo/test/fate/FateOpsCommandsITBase.java index 15b4798bb04..5fb90e60c86 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/FateOpsCommandsITBase.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/FateOpsCommandsITBase.java @@ -813,7 +813,7 @@ protected void testFatePrintAndSummaryCommandsWithInProgressTxns(FateStore(), new HashMap<>(), Map.of()); + new HashMap<>(), new HashMap<>(), Map.of(), false); } catch (Exception e) { fail("An unexpected error occurred in getTransactionStatus():\n" + e); } diff --git a/test/src/main/java/org/apache/accumulo/test/fate/FatePoolsWatcherITBase.java b/test/src/main/java/org/apache/accumulo/test/fate/FatePoolsWatcherITBase.java index c09a1ee737f..9141e379f57 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/FatePoolsWatcherITBase.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/FatePoolsWatcherITBase.java @@ -809,6 +809,11 @@ public void undo(FateId fateId, PoolResizeTestEnv environment) throws Exception public String getReturn() { return null; } + + @Override + public String getDetails() { + return null; + } } public static class PoolResizeTestEnv extends FateTestRunner.TestEnv { diff --git a/test/src/main/java/org/apache/accumulo/test/fate/MultipleStoresITBase.java b/test/src/main/java/org/apache/accumulo/test/fate/MultipleStoresITBase.java index 5a5a7734508..cfea22cd6f4 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/MultipleStoresITBase.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/MultipleStoresITBase.java @@ -428,6 +428,11 @@ public void undo(FateId fateId, SleepingTestEnv environment) { public String getReturn() { return null; } + + @Override + public String getDetails() { + return null; + } } public static class SleepingTestEnv extends MultipleStoresTestEnv { @@ -471,6 +476,11 @@ public void undo(FateId fateId, LatchTestEnv environment) { public String getReturn() { return null; } + + @Override + public String getDetails() { + return null; + } } public static class LatchTestEnv extends MultipleStoresTestEnv { diff --git a/test/src/main/java/org/apache/accumulo/test/functional/FateConcurrencyIT.java b/test/src/main/java/org/apache/accumulo/test/functional/FateConcurrencyIT.java index f051ba8927f..d7dff6be447 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/FateConcurrencyIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/FateConcurrencyIT.java @@ -264,7 +264,7 @@ public void getFateStatus() { Map> readOnlyFateStores = Map.of(FateInstanceType.META, readOnlyMFS, FateInstanceType.USER, readOnlyUFS); - withLocks = admin.getStatus(readOnlyFateStores, zk, lockPath, null, null, null); + withLocks = admin.getStatus(readOnlyFateStores, zk, lockPath, null, null, null, true); // call method that does not use locks. noLocks = admin.getTransactionStatus(readOnlyFateStores, null, null, null); @@ -299,7 +299,10 @@ public void getFateStatus() { if (isCompaction(tx)) { - log.trace("Fate id: {}, status: {}", tx.getFateId(), tx.getStatus()); + log.info("Fate id: {}, status: {}, details: {}", tx.getFateId(), tx.getStatus(), + tx.getDetails()); + + assertNotNull(tx.getDetails()); for (AdminUtil.TransactionStatus tx2 : noLocks) { if (tx2.getFateId().equals(tx.getFateId())) { diff --git a/test/src/main/java/org/apache/accumulo/test/functional/FunctionalTestUtils.java b/test/src/main/java/org/apache/accumulo/test/functional/FunctionalTestUtils.java index 0779149edcd..e0f3b3ddc4f 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/FunctionalTestUtils.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/FunctionalTestUtils.java @@ -226,7 +226,7 @@ private static FateStatus getFateStatus(AccumuloCluster cluster) { Map> readOnlyFateStores = Map.of(FateInstanceType.META, readOnlyMFS, FateInstanceType.USER, readOnlyUFS); var lockPath = context.getServerPaths().createTableLocksPath(); - return admin.getStatus(readOnlyFateStores, zk, lockPath, null, null, null); + return admin.getStatus(readOnlyFateStores, zk, lockPath, null, null, null, false); } catch (KeeperException | InterruptedException e) { throw new RuntimeException(e); }