This is an automated email from the ASF dual-hosted git repository. kturner pushed a commit to branch elasticity in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/elasticity by this push: new eb71e3e4a6 FateId to use UUID instead of long (#4388) eb71e3e4a6 is described below commit eb71e3e4a6af3c37ee27c9f5cb3b26277d74b05b Author: Kevin Rathbun <43969518+kevinrr...@users.noreply.github.com> AuthorDate: Sat Mar 16 12:25:26 2024 -0400 FateId to use UUID instead of long (#4388) - FateId now uses a 128bit UUID instead of a (64bit) long - FateIds created by ZooStore and AccumuloStore now use a v4 UUID (random UUID) - FateIds created by FateIdGenerator now use a v3 UUID (name based) so the same FateKey gives the same UUID - Necessary updates to classes and tests which used the long id --- .../accumulo/core/fate/AbstractFateStore.java | 12 +- .../java/org/apache/accumulo/core/fate/FateId.java | 56 ++++--- .../org/apache/accumulo/core/fate/ZooStore.java | 8 +- .../accumulo/core/fate/accumulo/AccumuloStore.java | 8 +- .../core/fate/zookeeper/ZooReservation.java | 2 +- .../accumulo/core/manager/thrift/TFateId.java | 125 ++++++++-------- core/src/main/thrift/manager.thrift | 2 +- .../org/apache/accumulo/core/fate/TestStore.java | 4 +- .../core/metadata/schema/SelectedFilesTest.java | 19 ++- .../core/metadata/schema/TabletMetadataTest.java | 61 ++++---- .../server/compaction/CompactionConfigStorage.java | 4 +- .../constraints/MetadataConstraintsTest.java | 52 +++---- .../server/manager/state/TabletManagementTest.java | 8 +- .../server/util/fateCommand/SummaryReportTest.java | 3 +- .../server/util/fateCommand/TxnDetailsTest.java | 14 +- .../accumulo/manager/FateServiceHandler.java | 8 +- .../coordinator/CompactionCoordinator.java | 3 +- .../compaction/CompactionCoordinatorTest.java | 6 +- .../manager/tableOps/ShutdownTServerTest.java | 3 +- .../manager/tableOps/merge/MergeTabletsTest.java | 4 +- .../manager/tableOps/split/UpdateTabletsTest.java | 16 +- .../org/apache/accumulo/test/ScanServerIT.java | 3 +- .../test/fate/accumulo/AccumuloFateIT.java | 2 +- .../test/fate/accumulo/AccumuloStoreIT.java | 19 ++- .../test/fate/accumulo/FateMutatorImplIT.java | 10 +- .../accumulo/test/fate/accumulo/FateStoreIT.java | 12 +- .../test/fate/zookeeper/ZooStoreFateIT.java | 2 +- .../test/fate/zookeeper/ZookeeperFateIT.java | 2 +- .../test/functional/AmpleConditionalWriterIT.java | 161 ++++++++++----------- .../test/functional/ManagerAssignmentIT.java | 3 +- .../apache/accumulo/test/functional/MergeIT.java | 4 +- .../accumulo/test/functional/SplitRecoveryIT.java | 3 +- .../functional/TabletManagementIteratorIT.java | 5 +- 33 files changed, 334 insertions(+), 310 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/fate/AbstractFateStore.java b/core/src/main/java/org/apache/accumulo/core/fate/AbstractFateStore.java index d805b230b2..0bec78d196 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/AbstractFateStore.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/AbstractFateStore.java @@ -35,6 +35,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; @@ -48,8 +49,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; -import com.google.common.hash.HashCode; -import com.google.common.hash.Hashing; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -64,9 +63,8 @@ public abstract class AbstractFateStore<T> implements FateStore<T> { public static final FateIdGenerator DEFAULT_FATE_ID_GENERATOR = new FateIdGenerator() { @Override public FateId fromTypeAndKey(FateInstanceType instanceType, FateKey fateKey) { - HashCode hashCode = Hashing.murmur3_128().hashBytes(fateKey.getSerialized()); - long tid = hashCode.asLong() & 0x7fffffffffffffffL; - return FateId.from(instanceType, tid); + UUID txUUID = UUID.nameUUIDFromBytes(fateKey.getSerialized()); + return FateId.from(instanceType, txUUID); } }; @@ -271,9 +269,9 @@ public abstract class AbstractFateStore<T> implements FateStore<T> { // mean a collision if (status == TStatus.NEW) { Preconditions.checkState(tFateKey.isPresent(), "Tx Key is missing from tid %s", - fateId.getTid()); + fateId.getTxUUIDStr()); Preconditions.checkState(fateKey.equals(tFateKey.orElseThrow()), - "Collision detected for tid %s", fateId.getTid()); + "Collision detected for tid %s", fateId.getTxUUIDStr()); // Case 2: Status is some other state which means already in progress // so we can just log and return empty optional } else { diff --git a/core/src/main/java/org/apache/accumulo/core/fate/FateId.java b/core/src/main/java/org/apache/accumulo/core/fate/FateId.java index 8907c6879c..e398ef4efe 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/FateId.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/FateId.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.core.fate; +import java.util.UUID; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -25,21 +26,21 @@ import java.util.stream.Stream; import org.apache.accumulo.core.data.AbstractId; import org.apache.accumulo.core.manager.thrift.TFateId; import org.apache.accumulo.core.manager.thrift.TFateInstanceType; -import org.apache.accumulo.core.util.FastFormat; /** * A strongly typed FATE Transaction ID. This is used to uniquely identify a FATE transaction. - * Consists of its {@link FateInstanceType} and its transaction id (long). The canonical string is - * of the form "FATE:[FateInstanceType]:[hex long tid]" (without the brackets). + * Consists of its {@link FateInstanceType} and its transaction {@link UUID}. The canonical string + * is of the form "FATE:[FateInstanceType]:[UUID]" (without the brackets). */ public class FateId extends AbstractId<FateId> { private static final long serialVersionUID = 1L; private static final String PREFIX = "FATE:"; - private static final Pattern HEX_PATTERN = Pattern.compile("^[0-9a-fA-F]+$"); + private static final String UUID_REGEX = "[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}"; + private static final Pattern UUID_PATTERN = Pattern.compile("^" + UUID_REGEX + "$"); private static final Pattern FATEID_PATTERN = Pattern.compile("^" + PREFIX + "(" - + Stream.of(FateInstanceType.values()).map(Enum::name).collect(Collectors.joining("|")) - + "):[0-9a-fA-F]+$"); + + Stream.of(FateInstanceType.values()).map(Enum::name).collect(Collectors.joining("|")) + "):" + + UUID_REGEX + "$"); private FateId(String canonical) { super(canonical); @@ -53,16 +54,16 @@ public class FateId extends AbstractId<FateId> { } /** - * @return the decimal value of the transaction id + * @return the transaction {@link UUID} */ - public long getTid() { - return Long.parseLong(getHexTid(), 16); + public UUID getTxUUID() { + return UUID.fromString(getTxUUIDStr()); } /** - * @return the hexadecimal value of the transaction id + * @return the transaction {@link UUID} as a String */ - public String getHexTid() { + public String getTxUUIDStr() { return canonical().split(":")[2]; } @@ -70,25 +71,25 @@ public class FateId extends AbstractId<FateId> { * Creates a new FateId object from the given parameters * * @param type the {@link FateInstanceType} - * @param tid the decimal transaction id + * @param txUUID the {@link UUID} * @return a new FateId object */ - public static FateId from(FateInstanceType type, long tid) { - return new FateId(PREFIX + type + ":" + formatTid(tid)); + public static FateId from(FateInstanceType type, UUID txUUID) { + return new FateId(PREFIX + type + ":" + txUUID); } /** * Creates a new FateId object from the given parameters * * @param type the {@link FateInstanceType} - * @param hexTid the hexadecimal transaction id + * @param txUUIDStr the transaction {@link UUID} as a String * @return a new FateId object */ - public static FateId from(FateInstanceType type, String hexTid) { - if (HEX_PATTERN.matcher(hexTid).matches()) { - return new FateId(PREFIX + type + ":" + hexTid); + public static FateId from(FateInstanceType type, String txUUIDStr) { + if (UUID_PATTERN.matcher(txUUIDStr).matches()) { + return new FateId(PREFIX + type + ":" + txUUIDStr); } else { - throw new IllegalArgumentException("Invalid Hex Transaction ID: " + hexTid); + throw new IllegalArgumentException("Invalid Transaction UUID: " + txUUIDStr); } } @@ -118,7 +119,7 @@ public class FateId extends AbstractId<FateId> { */ public static FateId fromThrift(TFateId tFateId) { FateInstanceType type; - long tid = tFateId.getTid(); + String txUUIDStr = tFateId.getTxUUIDStr(); switch (tFateId.getType()) { case USER: @@ -131,7 +132,11 @@ public class FateId extends AbstractId<FateId> { throw new IllegalArgumentException("Invalid TFateInstanceType: " + tFateId.getType()); } - return new FateId(PREFIX + type + ":" + formatTid(tid)); + if (UUID_PATTERN.matcher(txUUIDStr).matches()) { + return new FateId(PREFIX + type + ":" + txUUIDStr); + } else { + throw new IllegalArgumentException("Invalid Transaction UUID: " + txUUIDStr); + } } /** @@ -151,13 +156,6 @@ public class FateId extends AbstractId<FateId> { default: throw new IllegalArgumentException("Invalid FateInstanceType: " + type); } - return new TFateId(thriftType, getTid()); - } - - /** - * Returns the hex string equivalent of the tid - */ - public static String formatTid(long tid) { - return FastFormat.toHexString(tid); + return new TFateId(thriftType, getTxUUIDStr()); } } diff --git a/core/src/main/java/org/apache/accumulo/core/fate/ZooStore.java b/core/src/main/java/org/apache/accumulo/core/fate/ZooStore.java index af6fd233de..77f7a50a6e 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/ZooStore.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/ZooStore.java @@ -20,7 +20,6 @@ package org.apache.accumulo.core.fate; import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly; import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static org.apache.accumulo.core.util.LazySingletons.RANDOM; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -32,6 +31,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.UUID; import java.util.function.Supplier; import java.util.stream.Stream; @@ -62,7 +62,7 @@ public class ZooStore<T> extends AbstractFateStore<T> { private ZooReaderWriter zk; private String getTXPath(FateId fateId) { - return path + "/tx_" + fateId.getHexTid(); + return path + "/tx_" + fateId.getTxUUIDStr(); } public ZooStore(String path, ZooReaderWriter zk) throws KeeperException, InterruptedException { @@ -88,9 +88,7 @@ public class ZooStore<T> extends AbstractFateStore<T> { public FateId create() { while (true) { try { - // looking at the code for SecureRandom, it appears to be thread safe - long tid = RANDOM.get().nextLong() & 0x7fffffffffffffffL; - FateId fateId = FateId.from(fateInstanceType, tid); + FateId fateId = FateId.from(fateInstanceType, UUID.randomUUID()); zk.putPersistentData(getTXPath(fateId), new NodeValue(TStatus.NEW).serialize(), NodeExistsPolicy.FAIL); return fateId; diff --git a/core/src/main/java/org/apache/accumulo/core/fate/accumulo/AccumuloStore.java b/core/src/main/java/org/apache/accumulo/core/fate/accumulo/AccumuloStore.java index 24ccb43baf..86438326c1 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/accumulo/AccumuloStore.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/accumulo/AccumuloStore.java @@ -18,13 +18,12 @@ */ package org.apache.accumulo.core.fate.accumulo; -import static org.apache.accumulo.core.util.LazySingletons.RANDOM; - import java.io.Serializable; import java.util.List; import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; +import java.util.UUID; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -116,8 +115,7 @@ public class AccumuloStore<T> extends AbstractFateStore<T> { } public FateId getFateId() { - long tid = RANDOM.get().nextLong() & 0x7fffffffffffffffL; - return FateId.from(fateInstanceType, tid); + return FateId.from(fateInstanceType, UUID.randomUUID()); } @Override @@ -250,7 +248,7 @@ public class AccumuloStore<T> extends AbstractFateStore<T> { } public static String getRowId(FateId fateId) { - return "tx_" + fateId.getHexTid(); + return "tx_" + fateId.getTxUUIDStr(); } private FateMutatorImpl<T> newMutator(FateId fateId) { diff --git a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ZooReservation.java b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ZooReservation.java index 8c6a918301..88d7cbedef 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ZooReservation.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ZooReservation.java @@ -30,7 +30,7 @@ import org.slf4j.LoggerFactory; public class ZooReservation { - private static final String DELIMITER = "-"; + private static final String DELIMITER = "_"; public static boolean attempt(ZooReaderWriter zk, String path, FateId fateId, String debugInfo) throws KeeperException, InterruptedException { diff --git a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/TFateId.java b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/TFateId.java index d781407397..eab7a23068 100644 --- a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/TFateId.java +++ b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/TFateId.java @@ -29,7 +29,7 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("TFateId"); private static final org.apache.thrift.protocol.TField TYPE_FIELD_DESC = new org.apache.thrift.protocol.TField("type", org.apache.thrift.protocol.TType.I32, (short)1); - private static final org.apache.thrift.protocol.TField TID_FIELD_DESC = new org.apache.thrift.protocol.TField("tid", org.apache.thrift.protocol.TType.I64, (short)2); + private static final org.apache.thrift.protocol.TField TX_UUIDSTR_FIELD_DESC = new org.apache.thrift.protocol.TField("txUUIDStr", org.apache.thrift.protocol.TType.STRING, (short)2); private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new TFateIdStandardSchemeFactory(); private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new TFateIdTupleSchemeFactory(); @@ -39,7 +39,7 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields * @see TFateInstanceType */ public @org.apache.thrift.annotation.Nullable TFateInstanceType type; // required - public long tid; // required + public @org.apache.thrift.annotation.Nullable java.lang.String txUUIDStr; // required /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ public enum _Fields implements org.apache.thrift.TFieldIdEnum { @@ -48,7 +48,7 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields * @see TFateInstanceType */ TYPE((short)1, "type"), - TID((short)2, "tid"); + TX_UUIDSTR((short)2, "txUUIDStr"); private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>(); @@ -66,8 +66,8 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields switch(fieldId) { case 1: // TYPE return TYPE; - case 2: // TID - return TID; + case 2: // TX_UUIDSTR + return TX_UUIDSTR; default: return null; } @@ -111,15 +111,13 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields } // isset id assignments - private static final int __TID_ISSET_ID = 0; - private byte __isset_bitfield = 0; public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; static { java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); tmpMap.put(_Fields.TYPE, new org.apache.thrift.meta_data.FieldMetaData("type", org.apache.thrift.TFieldRequirementType.DEFAULT, new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, TFateInstanceType.class))); - tmpMap.put(_Fields.TID, new org.apache.thrift.meta_data.FieldMetaData("tid", org.apache.thrift.TFieldRequirementType.DEFAULT, - new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64))); + tmpMap.put(_Fields.TX_UUIDSTR, new org.apache.thrift.meta_data.FieldMetaData("txUUIDStr", org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TFateId.class, metaDataMap); } @@ -129,23 +127,23 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields public TFateId( TFateInstanceType type, - long tid) + java.lang.String txUUIDStr) { this(); this.type = type; - this.tid = tid; - setTidIsSet(true); + this.txUUIDStr = txUUIDStr; } /** * Performs a deep copy on <i>other</i>. */ public TFateId(TFateId other) { - __isset_bitfield = other.__isset_bitfield; if (other.isSetType()) { this.type = other.type; } - this.tid = other.tid; + if (other.isSetTxUUIDStr()) { + this.txUUIDStr = other.txUUIDStr; + } } @Override @@ -156,8 +154,7 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields @Override public void clear() { this.type = null; - setTidIsSet(false); - this.tid = 0; + this.txUUIDStr = null; } /** @@ -193,27 +190,29 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields } } - public long getTid() { - return this.tid; + @org.apache.thrift.annotation.Nullable + public java.lang.String getTxUUIDStr() { + return this.txUUIDStr; } - public TFateId setTid(long tid) { - this.tid = tid; - setTidIsSet(true); + public TFateId setTxUUIDStr(@org.apache.thrift.annotation.Nullable java.lang.String txUUIDStr) { + this.txUUIDStr = txUUIDStr; return this; } - public void unsetTid() { - __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __TID_ISSET_ID); + public void unsetTxUUIDStr() { + this.txUUIDStr = null; } - /** Returns true if field tid is set (has been assigned a value) and false otherwise */ - public boolean isSetTid() { - return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __TID_ISSET_ID); + /** Returns true if field txUUIDStr is set (has been assigned a value) and false otherwise */ + public boolean isSetTxUUIDStr() { + return this.txUUIDStr != null; } - public void setTidIsSet(boolean value) { - __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __TID_ISSET_ID, value); + public void setTxUUIDStrIsSet(boolean value) { + if (!value) { + this.txUUIDStr = null; + } } @Override @@ -227,11 +226,11 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields } break; - case TID: + case TX_UUIDSTR: if (value == null) { - unsetTid(); + unsetTxUUIDStr(); } else { - setTid((java.lang.Long)value); + setTxUUIDStr((java.lang.String)value); } break; @@ -245,8 +244,8 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields case TYPE: return getType(); - case TID: - return getTid(); + case TX_UUIDSTR: + return getTxUUIDStr(); } throw new java.lang.IllegalStateException(); @@ -262,8 +261,8 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields switch (field) { case TYPE: return isSetType(); - case TID: - return isSetTid(); + case TX_UUIDSTR: + return isSetTxUUIDStr(); } throw new java.lang.IllegalStateException(); } @@ -290,12 +289,12 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields return false; } - boolean this_present_tid = true; - boolean that_present_tid = true; - if (this_present_tid || that_present_tid) { - if (!(this_present_tid && that_present_tid)) + boolean this_present_txUUIDStr = true && this.isSetTxUUIDStr(); + boolean that_present_txUUIDStr = true && that.isSetTxUUIDStr(); + if (this_present_txUUIDStr || that_present_txUUIDStr) { + if (!(this_present_txUUIDStr && that_present_txUUIDStr)) return false; - if (this.tid != that.tid) + if (!this.txUUIDStr.equals(that.txUUIDStr)) return false; } @@ -310,7 +309,9 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields if (isSetType()) hashCode = hashCode * 8191 + type.getValue(); - hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(tid); + hashCode = hashCode * 8191 + ((isSetTxUUIDStr()) ? 131071 : 524287); + if (isSetTxUUIDStr()) + hashCode = hashCode * 8191 + txUUIDStr.hashCode(); return hashCode; } @@ -333,12 +334,12 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields return lastComparison; } } - lastComparison = java.lang.Boolean.compare(isSetTid(), other.isSetTid()); + lastComparison = java.lang.Boolean.compare(isSetTxUUIDStr(), other.isSetTxUUIDStr()); if (lastComparison != 0) { return lastComparison; } - if (isSetTid()) { - lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tid, other.tid); + if (isSetTxUUIDStr()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.txUUIDStr, other.txUUIDStr); if (lastComparison != 0) { return lastComparison; } @@ -375,8 +376,12 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields } first = false; if (!first) sb.append(", "); - sb.append("tid:"); - sb.append(this.tid); + sb.append("txUUIDStr:"); + if (this.txUUIDStr == null) { + sb.append("null"); + } else { + sb.append(this.txUUIDStr); + } first = false; sb.append(")"); return sb.toString(); @@ -397,8 +402,6 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { try { - // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor. - __isset_bitfield = 0; read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); } catch (org.apache.thrift.TException te) { throw new java.io.IOException(te); @@ -433,10 +436,10 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; - case 2: // TID - if (schemeField.type == org.apache.thrift.protocol.TType.I64) { - struct.tid = iprot.readI64(); - struct.setTidIsSet(true); + case 2: // TX_UUIDSTR + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.txUUIDStr = iprot.readString(); + struct.setTxUUIDStrIsSet(true); } else { org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } @@ -462,9 +465,11 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields oprot.writeI32(struct.type.getValue()); oprot.writeFieldEnd(); } - oprot.writeFieldBegin(TID_FIELD_DESC); - oprot.writeI64(struct.tid); - oprot.writeFieldEnd(); + if (struct.txUUIDStr != null) { + oprot.writeFieldBegin(TX_UUIDSTR_FIELD_DESC); + oprot.writeString(struct.txUUIDStr); + oprot.writeFieldEnd(); + } oprot.writeFieldStop(); oprot.writeStructEnd(); } @@ -487,15 +492,15 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields if (struct.isSetType()) { optionals.set(0); } - if (struct.isSetTid()) { + if (struct.isSetTxUUIDStr()) { optionals.set(1); } oprot.writeBitSet(optionals, 2); if (struct.isSetType()) { oprot.writeI32(struct.type.getValue()); } - if (struct.isSetTid()) { - oprot.writeI64(struct.tid); + if (struct.isSetTxUUIDStr()) { + oprot.writeString(struct.txUUIDStr); } } @@ -508,8 +513,8 @@ public class TFateId implements org.apache.thrift.TBase<TFateId, TFateId._Fields struct.setTypeIsSet(true); } if (incoming.get(1)) { - struct.tid = iprot.readI64(); - struct.setTidIsSet(true); + struct.txUUIDStr = iprot.readString(); + struct.setTxUUIDStrIsSet(true); } } } diff --git a/core/src/main/thrift/manager.thrift b/core/src/main/thrift/manager.thrift index f87298e301..f9b5882f07 100644 --- a/core/src/main/thrift/manager.thrift +++ b/core/src/main/thrift/manager.thrift @@ -171,7 +171,7 @@ enum TFateInstanceType { struct TFateId { 1:TFateInstanceType type - 2:i64 tid + 2:string txUUIDStr } service FateService { diff --git a/core/src/test/java/org/apache/accumulo/core/fate/TestStore.java b/core/src/test/java/org/apache/accumulo/core/fate/TestStore.java index 50046a4b9b..db2d7da770 100644 --- a/core/src/test/java/org/apache/accumulo/core/fate/TestStore.java +++ b/core/src/test/java/org/apache/accumulo/core/fate/TestStore.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; @@ -43,7 +44,6 @@ import org.apache.accumulo.core.util.Pair; */ public class TestStore implements FateStore<String> { - private long nextId = 1; private final Map<FateId,Pair<TStatus,Optional<FateKey>>> statuses = new HashMap<>(); private final Map<FateId,Map<Fate.TxInfo,Serializable>> txInfos = new HashMap<>(); private final Set<FateId> reserved = new HashSet<>(); @@ -51,7 +51,7 @@ public class TestStore implements FateStore<String> { @Override public FateId create() { - FateId fateId = FateId.from(fateInstanceType, nextId++); + FateId fateId = FateId.from(fateInstanceType, UUID.randomUUID()); statuses.put(fateId, new Pair<>(TStatus.NEW, Optional.empty())); return fateId; } diff --git a/core/src/test/java/org/apache/accumulo/core/metadata/schema/SelectedFilesTest.java b/core/src/test/java/org/apache/accumulo/core/metadata/schema/SelectedFilesTest.java index a0a02f3d1c..a8bd1e67da 100644 --- a/core/src/test/java/org/apache/accumulo/core/metadata/schema/SelectedFilesTest.java +++ b/core/src/test/java/org/apache/accumulo/core/metadata/schema/SelectedFilesTest.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -53,7 +54,7 @@ public class SelectedFilesTest { @Test public void testSerializationDeserialization() { Set<StoredTabletFile> files = getStoredTabletFiles(2); - FateId fateId = FateId.from(FateInstanceType.META, 12345L); + FateId fateId = FateId.from(FateInstanceType.META, UUID.randomUUID()); SelectedFiles original = new SelectedFiles(files, true, fateId); @@ -70,7 +71,7 @@ public class SelectedFilesTest { @Test public void testEqualSerialization() { Set<StoredTabletFile> files = getStoredTabletFiles(16); - FateId fateId = FateId.from(FateInstanceType.META, 12345L); + FateId fateId = FateId.from(FateInstanceType.META, UUID.randomUUID()); SelectedFiles sf1 = new SelectedFiles(files, true, fateId); SelectedFiles sf2 = new SelectedFiles(files, true, fateId); @@ -87,7 +88,7 @@ public class SelectedFilesTest { public void testDifferentFilesOrdering() { Set<StoredTabletFile> files = getStoredTabletFiles(16); SortedSet<StoredTabletFile> sortedFiles = new TreeSet<>(files); - FateId fateId = FateId.from(FateInstanceType.META, 654123L); + FateId fateId = FateId.from(FateInstanceType.META, UUID.randomUUID()); assertEquals(files, sortedFiles, "Entries in test file sets should be the same"); assertNotEquals(files.toString(), sortedFiles.toString(), @@ -108,7 +109,7 @@ public class SelectedFilesTest { public void testJsonSuperSetSubset() { Set<StoredTabletFile> filesSuperSet = getStoredTabletFiles(3); Set<StoredTabletFile> filesSubSet = new HashSet<>(filesSuperSet); - FateId fateId = FateId.from(FateInstanceType.META, 123456L); + FateId fateId = FateId.from(FateInstanceType.META, UUID.randomUUID()); // Remove an element to create a subset filesSubSet.remove(filesSubSet.iterator().next()); @@ -133,9 +134,11 @@ public class SelectedFilesTest { } private static Stream<Arguments> provideTestJsons() { - return Stream.of(Arguments.of("FATE:META:123456", true, 12), - Arguments.of("FATE:META:123456", false, 12), Arguments.of("FATE:META:123456", false, 23), - Arguments.of("FATE:META:654321", false, 23), Arguments.of("FATE:META:AE56E", false, 23)); + return Stream.of(Arguments.of("FATE:META:12345678-9abc-def1-2345-6789abcdef12", true, 12), + Arguments.of("FATE:META:12345678-9abc-def1-2345-6789abcdef12", false, 12), + Arguments.of("FATE:META:12345678-9abc-def1-2345-6789abcdef12", false, 23), + Arguments.of("FATE:META:abcdef12-3456-789a-bcde-f123456789ab", false, 23), + Arguments.of("FATE:META:41b40c7c-55e5-4d3b-8d21-1b70d1e7f3fb", false, 23)); } /** @@ -175,7 +178,7 @@ public class SelectedFilesTest { * * <pre> * { - * "fateId": "FATE:META:123456", + * "fateId": "FATE:META:12345678-9abc-def1-2345-6789abcdef12", * "selAll": true, * "files": ["/path/to/file1.rf", "/path/to/file2.rf"] * } diff --git a/core/src/test/java/org/apache/accumulo/core/metadata/schema/TabletMetadataTest.java b/core/src/test/java/org/apache/accumulo/core/metadata/schema/TabletMetadataTest.java index 3e1f45786e..eda2f2f2ba 100644 --- a/core/src/test/java/org/apache/accumulo/core/metadata/schema/TabletMetadataTest.java +++ b/core/src/test/java/org/apache/accumulo/core/metadata/schema/TabletMetadataTest.java @@ -99,8 +99,8 @@ public class TabletMetadataTest { Mutation mutation = TabletColumnFamily.createPrevRowMutation(extent); FateInstanceType type = FateInstanceType.fromTableId(extent.tableId()); - FateId fateId56L = FateId.from(type, 56L); - FateId fateId59L = FateId.from(type, 59L); + FateId fateId1 = FateId.from(type, UUID.randomUUID()); + FateId fateId2 = FateId.from(type, UUID.randomUUID()); DIRECTORY_COLUMN.put(mutation, new Value("t-0001757")); FLUSH_COLUMN.put(mutation, new Value("6")); @@ -108,8 +108,8 @@ public class TabletMetadataTest { String bf1 = serialize("hdfs://nn1/acc/tables/1/t-0001/bf1"); String bf2 = serialize("hdfs://nn1/acc/tables/1/t-0001/bf2"); - mutation.at().family(BulkFileColumnFamily.NAME).qualifier(bf1).put(fateId56L.canonical()); - mutation.at().family(BulkFileColumnFamily.NAME).qualifier(bf2).put(fateId59L.canonical()); + mutation.at().family(BulkFileColumnFamily.NAME).qualifier(bf1).put(fateId1.canonical()); + mutation.at().family(BulkFileColumnFamily.NAME).qualifier(bf2).put(fateId2.canonical()); mutation.at().family(ClonedColumnFamily.NAME).qualifier("").put("OK"); @@ -135,8 +135,8 @@ public class TabletMetadataTest { mutation.at().family(ScanFileColumnFamily.NAME).qualifier(sf2.getMetadata()).put(""); MERGED_COLUMN.put(mutation, new Value()); - mutation.put(UserCompactionRequestedColumnFamily.STR_NAME, FateId.from(type, 17).canonical(), - ""); + FateId userCompactFateId = FateId.from(type, UUID.randomUUID()); + mutation.put(UserCompactionRequestedColumnFamily.STR_NAME, userCompactFateId.canonical(), ""); var unsplittableMeta = UnSplittableMetadata.toUnSplittable(extent, 100, 110, 120, Set.of(sf1, sf2)); SplitColumnFamily.UNSPLITTABLE_COLUMN.put(mutation, new Value(unsplittableMeta.toBase64())); @@ -156,7 +156,7 @@ public class TabletMetadataTest { tm.getFileSize()); assertEquals(6L, tm.getFlushId().getAsLong()); assertEquals(rowMap, tm.getKeyValues()); - assertEquals(Map.of(new StoredTabletFile(bf1), fateId56L, new StoredTabletFile(bf2), fateId59L), + assertEquals(Map.of(new StoredTabletFile(bf1), fateId1, new StoredTabletFile(bf2), fateId2), tm.getLoaded()); assertEquals(HostAndPort.fromParts("server1", 8555), tm.getLocation().getHostAndPort()); assertEquals("s001", tm.getLocation().getSession()); @@ -172,7 +172,7 @@ public class TabletMetadataTest { assertEquals("M123456789", tm.getTime().encode()); assertEquals(Set.of(sf1, sf2), Set.copyOf(tm.getScans())); assertTrue(tm.hasMerged()); - assertTrue(tm.getUserCompactionsRequested().contains(FateId.from(type, 17))); + assertTrue(tm.getUserCompactionsRequested().contains(userCompactFateId)); assertEquals(unsplittableMeta, tm.getUnSplittable()); } @@ -344,19 +344,19 @@ public class TabletMetadataTest { public void testCompactionRequestedColumn() { KeyExtent extent = new KeyExtent(TableId.of("5"), new Text("df"), new Text("da")); FateInstanceType type = FateInstanceType.fromTableId(extent.tableId()); + FateId userCompactFateId1 = FateId.from(type, UUID.randomUUID()); + FateId userCompactFateId2 = FateId.from(type, UUID.randomUUID()); // Test column set Mutation mutation = TabletColumnFamily.createPrevRowMutation(extent); - mutation.put(UserCompactionRequestedColumnFamily.STR_NAME, FateId.from(type, 17).canonical(), - ""); - mutation.put(UserCompactionRequestedColumnFamily.STR_NAME, FateId.from(type, 18).canonical(), - ""); + mutation.put(UserCompactionRequestedColumnFamily.STR_NAME, userCompactFateId1.canonical(), ""); + mutation.put(UserCompactionRequestedColumnFamily.STR_NAME, userCompactFateId2.canonical(), ""); TabletMetadata tm = TabletMetadata.convertRow(toRowMap(mutation).entrySet().iterator(), EnumSet.of(USER_COMPACTION_REQUESTED), true, false); assertEquals(2, tm.getUserCompactionsRequested().size()); - assertTrue(tm.getUserCompactionsRequested().contains(FateId.from(type, 17))); - assertTrue(tm.getUserCompactionsRequested().contains(FateId.from(type, 18))); + assertTrue(tm.getUserCompactionsRequested().contains(userCompactFateId1)); + assertTrue(tm.getUserCompactionsRequested().contains(userCompactFateId2)); // Column not set mutation = TabletColumnFamily.createPrevRowMutation(extent); @@ -503,11 +503,16 @@ public class TabletMetadataTest { StoredTabletFile sf4 = new ReferencedTabletFile(new Path("hdfs://nn1/acc/tables/1/t-0001/sf4.rf")).insert(); + FateId loadedFateId1 = FateId.from(type, UUID.randomUUID()); + FateId loadedFateId2 = FateId.from(type, UUID.randomUUID()); + FateId compactFateId1 = FateId.from(type, UUID.randomUUID()); + FateId compactFateId2 = FateId.from(type, UUID.randomUUID()); + TabletMetadata tm = TabletMetadata.builder(extent) .putTabletAvailability(TabletAvailability.UNHOSTED).putLocation(Location.future(ser1)) - .putFile(sf1, dfv1).putFile(sf2, dfv2).putBulkFile(rf1, FateId.from(type, 25)) - .putBulkFile(rf2, FateId.from(type, 35)).putFlushId(27).putDirName("dir1").putScan(sf3) - .putScan(sf4).putCompacted(FateId.from(type, 17)).putCompacted(FateId.from(type, 23)) + .putFile(sf1, dfv1).putFile(sf2, dfv2).putBulkFile(rf1, loadedFateId1) + .putBulkFile(rf2, loadedFateId2).putFlushId(27).putDirName("dir1").putScan(sf3).putScan(sf4) + .putCompacted(compactFateId1).putCompacted(compactFateId2) .build(ECOMP, HOSTING_REQUESTED, MERGED, USER_COMPACTION_REQUESTED, UNSPLITTABLE); assertEquals(extent, tm.getExtent()); @@ -517,12 +522,11 @@ public class TabletMetadataTest { assertEquals(Map.of(sf1, dfv1, sf2, dfv2), tm.getFilesMap()); assertEquals(tm.getFilesMap().values().stream().mapToLong(DataFileValue::getSize).sum(), tm.getFileSize()); - assertEquals(Map.of(rf1.insert(), FateId.from(type, 25L), rf2.insert(), FateId.from(type, 35L)), - tm.getLoaded()); + assertEquals(Map.of(rf1.insert(), loadedFateId1, rf2.insert(), loadedFateId2), tm.getLoaded()); assertEquals("dir1", tm.getDirName()); assertEquals(Set.of(sf3, sf4), Set.copyOf(tm.getScans())); assertEquals(Set.of(), tm.getExternalCompactions().keySet()); - assertEquals(Set.of(FateId.from(type, 17L), FateId.from(type, 23L)), tm.getCompacted()); + assertEquals(Set.of(compactFateId1, compactFateId2), tm.getCompacted()); assertFalse(tm.getHostingRequested()); assertTrue(tm.getUserCompactionsRequested().isEmpty()); assertFalse(tm.hasMerged()); @@ -532,7 +536,7 @@ public class TabletMetadataTest { assertThrows(IllegalStateException.class, tm::getTime); TabletOperationId opid1 = - TabletOperationId.from(TabletOperationType.SPLITTING, FateId.from(type, 55)); + TabletOperationId.from(TabletOperationType.SPLITTING, FateId.from(type, UUID.randomUUID())); TabletMetadata tm2 = TabletMetadata.builder(extent).putOperation(opid1).build(LOCATION); assertEquals(extent, tm2.getExtent()); @@ -555,21 +559,22 @@ public class TabletMetadataTest { assertThrows(IllegalStateException.class, tm2::getUnSplittable); var ecid1 = ExternalCompactionId.generate(UUID.randomUUID()); - CompactionMetadata ecm = new CompactionMetadata(Set.of(sf1, sf2), rf1, "cid1", - CompactionKind.USER, (short) 3, CompactorGroupId.of("Q1"), true, FateId.from(type, 99L)); + CompactionMetadata ecm = + new CompactionMetadata(Set.of(sf1, sf2), rf1, "cid1", CompactionKind.USER, (short) 3, + CompactorGroupId.of("Q1"), true, FateId.from(type, UUID.randomUUID())); LogEntry le1 = LogEntry.fromPath("localhost+8020/" + UUID.randomUUID()); LogEntry le2 = LogEntry.fromPath("localhost+8020/" + UUID.randomUUID()); - SelectedFiles selFiles = new SelectedFiles(Set.of(sf1, sf4), false, FateId.from(type, 159L)); + FateId selFilesFateId = FateId.from(type, UUID.randomUUID()); + SelectedFiles selFiles = new SelectedFiles(Set.of(sf1, sf4), false, selFilesFateId); var unsplittableMeta = UnSplittableMetadata.toUnSplittable(extent, 100, 110, 120, Set.of(sf1, sf2)); TabletMetadata tm3 = TabletMetadata.builder(extent).putExternalCompaction(ecid1, ecm) .putSuspension(ser1, 45L).putTime(new MetadataTime(479, TimeType.LOGICAL)).putWal(le1) .putWal(le2).setHostingRequested().putSelectedFiles(selFiles).setMerged() - .putUserCompactionRequested(FateId.from(type, 159L)).setUnSplittable(unsplittableMeta) - .build(); + .putUserCompactionRequested(selFilesFateId).setUnSplittable(unsplittableMeta).build(); assertEquals(Set.of(ecid1), tm3.getExternalCompactions().keySet()); assertEquals(Set.of(sf1, sf2), tm3.getExternalCompactions().get(ecid1).getJobFiles()); @@ -580,11 +585,11 @@ public class TabletMetadataTest { assertEquals(Stream.of(le1, le2).map(LogEntry::toString).collect(toSet()), tm3.getLogs().stream().map(LogEntry::toString).collect(toSet())); assertEquals(Set.of(sf1, sf4), tm3.getSelectedFiles().getFiles()); - assertEquals(FateId.from(type, 159L), tm3.getSelectedFiles().getFateId()); + assertEquals(selFilesFateId, tm3.getSelectedFiles().getFateId()); assertFalse(tm3.getSelectedFiles().initiallySelectedAll()); assertEquals(selFiles.getMetadataValue(), tm3.getSelectedFiles().getMetadataValue()); assertTrue(tm3.hasMerged()); - assertTrue(tm3.getUserCompactionsRequested().contains(FateId.from(type, 159L))); + assertTrue(tm3.getUserCompactionsRequested().contains(selFilesFateId)); assertEquals(unsplittableMeta, tm3.getUnSplittable()); } diff --git a/server/base/src/main/java/org/apache/accumulo/server/compaction/CompactionConfigStorage.java b/server/base/src/main/java/org/apache/accumulo/server/compaction/CompactionConfigStorage.java index da0233a215..0b0bedb645 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/compaction/CompactionConfigStorage.java +++ b/server/base/src/main/java/org/apache/accumulo/server/compaction/CompactionConfigStorage.java @@ -42,11 +42,11 @@ import org.apache.zookeeper.KeeperException; import com.google.common.base.Preconditions; public class CompactionConfigStorage { - static final String DELIMITER = "-"; + static final String DELIMITER = "_"; private static String createPath(ServerContext context, FateId fateId) { return context.getZooKeeperRoot() + Constants.ZCOMPACTIONS + "/" + fateId.getType() + DELIMITER - + fateId.getHexTid(); + + fateId.getTxUUIDStr(); } public static byte[] encodeConfig(CompactionConfig config, TableId tableId) { diff --git a/server/base/src/test/java/org/apache/accumulo/server/constraints/MetadataConstraintsTest.java b/server/base/src/test/java/org/apache/accumulo/server/constraints/MetadataConstraintsTest.java index 5f3132acd3..b36fb31583 100644 --- a/server/base/src/test/java/org/apache/accumulo/server/constraints/MetadataConstraintsTest.java +++ b/server/base/src/test/java/org/apache/accumulo/server/constraints/MetadataConstraintsTest.java @@ -28,6 +28,7 @@ import java.lang.reflect.Method; import java.util.Base64; import java.util.List; import java.util.Set; +import java.util.UUID; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Mutation; @@ -147,15 +148,15 @@ public class MetadataConstraintsTest { MetadataConstraints mc = new MetadataConstraints(); Mutation m; List<Short> violations; - FateId fateId5L = FateId.from(FateInstanceType.META, 5L); - FateId fateId7L = FateId.from(FateInstanceType.META, 7L); + FateId fateId1 = FateId.from(FateInstanceType.META, UUID.randomUUID()); + FateId fateId2 = FateId.from(FateInstanceType.META, UUID.randomUUID()); // loaded marker w/ file m = new Mutation(new Text("0;foo")); m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); m.put( DataFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), @@ -168,7 +169,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 8); // two files w/ same txid @@ -176,7 +177,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); m.put( DataFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), @@ -184,7 +185,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile2")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); m.put( DataFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile2")).getMetadataText(), @@ -197,7 +198,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); m.put( DataFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), @@ -205,7 +206,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile2")).getMetadataText(), - new Value(fateId7L.canonical())); + new Value(fateId2.canonical())); m.put( DataFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile2")).getMetadataText(), @@ -217,7 +218,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); m.put( DataFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), @@ -225,7 +226,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile2")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 8); // mutation that looks like split @@ -233,7 +234,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); ServerColumnFamily.DIRECTORY_COLUMN.put(m, new Value("/t1")); violations = mc.check(createEnv(), m); assertNull(violations); @@ -243,7 +244,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); m.put(CurrentLocationColumnFamily.NAME, new Text("789"), new Value("127.0.0.1:9997")); violations = mc.check(createEnv(), m); assertNull(violations); @@ -261,7 +262,7 @@ public class MetadataConstraintsTest { new Text(StoredTabletFile.of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")) .getMetadata() .replace("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile", "/someFile")), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 12); // Missing tables directory in path @@ -270,20 +271,20 @@ public class MetadataConstraintsTest { new Text(StoredTabletFile.of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")) .getMetadata().replace("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile", "hdfs://1.2.3.4/accumulo/2a/t-0003/someFile")), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 12); m = new Mutation(new Text("0;foo")); m.put( BulkFileColumnFamily.NAME, StoredTabletFile .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")).getMetadataText(), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 8); // Bad Json - only path (old format) so should fail parsing m = new Mutation(new Text("0;foo")); m.put(BulkFileColumnFamily.NAME, new Text("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile"), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 12); // Bad Json - test startRow key is missing so validation should fail @@ -292,7 +293,7 @@ public class MetadataConstraintsTest { m.put(BulkFileColumnFamily.NAME, new Text( "{\"path\":\"hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile\",\"endRow\":\"\"}"), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 12); // Bad Json - test path key replaced with empty string so validation should fail @@ -301,7 +302,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, new Text(StoredTabletFile .serialize("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile").replace("path", "")), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 12); // Bad Json - test path value missing @@ -310,7 +311,7 @@ public class MetadataConstraintsTest { m.put(BulkFileColumnFamily.NAME, new Text(StoredTabletFile.of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile")) .getMetadata().replaceFirst("\"path\":\".*\",\"startRow", "\"path\":\"\",\"startRow")), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 12); // Bad Json - test startRow key replaced with empty string so validation should fail @@ -318,7 +319,7 @@ public class MetadataConstraintsTest { m = new Mutation(new Text("0;foo")); m.put(BulkFileColumnFamily.NAME, new Text(StoredTabletFile .serialize("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile").replace("startRow", "")), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 12); // Bad Json - test endRow key missing so validation should fail @@ -326,7 +327,7 @@ public class MetadataConstraintsTest { m.put( BulkFileColumnFamily.NAME, new Text(StoredTabletFile .serialize("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile").replace("endRow", "")), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 12); // Bad Json - endRow will be replaced with encoded row without the exclusive byte 0x00 which is @@ -337,7 +338,7 @@ public class MetadataConstraintsTest { .of(new Path("hdfs://1.2.3.4/accumulo/tables/2a/t-0003/someFile"), new Range("a", "b")) .getMetadata().replaceFirst("\"endRow\":\".*\"", "\"endRow\":\"" + encodeRowForMetadata("bad") + "\"")), - new Value(fateId5L.canonical())); + new Value(fateId1.canonical())); assertViolation(mc, m, (short) 12); } @@ -468,7 +469,8 @@ public class MetadataConstraintsTest { assertViolation(mc, m, (short) 9); m = new Mutation(new Text("0;foo")); - ServerColumnFamily.OPID_COLUMN.put(m, new Value("MERGING:FATE:META:123abc")); + ServerColumnFamily.OPID_COLUMN.put(m, + new Value("MERGING:FATE:META:12345678-9abc-def1-2345-6789abcdef12")); violations = mc.check(createEnv(), m); assertNull(violations); } @@ -478,7 +480,7 @@ public class MetadataConstraintsTest { MetadataConstraints mc = new MetadataConstraints(); Mutation m; List<Short> violations; - FateId fateId = FateId.from(FateInstanceType.META, 42L); + FateId fateId = FateId.from(FateInstanceType.META, UUID.randomUUID()); m = new Mutation(new Text("0;foo")); ServerColumnFamily.SELECTED_COLUMN.put(m, new Value("bad id")); @@ -512,7 +514,7 @@ public class MetadataConstraintsTest { MetadataConstraints mc = new MetadataConstraints(); Mutation m; List<Short> violations; - FateId fateId = FateId.from(FateInstanceType.META, 45L); + FateId fateId = FateId.from(FateInstanceType.META, UUID.randomUUID()); m = new Mutation(new Text("0;foo")); m.put(column, fateId.canonical(), ""); diff --git a/server/base/src/test/java/org/apache/accumulo/server/manager/state/TabletManagementTest.java b/server/base/src/test/java/org/apache/accumulo/server/manager/state/TabletManagementTest.java index 49729c6d4b..9bc99cd0c4 100644 --- a/server/base/src/test/java/org/apache/accumulo/server/manager/state/TabletManagementTest.java +++ b/server/base/src/test/java/org/apache/accumulo/server/manager/state/TabletManagementTest.java @@ -73,8 +73,8 @@ public class TabletManagementTest { Mutation mutation = TabletColumnFamily.createPrevRowMutation(extent); FateInstanceType type = FateInstanceType.fromTableId(extent.tableId()); - FateId fateId56L = FateId.from(type, 56L); - FateId fateId59L = FateId.from(type, 59L); + FateId fateId1 = FateId.from(type, UUID.randomUUID()); + FateId fateId2 = FateId.from(type, UUID.randomUUID()); DIRECTORY_COLUMN.put(mutation, new Value("t-0001757")); FLUSH_COLUMN.put(mutation, new Value("6")); @@ -85,9 +85,9 @@ public class TabletManagementTest { StoredTabletFile bf2 = new ReferencedTabletFile(new Path("hdfs://nn1/acc/tables/1/t-0001/bf2")).insert(); mutation.at().family(BulkFileColumnFamily.NAME).qualifier(bf1.getMetadata()) - .put(fateId56L.canonical()); + .put(fateId1.canonical()); mutation.at().family(BulkFileColumnFamily.NAME).qualifier(bf2.getMetadata()) - .put(fateId59L.canonical()); + .put(fateId2.canonical()); mutation.at().family(ClonedColumnFamily.NAME).qualifier("").put("OK"); diff --git a/server/base/src/test/java/org/apache/accumulo/server/util/fateCommand/SummaryReportTest.java b/server/base/src/test/java/org/apache/accumulo/server/util/fateCommand/SummaryReportTest.java index 4618715fbb..8b880b8767 100644 --- a/server/base/src/test/java/org/apache/accumulo/server/util/fateCommand/SummaryReportTest.java +++ b/server/base/src/test/java/org/apache/accumulo/server/util/fateCommand/SummaryReportTest.java @@ -29,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.TimeUnit; import org.apache.accumulo.core.fate.AdminUtil; @@ -73,7 +74,7 @@ class SummaryReportTest { expect(status1.getStatus()).andReturn(ReadOnlyFateStore.TStatus.IN_PROGRESS).anyTimes(); expect(status1.getTop()).andReturn(null).anyTimes(); expect(status1.getTxName()).andReturn(null).anyTimes(); - expect(status1.getFateId()).andReturn(FateId.from("FATE:USER:abcdabcd")).anyTimes(); + expect(status1.getFateId()).andReturn(FateId.from("FATE:USER:" + UUID.randomUUID())).anyTimes(); expect(status1.getHeldLocks()).andReturn(List.of()).anyTimes(); expect(status1.getWaitingLocks()).andReturn(List.of()).anyTimes(); diff --git a/server/base/src/test/java/org/apache/accumulo/server/util/fateCommand/TxnDetailsTest.java b/server/base/src/test/java/org/apache/accumulo/server/util/fateCommand/TxnDetailsTest.java index 35be83fce8..fb3d77a706 100644 --- a/server/base/src/test/java/org/apache/accumulo/server/util/fateCommand/TxnDetailsTest.java +++ b/server/base/src/test/java/org/apache/accumulo/server/util/fateCommand/TxnDetailsTest.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; +import java.util.UUID; import java.util.concurrent.TimeUnit; import org.apache.accumulo.core.fate.AdminUtil; @@ -47,6 +48,9 @@ class TxnDetailsTest { void orderingByDuration() { Map<String,String> idMap = Map.of("1", "ns1", "2", "tbl1"); + UUID uuid1 = UUID.randomUUID(); + UUID uuid2 = UUID.randomUUID(); + long now = System.currentTimeMillis(); AdminUtil.TransactionStatus status1 = createMock(AdminUtil.TransactionStatus.class); @@ -54,7 +58,7 @@ class TxnDetailsTest { expect(status1.getStatus()).andReturn(ReadOnlyFateStore.TStatus.IN_PROGRESS).anyTimes(); expect(status1.getTop()).andReturn("step1").anyTimes(); expect(status1.getTxName()).andReturn("runningTx1").anyTimes(); - expect(status1.getFateId()).andReturn(FateId.from("FATE:USER:abcdabcd")).anyTimes(); + expect(status1.getFateId()).andReturn(FateId.from("FATE:USER:" + uuid1)).anyTimes(); expect(status1.getHeldLocks()).andReturn(List.of()).anyTimes(); expect(status1.getWaitingLocks()).andReturn(List.of()).anyTimes(); @@ -63,7 +67,7 @@ class TxnDetailsTest { expect(status2.getStatus()).andReturn(ReadOnlyFateStore.TStatus.IN_PROGRESS).anyTimes(); expect(status2.getTop()).andReturn("step2").anyTimes(); expect(status2.getTxName()).andReturn("runningTx2").anyTimes(); - expect(status2.getFateId()).andReturn(FateId.from("FATE:USER:123456789")).anyTimes(); + expect(status2.getFateId()).andReturn(FateId.from("FATE:USER:" + uuid2)).anyTimes(); expect(status2.getHeldLocks()).andReturn(List.of()).anyTimes(); expect(status2.getWaitingLocks()).andReturn(List.of()).anyTimes(); @@ -80,8 +84,8 @@ class TxnDetailsTest { Iterator<FateTxnDetails> itor = sorted.iterator(); - assertTrue(itor.next().toString().contains("123456789")); - assertTrue(itor.next().toString().contains("abcdabcd")); + assertTrue(itor.next().toString().contains(uuid2.toString())); + assertTrue(itor.next().toString().contains(uuid1.toString())); verify(status1, status2); } @@ -97,7 +101,7 @@ class TxnDetailsTest { expect(status1.getStatus()).andReturn(ReadOnlyFateStore.TStatus.IN_PROGRESS).anyTimes(); expect(status1.getTop()).andReturn("step1").anyTimes(); expect(status1.getTxName()).andReturn("runningTx").anyTimes(); - expect(status1.getFateId()).andReturn(FateId.from("FATE:USER:abcdabcd")).anyTimes(); + expect(status1.getFateId()).andReturn(FateId.from("FATE:USER:" + UUID.randomUUID())).anyTimes(); // incomplete lock info (W unknown ns id, no table)) expect(status1.getHeldLocks()).andReturn(List.of("R:1", "R:2", "W:a")).anyTimes(); // blank names diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java b/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java index a530d80a15..5c2ae952d0 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java @@ -127,7 +127,7 @@ class FateServiceHandler implements FateService.Iface { throws ThriftSecurityException { authenticate(credentials); return new TFateId(type, - manager.fate(FateInstanceType.fromThrift(type)).startTransaction().getTid()); + manager.fate(FateInstanceType.fromThrift(type)).startTransaction().getTxUUIDStr()); } @Override @@ -136,9 +136,9 @@ class FateServiceHandler implements FateService.Iface { throws ThriftSecurityException, ThriftTableOperationException, ThriftPropertyException { authenticate(c); String goalMessage = op.toString() + " "; - long tid = opid.getTid(); + String txUUIDStr = opid.getTxUUIDStr(); FateInstanceType type = FateInstanceType.fromThrift(opid.getType()); - FateId fateId = FateId.from(type, tid); + FateId fateId = FateId.from(type, txUUIDStr); switch (op) { case NAMESPACE_CREATE: { @@ -949,7 +949,7 @@ class FateServiceHandler implements FateService.Iface { public Path mkTempDir(TFateId opid) throws IOException { Volume vol = manager.getVolumeManager().getFirst(); FateId fateId = FateId.fromThrift(opid); - Path p = vol.prefixChild("/tmp/fate-" + fateId.getType() + "-" + fateId.getHexTid()); + Path p = vol.prefixChild("/tmp/fate-" + fateId.getType() + "-" + fateId.getTxUUIDStr()); FileSystem fs = vol.getFileSystem(); if (fs.exists(p)) { fs.delete(p, true); diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/CompactionCoordinator.java b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/CompactionCoordinator.java index 97397c019b..174d741abb 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/CompactionCoordinator.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/CompactionCoordinator.java @@ -42,6 +42,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import java.util.Set; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -584,7 +585,7 @@ public class CompactionCoordinator }).collect(toList()); FateInstanceType type = FateInstanceType.fromTableId(metaJob.getTabletMetadata().getTableId()); - FateId fateId = FateId.from(type, 0); + FateId fateId = FateId.from(type, UUID.randomUUID()); if (metaJob.getJob().getKind() == CompactionKind.USER) { fateId = metaJob.getTabletMetadata().getSelectedFiles().getFateId(); } diff --git a/server/manager/src/test/java/org/apache/accumulo/manager/compaction/CompactionCoordinatorTest.java b/server/manager/src/test/java/org/apache/accumulo/manager/compaction/CompactionCoordinatorTest.java index 4c0b2b1d52..3619215985 100644 --- a/server/manager/src/test/java/org/apache/accumulo/manager/compaction/CompactionCoordinatorTest.java +++ b/server/manager/src/test/java/org/apache/accumulo/manager/compaction/CompactionCoordinatorTest.java @@ -179,7 +179,7 @@ public class CompactionCoordinatorTest { Set<StoredTabletFile> jobFiles, TabletMetadata tablet, String compactorAddress, ExternalCompactionId externalCompactionId) { FateInstanceType type = FateInstanceType.fromTableId(tablet.getExtent().tableId()); - FateId fateId = FateId.from(type, 1L); + FateId fateId = FateId.from(type, UUID.randomUUID()); return new CompactionMetadata(jobFiles, new ReferencedTabletFile(new Path("file:///accumulo/tables/1/default_tablet/F00001.rf")), compactorAddress, job.getKind(), job.getPriority(), job.getGroup(), true, fateId); @@ -195,7 +195,7 @@ public class CompactionCoordinatorTest { TCompactionKind.valueOf(ecm.getKind().name()), FateId .from(FateInstanceType.fromTableId(metaJob.getTabletMetadata().getExtent().tableId()), - 1L) + UUID.randomUUID()) .toThrift(), Map.of()); } @@ -402,7 +402,7 @@ public class CompactionCoordinatorTest { EasyMock.expect(context.getTableState(tableId1)).andReturn(TableState.ONLINE).atLeastOnce(); EasyMock.expect(context.getTableState(tableId2)).andReturn(TableState.OFFLINE).atLeastOnce(); - FateId fateId1 = FateId.from(FateInstanceType.USER, 1234L); + FateId fateId1 = FateId.from(FateInstanceType.USER, UUID.randomUUID()); CompactorGroupId cgid = CompactorGroupId.of("G1"); ReferencedTabletFile tmp1 = diff --git a/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/ShutdownTServerTest.java b/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/ShutdownTServerTest.java index f73a94d170..874e7424e6 100644 --- a/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/ShutdownTServerTest.java +++ b/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/ShutdownTServerTest.java @@ -24,6 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Collections; import java.util.HashMap; +import java.util.UUID; import org.apache.accumulo.core.fate.FateId; import org.apache.accumulo.core.fate.FateInstanceType; @@ -50,7 +51,7 @@ public class ShutdownTServerTest { final ShutdownTServer op = new ShutdownTServer(tserver, force); final Manager manager = EasyMock.createMock(Manager.class); - final FateId fateId = FateId.from(FateInstanceType.USER, 1L); + final FateId fateId = FateId.from(FateInstanceType.USER, UUID.randomUUID()); final TServerConnection tserverCnxn = EasyMock.createMock(TServerConnection.class); final TabletServerStatus status = new TabletServerStatus(); diff --git a/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/merge/MergeTabletsTest.java b/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/merge/MergeTabletsTest.java index eae4dff9a6..9c52e7f51e 100644 --- a/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/merge/MergeTabletsTest.java +++ b/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/merge/MergeTabletsTest.java @@ -90,7 +90,7 @@ import org.junit.jupiter.api.Test; public class MergeTabletsTest { private static final TableId tableId = TableId.of("789"); - private static final FateId fateId = FateId.from(FateInstanceType.USER, 1234L); + private static final FateId fateId = FateId.from(FateInstanceType.USER, UUID.randomUUID()); private static final TabletOperationId opid = TabletOperationId.from(TabletOperationType.MERGING, fateId); @@ -296,7 +296,7 @@ public class MergeTabletsTest { var currLoc = TabletMetadata.Location.current(tserver); testUnexpectedColumn(tmb -> tmb.putLocation(currLoc), "had location", currLoc.toString()); - var otherFateId = FateId.from(FateInstanceType.USER, 4321L); + var otherFateId = FateId.from(FateInstanceType.USER, UUID.randomUUID()); var otherOpid = TabletOperationId.from(TabletOperationType.MERGING, otherFateId); testUnexpectedColumn(tmb -> tmb.putOperation(otherOpid), "had unexpected opid", otherOpid.toString()); diff --git a/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/split/UpdateTabletsTest.java b/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/split/UpdateTabletsTest.java index aec3835875..1e9c018785 100644 --- a/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/split/UpdateTabletsTest.java +++ b/server/manager/src/test/java/org/apache/accumulo/manager/tableOps/split/UpdateTabletsTest.java @@ -193,8 +193,8 @@ public class UpdateTabletsTest { var loaded1 = newSTF(5); var loaded2 = newSTF(6); - var flid1 = FateId.from(FateInstanceType.USER, 11L); - var flid2 = FateId.from(FateInstanceType.USER, 22L); + var flid1 = FateId.from(FateInstanceType.USER, UUID.randomUUID()); + var flid2 = FateId.from(FateInstanceType.USER, UUID.randomUUID()); var loaded = Map.of(loaded1, flid1, loaded2, flid2); var dfv1 = new DataFileValue(1000, 100, 20); @@ -208,7 +208,7 @@ public class UpdateTabletsTest { var cid2 = ExternalCompactionId.generate(UUID.randomUUID()); var cid3 = ExternalCompactionId.generate(UUID.randomUUID()); - var fateId = FateId.from(FateInstanceType.USER, 42L); + var fateId = FateId.from(FateInstanceType.USER, UUID.randomUUID()); var opid = TabletOperationId.from(TabletOperationType.SPLITTING, fateId); var tabletTime = MetadataTime.parse("L30"); var flushID = OptionalLong.of(40); @@ -248,11 +248,11 @@ public class UpdateTabletsTest { SelectedFiles selectedFiles = EasyMock.mock(SelectedFiles.class); EasyMock.expect(selectedFiles.getFateId()).andReturn(null); EasyMock.expect(tabletMeta.getSelectedFiles()).andReturn(selectedFiles).atLeastOnce(); - FateId ucfid1 = FateId.from(FateInstanceType.USER, 55L); - FateId ucfid2 = FateId.from(FateInstanceType.USER, 66L); + FateId ucfid1 = FateId.from(FateInstanceType.USER, UUID.randomUUID()); + FateId ucfid2 = FateId.from(FateInstanceType.USER, UUID.randomUUID()); EasyMock.expect(tabletMeta.getUserCompactionsRequested()).andReturn(Set.of(ucfid1, ucfid2)) .atLeastOnce(); - FateId ucfid3 = FateId.from(FateInstanceType.USER, 77L); + FateId ucfid3 = FateId.from(FateInstanceType.USER, UUID.randomUUID()); EasyMock.expect(tabletMeta.getCompacted()).andReturn(Set.of(ucfid1, ucfid3)).atLeastOnce(); EasyMock.expect(tabletMeta.getScans()).andReturn(List.of(file1, file2)).atLeastOnce(); EasyMock.expect(tabletMeta.getTime()).andReturn(tabletTime).atLeastOnce(); @@ -376,7 +376,7 @@ public class UpdateTabletsTest { TableId tableId = TableId.of("123"); KeyExtent origExtent = new KeyExtent(tableId, new Text("m"), null); - var fateId = FateId.from(FateInstanceType.USER, 42L); + var fateId = FateId.from(FateInstanceType.USER, UUID.randomUUID()); var opid = TabletOperationId.from(TabletOperationType.SPLITTING, fateId); // Test splitting a tablet with a location @@ -393,7 +393,7 @@ public class UpdateTabletsTest { assertTrue(e.getMessage().contains("null")); // Test splitting a tablet with an unexpected operation id - var fateId2 = FateId.from(FateInstanceType.USER, 24L); + var fateId2 = FateId.from(FateInstanceType.USER, UUID.randomUUID()); var opid2 = TabletOperationId.from(TabletOperationType.SPLITTING, fateId2); var tablet3 = TabletMetadata.builder(origExtent).putOperation(opid2).build(); e = assertThrows(IllegalStateException.class, () -> testError(origExtent, tablet3, fateId)); diff --git a/test/src/main/java/org/apache/accumulo/test/ScanServerIT.java b/test/src/main/java/org/apache/accumulo/test/ScanServerIT.java index 3ecb58bd6c..8d1270ab31 100644 --- a/test/src/main/java/org/apache/accumulo/test/ScanServerIT.java +++ b/test/src/main/java/org/apache/accumulo/test/ScanServerIT.java @@ -34,6 +34,7 @@ import java.util.Objects; import java.util.Properties; import java.util.SortedSet; import java.util.TreeSet; +import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -270,7 +271,7 @@ public class ScanServerIT extends SharedMiniClusterBase { // Set operationIds on all the table's tablets so that they won't be loaded. FateInstanceType type = FateInstanceType.fromTableId(tid); - FateId fateId = FateId.from(type, 1234L); + FateId fateId = FateId.from(type, UUID.randomUUID()); TabletOperationId opid = TabletOperationId.from(TabletOperationType.SPLITTING, fateId); Ample ample = getCluster().getServerContext().getAmple(); ServerAmpleImpl sai = (ServerAmpleImpl) ample; diff --git a/test/src/main/java/org/apache/accumulo/test/fate/accumulo/AccumuloFateIT.java b/test/src/main/java/org/apache/accumulo/test/fate/accumulo/AccumuloFateIT.java index eb3743326e..e4a944c41f 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/accumulo/AccumuloFateIT.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/accumulo/AccumuloFateIT.java @@ -78,6 +78,6 @@ public class AccumuloFateIT extends FateIT { } private static Range getRow(FateId fateId) { - return new Range("tx_" + fateId.getHexTid()); + return new Range("tx_" + fateId.getTxUUIDStr()); } } diff --git a/test/src/main/java/org/apache/accumulo/test/fate/accumulo/AccumuloStoreIT.java b/test/src/main/java/org/apache/accumulo/test/fate/accumulo/AccumuloStoreIT.java index cb38235242..0430abfc01 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/accumulo/AccumuloStoreIT.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/accumulo/AccumuloStoreIT.java @@ -24,9 +24,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import java.util.TreeSet; +import java.util.UUID; import java.util.stream.Collectors; import org.apache.accumulo.core.client.Accumulo; @@ -93,7 +94,7 @@ public class AccumuloStoreIT extends SharedMiniClusterBase { if (fateIdIterator.hasNext()) { return fateIdIterator.next(); } else { - return FateId.from(fateInstanceType, -1L); + return FateId.from(fateInstanceType, UUID.randomUUID()); } } @@ -155,10 +156,16 @@ public class AccumuloStoreIT extends SharedMiniClusterBase { (ClientContext) Accumulo.newClient().from(getClientProps()).build()) { createFateTable(client, table); - List<Long> txids = List.of(1L, 1L, 1L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L); + UUID[] uuids = new UUID[5]; + for (int i = 0; i < uuids.length; i++) { + uuids[i] = UUID.randomUUID(); + } + List<UUID> txids = + List.of(uuids[0], uuids[0], uuids[0], uuids[1], uuids[2], uuids[2], uuids[2], uuids[2], + uuids[3], uuids[3], uuids[4], uuids[4], uuids[4], uuids[4], uuids[4], uuids[4]); List<FateId> fateIds = txids.stream().map(txid -> FateId.from(fateInstanceType, txid)) .collect(Collectors.toList()); - Set<FateId> expectedFateIds = new TreeSet<>(fateIds); + Set<FateId> expectedFateIds = new LinkedHashSet<>(fateIds); TestAccumuloStore store = new TestAccumuloStore(client, table, fateIds); // call create and expect we get the unique txids @@ -187,7 +194,7 @@ public class AccumuloStoreIT extends SharedMiniClusterBase { client = (ClientContext) Accumulo.newClient().from(getClientProps()).build(); tableName = getUniqueNames(1)[0]; createFateTable(client, tableName); - fateId = FateId.from(fateInstanceType, 1L); + fateId = FateId.from(fateInstanceType, UUID.randomUUID()); store = new TestAccumuloStore(client, tableName, List.of(fateId)); store.create(); txStore = store.reserve(fateId); @@ -250,7 +257,7 @@ public class AccumuloStoreIT extends SharedMiniClusterBase { private void injectStatus(ClientContext client, String table, FateId fateId, TStatus status) throws TableNotFoundException { try (BatchWriter writer = client.createBatchWriter(table)) { - Mutation mutation = new Mutation(new Text("tx_" + fateId.getHexTid())); + Mutation mutation = new Mutation(new Text("tx_" + fateId.getTxUUIDStr())); FateSchema.TxColumnFamily.STATUS_COLUMN.put(mutation, new Value(status.name())); writer.addMutation(mutation); } catch (MutationsRejectedException e) { diff --git a/test/src/main/java/org/apache/accumulo/test/fate/accumulo/FateMutatorImplIT.java b/test/src/main/java/org/apache/accumulo/test/fate/accumulo/FateMutatorImplIT.java index d5481bbab8..a9410df845 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/accumulo/FateMutatorImplIT.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/accumulo/FateMutatorImplIT.java @@ -20,11 +20,11 @@ package org.apache.accumulo.test.fate.accumulo; import static org.apache.accumulo.core.fate.accumulo.FateMutator.Status.ACCEPTED; import static org.apache.accumulo.core.fate.accumulo.FateMutator.Status.REJECTED; -import static org.apache.accumulo.core.util.LazySingletons.RANDOM; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import java.time.Duration; +import java.util.UUID; import org.apache.accumulo.core.client.Accumulo; import org.apache.accumulo.core.client.AccumuloClient; @@ -72,8 +72,8 @@ public class FateMutatorImplIT extends SharedMiniClusterBase { ClientContext context = (ClientContext) client; - final long tid = RANDOM.get().nextLong() & 0x7fffffffffffffffL; - FateId fateId = FateId.from(FateInstanceType.fromNamespaceOrTableName(table), tid); + FateId fateId = + FateId.from(FateInstanceType.fromNamespaceOrTableName(table), UUID.randomUUID()); // add some repos in order FateMutatorImpl<FateIT.TestEnv> fateMutator = new FateMutatorImpl<>(context, table, fateId); @@ -103,8 +103,8 @@ public class FateMutatorImplIT extends SharedMiniClusterBase { ClientContext context = (ClientContext) client; - final long tid = RANDOM.get().nextLong() & 0x7fffffffffffffffL; - FateId fateId = FateId.from(FateInstanceType.fromNamespaceOrTableName(table), tid); + FateId fateId = + FateId.from(FateInstanceType.fromNamespaceOrTableName(table), UUID.randomUUID()); // use require status passing all statuses. without the status column present this should fail assertThrows(IllegalStateException.class, diff --git a/test/src/main/java/org/apache/accumulo/test/fate/accumulo/FateStoreIT.java b/test/src/main/java/org/apache/accumulo/test/fate/accumulo/FateStoreIT.java index 63e8d64703..582e18fb59 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/accumulo/FateStoreIT.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/accumulo/FateStoreIT.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.test.fate.accumulo; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -365,10 +366,11 @@ public abstract class FateStoreIT extends SharedMiniClusterBase implements FateT @Test public void testCreateWithKeyCollision() throws Exception { - // Replace the default hasing algorithm with one that always returns the same tid so + // Replace the default hashing algorithm with one that always returns the same tid so // we can check duplicate detection with different keys executeTest(this::testCreateWithKeyCollision, AbstractFateStore.DEFAULT_MAX_DEFERRED, - (instanceType, fateKey) -> FateId.from(instanceType, 1000)); + (instanceType, fateKey) -> FateId.from(instanceType, + UUID.nameUUIDFromBytes("testing uuid".getBytes(UTF_8)))); } protected void testCreateWithKeyCollision(FateStore<TestEnv> store, ServerContext sctx) { @@ -382,7 +384,9 @@ public abstract class FateStoreIT extends SharedMiniClusterBase implements FateT FateTxStore<TestEnv> txStore = store.createAndReserve(fateKey1).orElseThrow(); try { var e = assertThrows(IllegalStateException.class, () -> create(store, fateKey2)); - assertEquals("Collision detected for tid 1000", e.getMessage()); + assertEquals( + "Collision detected for tid " + UUID.nameUUIDFromBytes("testing uuid".getBytes(UTF_8)), + e.getMessage()); assertEquals(fateKey1, txStore.getKey().orElseThrow()); } finally { txStore.delete(); @@ -410,7 +414,7 @@ public abstract class FateStoreIT extends SharedMiniClusterBase implements FateT // and use the existing transaction, which we should. deleteKey(fateId, sctx); var e = assertThrows(IllegalStateException.class, () -> store.createAndReserve(fateKey)); - assertEquals("Tx Key is missing from tid " + fateId.getTid(), e.getMessage()); + assertEquals("Tx Key is missing from tid " + fateId.getTxUUIDStr(), e.getMessage()); // We should still be able to reserve and continue when not using a key // just like a normal transaction diff --git a/test/src/main/java/org/apache/accumulo/test/fate/zookeeper/ZooStoreFateIT.java b/test/src/main/java/org/apache/accumulo/test/fate/zookeeper/ZooStoreFateIT.java index c679e0d54f..1b99cdb8a5 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/zookeeper/ZooStoreFateIT.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/zookeeper/ZooStoreFateIT.java @@ -99,7 +99,7 @@ public class ZooStoreFateIT extends FateStoreIT { // Get the existing status for the node and build a new node with an empty key // but uses the existing tid - String txPath = ZK_ROOT + Constants.ZFATE + "/tx_" + fateId.getHexTid(); + String txPath = ZK_ROOT + Constants.ZFATE + "/tx_" + fateId.getTxUUIDStr(); Object currentNode = serializedCons.newInstance(new Object[] {zk.getData(txPath)}); TStatus currentStatus = (TStatus) nodeStatus.get(currentNode); // replace the node with no key and just a tid and existing status diff --git a/test/src/main/java/org/apache/accumulo/test/fate/zookeeper/ZookeeperFateIT.java b/test/src/main/java/org/apache/accumulo/test/fate/zookeeper/ZookeeperFateIT.java index c8688a8951..f66f226781 100644 --- a/test/src/main/java/org/apache/accumulo/test/fate/zookeeper/ZookeeperFateIT.java +++ b/test/src/main/java/org/apache/accumulo/test/fate/zookeeper/ZookeeperFateIT.java @@ -95,7 +95,7 @@ public class ZookeeperFateIT extends FateIT { private static TStatus getTxStatus(ZooReaderWriter zrw, FateId fateId) throws KeeperException, InterruptedException { zrw.sync(ZK_ROOT); - String txdir = String.format("%s%s/tx_%s", ZK_ROOT, Constants.ZFATE, fateId.getHexTid()); + String txdir = String.format("%s%s/tx_%s", ZK_ROOT, Constants.ZFATE, fateId.getTxUUIDStr()); try (DataInputBuffer buffer = new DataInputBuffer()) { var serialized = zrw.getData(txdir); diff --git a/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java b/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java index fa35d5fc21..48255dc82a 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java @@ -319,7 +319,7 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { ctmi = new ConditionalTabletsMutatorImpl(context); var tm6 = TabletMetadata.builder(e1).build(LOADED); FateInstanceType type = FateInstanceType.fromTableId(tid); - FateId fateId = FateId.from(type, 9L); + FateId fateId = FateId.from(type, UUID.randomUUID()); ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm6, LOADED) .putFile(stf5, new DataFileValue(0, 0)).putBulkFile(stf5.getTabletFile(), fateId) .putFile(stf5, new DataFileValue(0, 0)).submit(tm -> false); @@ -464,9 +464,10 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { ctmi = new ConditionalTabletsMutatorImpl(context); FateInstanceType type = FateInstanceType.fromTableId(tid); - FateId fateId2L = FateId.from(type, 2L); + FateId fateId1 = FateId.from(type, UUID.randomUUID()); + FateId fateId2 = FateId.from(type, UUID.randomUUID()); ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, FILES, SELECTED) - .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId2L)) + .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId1)) .submit(tm -> false); results = ctmi.process(); assertEquals(Status.REJECTED, results.get(e1).getStatus()); @@ -478,7 +479,7 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { .build(SELECTED); ctmi = new ConditionalTabletsMutatorImpl(context); ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2, FILES, SELECTED) - .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId2L)) + .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId1)) .submit(tm -> false); results = ctmi.process(); assertEquals(Status.ACCEPTED, results.get(e1).getStatus()); @@ -490,12 +491,11 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { // a list of selected files objects that are not the same as the current tablet and expected to // fail var expectedToFail = new ArrayList<SelectedFiles>(); - FateId fateId3L = FateId.from(type, 3L); - expectedToFail.add(new SelectedFiles(Set.of(stf1, stf2), true, fateId2L)); - expectedToFail.add(new SelectedFiles(Set.of(stf1, stf2, stf3, stf4), true, fateId2L)); - expectedToFail.add(new SelectedFiles(Set.of(stf1, stf2, stf3), false, fateId2L)); - expectedToFail.add(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId3L)); + expectedToFail.add(new SelectedFiles(Set.of(stf1, stf2), true, fateId1)); + expectedToFail.add(new SelectedFiles(Set.of(stf1, stf2, stf3, stf4), true, fateId1)); + expectedToFail.add(new SelectedFiles(Set.of(stf1, stf2, stf3), false, fateId1)); + expectedToFail.add(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId2)); for (var selectedFiles : expectedToFail) { var tm3 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv).putFile(stf3, dfv) @@ -512,7 +512,7 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { } var tm5 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv).putFile(stf3, dfv) - .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId2L)).build(); + .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId1)).build(); ctmi = new ConditionalTabletsMutatorImpl(context); ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES, SELECTED) .deleteSelectedFiles().submit(tm -> false); @@ -540,7 +540,7 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { final Set<StoredTabletFile> storedTabletFiles = Set.of(stf1, stf2, stf3); final boolean initiallySelectedAll = true; final FateInstanceType type = FateInstanceType.fromTableId(tid); - final FateId fateId = FateId.from(type, 2L); + final FateId fateId = FateId.from(type, UUID.randomUUID()); final SelectedFiles selectedFiles = new SelectedFiles(storedTabletFiles, initiallySelectedAll, fateId); @@ -632,7 +632,7 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { * * <pre> * { - * "fateId": "FATE:META:123456", + * "fateId": "FATE:META:12345678-9abc-def1-2345-6789abcdef12", * "selAll": true, * "files": ["/path/to/file1.rf", "/path/to/file2.rf"] * } @@ -702,8 +702,8 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { var context = cluster.getServerContext(); FateInstanceType type = FateInstanceType.fromTableId(tid); - FateId fateId1 = FateId.from(type, "1234"); - FateId fateId2 = FateId.from(type, "5678"); + FateId fateId1 = FateId.from(type, UUID.randomUUID()); + FateId fateId2 = FateId.from(type, UUID.randomUUID()); var opid1 = TabletOperationId.from(TabletOperationType.SPLITTING, fateId1); var opid2 = TabletOperationId.from(TabletOperationType.MERGING, fateId2); @@ -756,69 +756,69 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { var ctmi = new ConditionalTabletsMutatorImpl(context); FateInstanceType type = FateInstanceType.fromTableId(tid); - FateId fateId45L = FateId.from(type, 45L); - FateId fateId55L = FateId.from(type, 55L); - FateId fateId56L = FateId.from(type, 56L); - FateId fateId65L = FateId.from(type, 65L); - FateId fateId75L = FateId.from(type, 75L); + FateId fateId1 = FateId.from(type, UUID.randomUUID()); + FateId fateId2 = FateId.from(type, UUID.randomUUID()); + FateId fateId3 = FateId.from(type, UUID.randomUUID()); + FateId fateId4 = FateId.from(type, UUID.randomUUID()); + FateId fateId5 = FateId.from(type, UUID.randomUUID()); var tabletMeta1 = TabletMetadata.builder(e1).build(COMPACTED); ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED) - .putCompacted(fateId55L) - .submit(tabletMetadata -> tabletMetadata.getCompacted().contains(fateId55L)); - var tabletMeta2 = TabletMetadata.builder(e2).putCompacted(fateId45L).build(COMPACTED); + .putCompacted(fateId2) + .submit(tabletMetadata -> tabletMetadata.getCompacted().contains(fateId2)); + var tabletMeta2 = TabletMetadata.builder(e2).putCompacted(fateId1).build(COMPACTED); ctmi.mutateTablet(e2).requireAbsentOperation().requireSame(tabletMeta2, COMPACTED) - .putCompacted(fateId56L) - .submit(tabletMetadata -> tabletMetadata.getCompacted().contains(fateId56L)); + .putCompacted(fateId3) + .submit(tabletMetadata -> tabletMetadata.getCompacted().contains(fateId3)); var results = ctmi.process(); assertEquals(Status.ACCEPTED, results.get(e1).getStatus()); assertEquals(Status.REJECTED, results.get(e2).getStatus()); tabletMeta1 = context.getAmple().readTablet(e1); - assertEquals(Set.of(fateId55L), tabletMeta1.getCompacted()); + assertEquals(Set.of(fateId2), tabletMeta1.getCompacted()); assertEquals(Set.of(), context.getAmple().readTablet(e2).getCompacted()); ctmi = new ConditionalTabletsMutatorImpl(context); ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED) - .putCompacted(fateId65L).putCompacted(fateId75L).submit(tabletMetadata -> false); + .putCompacted(fateId4).putCompacted(fateId5).submit(tabletMetadata -> false); results = ctmi.process(); assertEquals(Status.ACCEPTED, results.get(e1).getStatus()); tabletMeta1 = context.getAmple().readTablet(e1); - assertEquals(Set.of(fateId55L, fateId65L, fateId75L), tabletMeta1.getCompacted()); + assertEquals(Set.of(fateId2, fateId4, fateId5), tabletMeta1.getCompacted()); // test require same with a superset ctmi = new ConditionalTabletsMutatorImpl(context); - tabletMeta1 = TabletMetadata.builder(e2).putCompacted(fateId55L).putCompacted(fateId65L) - .putCompacted(fateId75L).putCompacted(fateId45L).build(COMPACTED); + tabletMeta1 = TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4) + .putCompacted(fateId5).putCompacted(fateId1).build(COMPACTED); ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED) - .deleteCompacted(fateId55L).deleteCompacted(fateId65L).deleteCompacted(fateId75L) + .deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5) .submit(tabletMetadata -> false); results = ctmi.process(); assertEquals(Status.REJECTED, results.get(e1).getStatus()); - assertEquals(Set.of(fateId55L, fateId65L, fateId75L), + assertEquals(Set.of(fateId2, fateId4, fateId5), context.getAmple().readTablet(e1).getCompacted()); // test require same with a subset ctmi = new ConditionalTabletsMutatorImpl(context); - tabletMeta1 = TabletMetadata.builder(e2).putCompacted(fateId55L).putCompacted(fateId65L) - .build(COMPACTED); + tabletMeta1 = + TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4).build(COMPACTED); ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED) - .deleteCompacted(fateId55L).deleteCompacted(fateId65L).deleteCompacted(fateId75L) + .deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5) .submit(tabletMetadata -> false); results = ctmi.process(); assertEquals(Status.REJECTED, results.get(e1).getStatus()); - assertEquals(Set.of(fateId55L, fateId65L, fateId75L), + assertEquals(Set.of(fateId2, fateId4, fateId5), context.getAmple().readTablet(e1).getCompacted()); // now use the exact set the tablet has ctmi = new ConditionalTabletsMutatorImpl(context); - tabletMeta1 = TabletMetadata.builder(e2).putCompacted(fateId55L).putCompacted(fateId65L) - .putCompacted(fateId75L).build(COMPACTED); + tabletMeta1 = TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4) + .putCompacted(fateId5).build(COMPACTED); ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED) - .deleteCompacted(fateId55L).deleteCompacted(fateId65L).deleteCompacted(fateId75L) + .deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5) .submit(tabletMetadata -> false); results = ctmi.process(); assertEquals(Status.ACCEPTED, results.get(e1).getStatus()); @@ -837,8 +837,8 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { assertNull(rootMeta.getOperationId()); FateInstanceType type = FateInstanceType.fromTableId(RootTable.EXTENT.tableId()); - FateId fateId = FateId.from(type, 7); - TabletOperationId opid = TabletOperationId.from(TabletOperationType.MERGING, fateId); + TabletOperationId opid = + TabletOperationId.from(TabletOperationType.MERGING, FateId.from(type, UUID.randomUUID())); var ctmi = new ConditionalTabletsMutatorImpl(context); ctmi.mutateTablet(RootTable.EXTENT).requireAbsentOperation().requireAbsentLocation() @@ -904,80 +904,77 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { var ctmi = new ConditionalTabletsMutatorImpl(context); FateInstanceType type = FateInstanceType.fromTableId(tid); - FateId fateId45L = FateId.from(type, 45L); - FateId fateId55L = FateId.from(type, 55L); - FateId fateId56L = FateId.from(type, 56L); - FateId fateId65L = FateId.from(type, 65L); - FateId fateId75L = FateId.from(type, 75L); + FateId fateId1 = FateId.from(type, UUID.randomUUID()); + FateId fateId2 = FateId.from(type, UUID.randomUUID()); + FateId fateId3 = FateId.from(type, UUID.randomUUID()); + FateId fateId4 = FateId.from(type, UUID.randomUUID()); + FateId fateId5 = FateId.from(type, UUID.randomUUID()); var tabletMeta1 = TabletMetadata.builder(e1).build(USER_COMPACTION_REQUESTED); ctmi.mutateTablet(e1).requireAbsentOperation() - .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId55L) - .submit( - tabletMetadata -> tabletMetadata.getUserCompactionsRequested().contains(fateId55L)); - var tabletMeta2 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId45L) + .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId2) + .submit(tabletMetadata -> tabletMetadata.getUserCompactionsRequested().contains(fateId2)); + var tabletMeta2 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId1) .build(USER_COMPACTION_REQUESTED); ctmi.mutateTablet(e2).requireAbsentOperation() - .requireSame(tabletMeta2, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId56L) - .submit( - tabletMetadata -> tabletMetadata.getUserCompactionsRequested().contains(fateId56L)); + .requireSame(tabletMeta2, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId3) + .submit(tabletMetadata -> tabletMetadata.getUserCompactionsRequested().contains(fateId3)); var results = ctmi.process(); assertEquals(Status.ACCEPTED, results.get(e1).getStatus()); assertEquals(Status.REJECTED, results.get(e2).getStatus()); tabletMeta1 = context.getAmple().readTablet(e1); - assertEquals(Set.of(fateId55L), tabletMeta1.getUserCompactionsRequested()); + assertEquals(Set.of(fateId2), tabletMeta1.getUserCompactionsRequested()); assertEquals(Set.of(), context.getAmple().readTablet(e2).getUserCompactionsRequested()); ctmi = new ConditionalTabletsMutatorImpl(context); ctmi.mutateTablet(e1).requireAbsentOperation() - .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId65L) - .putUserCompactionRequested(fateId75L).submit(tabletMetadata -> false); + .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId4) + .putUserCompactionRequested(fateId5).submit(tabletMetadata -> false); results = ctmi.process(); assertEquals(Status.ACCEPTED, results.get(e1).getStatus()); tabletMeta1 = context.getAmple().readTablet(e1); - assertEquals(Set.of(fateId55L, fateId65L, fateId75L), - tabletMeta1.getUserCompactionsRequested()); + assertEquals(Set.of(fateId2, fateId4, fateId5), tabletMeta1.getUserCompactionsRequested()); // test require same with a superset ctmi = new ConditionalTabletsMutatorImpl(context); - tabletMeta1 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId55L) - .putUserCompactionRequested(fateId65L).putUserCompactionRequested(fateId75L) - .putUserCompactionRequested(fateId45L).build(USER_COMPACTION_REQUESTED); + tabletMeta1 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId2) + .putUserCompactionRequested(fateId4).putUserCompactionRequested(fateId5) + .putUserCompactionRequested(fateId1).build(USER_COMPACTION_REQUESTED); ctmi.mutateTablet(e1).requireAbsentOperation() .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED) - .deleteUserCompactionRequested(fateId55L).deleteUserCompactionRequested(fateId65L) - .deleteUserCompactionRequested(fateId75L).submit(tabletMetadata -> false); + .deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4) + .deleteUserCompactionRequested(fateId5).submit(tabletMetadata -> false); results = ctmi.process(); assertEquals(Status.REJECTED, results.get(e1).getStatus()); - assertEquals(Set.of(fateId55L, fateId65L, fateId75L), + assertEquals(Set.of(fateId2, fateId4, fateId5), context.getAmple().readTablet(e1).getUserCompactionsRequested()); // test require same with a subset ctmi = new ConditionalTabletsMutatorImpl(context); - tabletMeta1 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId55L) - .putUserCompactionRequested(fateId65L).build(USER_COMPACTION_REQUESTED); + tabletMeta1 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId2) + .putUserCompactionRequested(fateId4).build(USER_COMPACTION_REQUESTED); ctmi.mutateTablet(e1).requireAbsentOperation() .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED) - .deleteUserCompactionRequested(fateId55L).deleteUserCompactionRequested(fateId65L) - .deleteUserCompactionRequested(fateId75L).submit(tabletMetadata -> false); + .deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4) + .deleteUserCompactionRequested(fateId5).submit(tabletMetadata -> false); results = ctmi.process(); assertEquals(Status.REJECTED, results.get(e1).getStatus()); - assertEquals(Set.of(fateId55L, fateId65L, fateId75L), + assertEquals(Set.of(fateId2, fateId4, fateId5), context.getAmple().readTablet(e1).getUserCompactionsRequested()); // now use the exact set the tablet has ctmi = new ConditionalTabletsMutatorImpl(context); - tabletMeta1 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId55L) - .putUserCompactionRequested(fateId65L).putUserCompactionRequested(fateId75L) + tabletMeta1 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId2) + .putUserCompactionRequested(fateId4).putUserCompactionRequested(fateId5) .build(USER_COMPACTION_REQUESTED); ctmi.mutateTablet(e1).requireAbsentOperation() .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED) - .deleteUserCompactionRequested(fateId55L).deleteUserCompactionRequested(fateId65L) - .deleteUserCompactionRequested(fateId75L).submit(tabletMetadata -> false); + .deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4) + .deleteUserCompactionRequested(fateId5).submit(tabletMetadata -> false); results = ctmi.process(); assertEquals(Status.ACCEPTED, results.get(e1).getStatus()); assertEquals(Set.of(), context.getAmple().readTablet(e1).getUserCompactionsRequested()); @@ -1044,9 +1041,9 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { final Set<KeyExtent> tabletsWithWalCompactFlush = Set.of(e1, e2, e3); for (KeyExtent ke : tabletsWithWalCompactFlush) { FateInstanceType type = FateInstanceType.fromTableId(ke.tableId()); - FateId fateId34L = FateId.from(type, 34L); + FateId fateId = FateId.from(type, UUID.randomUUID()); ctmi = new ConditionalTabletsMutatorImpl(context); - ctmi.mutateTablet(ke).requireAbsentOperation().putCompacted(fateId34L) + ctmi.mutateTablet(ke).requireAbsentOperation().putCompacted(fateId) .putFlushId(TestTabletMetadataFilter.VALID_FLUSH_ID).putWal(wal) .submit(tabletMetadata -> false); var results = ctmi.process(); @@ -1086,15 +1083,15 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { ConditionalTabletsMutatorImpl ctmi = new ConditionalTabletsMutatorImpl(context); Set<TabletMetadataFilter> filter = Set.of(new TestTabletMetadataFilter()); FateInstanceType type = FateInstanceType.fromTableId(tid); - FateId fateId34L = FateId.from(type, 34L); - FateId fateId987L = FateId.from(type, 987L); + FateId fateId1 = FateId.from(type, UUID.randomUUID()); + FateId fateId2 = FateId.from(type, UUID.randomUUID()); // make sure we read all tablets on table initially with no filters testFilterApplied(context, Set.of(), Set.of(e1, e2, e3, e4), "Initially, all tablets should be present"); // Set compacted on e2 but with no flush ID - ctmi.mutateTablet(e2).requireAbsentOperation().putCompacted(fateId34L) + ctmi.mutateTablet(e2).requireAbsentOperation().putCompacted(fateId1) .submit(tabletMetadata -> false); var results = ctmi.process(); assertEquals(Status.ACCEPTED, results.get(e2).getStatus()); @@ -1121,7 +1118,7 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { // Set compacted and correct flush ID on e3 ctmi = new ConditionalTabletsMutatorImpl(context); - ctmi.mutateTablet(e3).requireAbsentOperation().putCompacted(fateId987L) + ctmi.mutateTablet(e3).requireAbsentOperation().putCompacted(fateId2) .putFlushId(TestTabletMetadataFilter.VALID_FLUSH_ID).submit(tabletMetadata -> false); results = ctmi.process(); assertEquals(Status.ACCEPTED, results.get(e3).getStatus()); @@ -1296,8 +1293,8 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { // run a test where a subset of tablets are modified, all modifications should be accepted FateInstanceType type = FateInstanceType.fromTableId(tableId); - FateId fateId1 = FateId.from(type, 50); - var opid1 = TabletOperationId.from(TabletOperationType.MERGING, fateId1); + var opid1 = + TabletOperationId.from(TabletOperationType.MERGING, FateId.from(type, UUID.randomUUID())); int expected = 0; try (var tablets = ample.readTablets().forTable(tableId).fetch(OPID, PREV_ROW).build(); @@ -1318,8 +1315,8 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { // run test where some will be accepted and some will be rejected and ensure the counts come // out as expected. - FateId fateId2 = FateId.from(type, 51); - var opid2 = TabletOperationId.from(TabletOperationType.MERGING, fateId2); + var opid2 = + TabletOperationId.from(TabletOperationType.MERGING, FateId.from(type, UUID.randomUUID())); accepted.set(0); total.set(0); diff --git a/test/src/main/java/org/apache/accumulo/test/functional/ManagerAssignmentIT.java b/test/src/main/java/org/apache/accumulo/test/functional/ManagerAssignmentIT.java index 2e61925e65..9494a7e9dc 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/ManagerAssignmentIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/ManagerAssignmentIT.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; +import java.util.UUID; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -386,7 +387,7 @@ public class ManagerAssignmentIT extends SharedMiniClusterBase { var tableId = TableId.of(prepTableForScanTest(c, tableName)); FateInstanceType type = FateInstanceType.fromTableId(tableId); - FateId fateId = FateId.from(type, 42L); + FateId fateId = FateId.from(type, UUID.randomUUID()); assertEquals(0, countTabletsWithLocation(c, tableId)); diff --git a/test/src/main/java/org/apache/accumulo/test/functional/MergeIT.java b/test/src/main/java/org/apache/accumulo/test/functional/MergeIT.java index 1c5efc4835..765e044232 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/MergeIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/MergeIT.java @@ -692,7 +692,7 @@ public class MergeIT extends AccumuloClusterHarness { var tablet = tabletsMutator.mutateTablet(extent); ExternalCompactionId ecid = ExternalCompactionId.generate(UUID.randomUUID()); FateInstanceType type = FateInstanceType.fromTableId(tableId); - FateId fateId44L = FateId.from(type, 44L); + FateId fateId = FateId.from(type, UUID.randomUUID()); ReferencedTabletFile tmpFile = ReferencedTabletFile.of(new Path("file:///accumulo/tables/t-0/b-0/c1.rf")); @@ -700,7 +700,7 @@ public class MergeIT extends AccumuloClusterHarness { Set<StoredTabletFile> jobFiles = Set.of(StoredTabletFile.of(new Path("file:///accumulo/tables/t-0/b-0/b2.rf"))); CompactionMetadata ecMeta = new CompactionMetadata(jobFiles, tmpFile, "localhost:4444", - CompactionKind.SYSTEM, (short) 2, ceid, false, fateId44L); + CompactionKind.SYSTEM, (short) 2, ceid, false, fateId); tablet.putExternalCompaction(ecid, ecMeta); tablet.mutate(); } diff --git a/test/src/main/java/org/apache/accumulo/test/functional/SplitRecoveryIT.java b/test/src/main/java/org/apache/accumulo/test/functional/SplitRecoveryIT.java index 64b5bc46a2..fdf663e0f3 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/SplitRecoveryIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/SplitRecoveryIT.java @@ -169,7 +169,8 @@ public class SplitRecoveryIT extends ConfigurableMacBase { dataFiles.put(new ReferencedTabletFile(new Path(tdir + "/" + RFile.EXTENSION + "_000_000")), new DataFileValue(1000017 + i, 10000 + i)); - FateId fateId = FateId.from(FateInstanceType.fromTableId(extent.tableId()), 0); + FateId fateId = + FateId.from(FateInstanceType.fromTableId(extent.tableId()), UUID.randomUUID()); SortedMap<StoredTabletFile,DataFileValue> storedFiles = new TreeMap<>(MetadataTableUtil.updateTabletDataFile(fateId, extent, dataFiles, new MetadataTime(0, TimeType.LOGICAL), context, zl)); diff --git a/test/src/main/java/org/apache/accumulo/test/functional/TabletManagementIteratorIT.java b/test/src/main/java/org/apache/accumulo/test/functional/TabletManagementIteratorIT.java index 34723f3fae..22ae8c6535 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/TabletManagementIteratorIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/TabletManagementIteratorIT.java @@ -346,9 +346,8 @@ public class TabletManagementIteratorIT extends AccumuloClusterHarness { // Sets an operation type on all tablets up to the end row private void setOperationId(AccumuloClient client, String table, String tableNameToModify, Text end, TabletOperationType opType) throws TableNotFoundException { - FateInstanceType type = FateInstanceType.fromNamespaceOrTableName(table); - FateId fateId = FateId.from(type, 42L); - var opid = TabletOperationId.from(opType, fateId); + FateInstanceType instanceType = FateInstanceType.fromNamespaceOrTableName(table); + var opid = TabletOperationId.from(opType, FateId.from(instanceType, UUID.randomUUID())); TableId tableIdToModify = TableId.of(client.tableOperations().tableIdMap().get(tableNameToModify)); try (TabletsMetadata tabletsMetadata =