This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 126d83542f HDDS-9984. RatisSnapshotInfo is synchronized incorrectly.
(#5851)
126d83542f is described below
commit 126d83542ff47c8656cb6450e75ac0f9a14d20ae
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Fri Dec 22 05:07:01 2023 -0800
HDDS-9984. RatisSnapshotInfo is synchronized incorrectly. (#5851)
---
.../ozone/common/ha/ratis/RatisSnapshotInfo.java | 88 -----------
.../apache/hadoop/hdds/utils/TransactionInfo.java | 162 ++++++++-------------
.../hdds/scm/ha/SCMHADBTransactionBufferImpl.java | 7 +-
.../apache/hadoop/hdds/scm/ha/SCMStateMachine.java | 12 +-
.../hadoop/hdds/scm/TestSCMInstallSnapshot.java | 3 +-
.../ozone/scm/TestSCMInstallSnapshotWithHA.java | 5 +-
.../ozone/om/helpers/TestTransactionInfoCodec.java | 7 +-
.../org/apache/hadoop/ozone/om/OzoneManager.java | 26 ++--
.../ozone/om/ratis/OzoneManagerDoubleBuffer.java | 6 +-
.../ozone/om/ratis/OzoneManagerStateMachine.java | 28 ++--
.../om/response/upgrade/OMPrepareResponse.java | 3 +-
.../hadoop/ozone/om/TestOmMetadataManager.java | 11 +-
.../om/ratis/TestOzoneManagerRatisServer.java | 9 +-
.../om/ratis/TestOzoneManagerStateMachine.java | 5 +-
14 files changed, 102 insertions(+), 270 deletions(-)
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ha/ratis/RatisSnapshotInfo.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ha/ratis/RatisSnapshotInfo.java
deleted file mode 100644
index ebc4bba209..0000000000
---
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ha/ratis/RatisSnapshotInfo.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
under
- * the License.
- */
-
-package org.apache.hadoop.ozone.common.ha.ratis;
-
-import org.apache.ratis.server.protocol.TermIndex;
-import org.apache.ratis.server.storage.FileInfo;
-import org.apache.ratis.statemachine.SnapshotInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-import static org.apache.hadoop.ozone.OzoneConsts.TRANSACTION_INFO_SPLIT_KEY;
-
-/**
- * This class captures the snapshotIndex and term of the latest snapshot in
- * the server.
- * Ratis server loads the snapshotInfo during startup and updates the
- * lastApplied index to this snapshotIndex. SnapshotInfo does not contain
- * any files. It is used only to store/ update the last applied index and term.
- */
-public class RatisSnapshotInfo implements SnapshotInfo {
-
- static final Logger LOG = LoggerFactory.getLogger(RatisSnapshotInfo.class);
-
- private volatile long term = 0;
- private volatile long snapshotIndex = -1;
-
- public void updateTerm(long newTerm) {
- term = newTerm;
- }
-
- public void updateTermIndex(long newTerm, long newIndex) {
- this.term = newTerm;
- this.snapshotIndex = newIndex;
- }
-
- public RatisSnapshotInfo() { }
-
- public RatisSnapshotInfo(long term, long index) {
- this.term = term;
- this.snapshotIndex = index;
- }
-
- @Override
- public TermIndex getTermIndex() {
- return TermIndex.valueOf(term, snapshotIndex);
- }
-
- @Override
- public long getTerm() {
- return term;
- }
-
- @Override
- public long getIndex() {
- return snapshotIndex;
- }
-
- @Override
- public List<FileInfo> getFiles() {
- return null;
- }
-
- @Override
- public String toString() {
- StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append(term);
- stringBuilder.append(TRANSACTION_INFO_SPLIT_KEY);
- stringBuilder.append(snapshotIndex);
- return stringBuilder.toString();
- }
-}
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/TransactionInfo.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/TransactionInfo.java
index 982b6ebc41..57ee74e026 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/TransactionInfo.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/TransactionInfo.java
@@ -19,16 +19,16 @@
package org.apache.hadoop.hdds.utils;
import com.google.common.base.Preconditions;
-import org.apache.hadoop.hdds.StringUtils;
import java.io.IOException;
+import java.util.List;
import java.util.Objects;
import org.apache.hadoop.hdds.utils.db.Codec;
import org.apache.hadoop.hdds.utils.db.DelegatedCodec;
import org.apache.hadoop.hdds.utils.db.StringCodec;
-import org.apache.hadoop.ozone.common.ha.ratis.RatisSnapshotInfo;
import org.apache.ratis.server.protocol.TermIndex;
+import org.apache.ratis.server.storage.FileInfo;
import org.apache.ratis.statemachine.SnapshotInfo;
import static org.apache.hadoop.ozone.OzoneConsts.TRANSACTION_INFO_KEY;
@@ -39,97 +39,93 @@ import static
org.apache.hadoop.ozone.OzoneConsts.TRANSACTION_INFO_SPLIT_KEY;
* <p>
* This class is immutable.
*/
-public final class TransactionInfo {
+public final class TransactionInfo implements Comparable<TransactionInfo> {
private static final Codec<TransactionInfo> CODEC = new DelegatedCodec<>(
StringCodec.get(),
- TransactionInfo::new,
- TransactionInfo::generateTransactionInfo,
+ TransactionInfo::valueOf,
+ TransactionInfo::toString,
DelegatedCodec.CopyType.SHALLOW);
public static Codec<TransactionInfo> getCodec() {
return CODEC;
}
- // Term associated with Ratis Log index in Ratis enabled cluster. In
- // non-Ratis cluster, term is set to -1.
- private final long term; // term associated with the ratis log index.
- // Ratis Log index in Ratis enabled cluster or the unique transaction
- // index {@link OzoneManagerServerSideTransalatorPB#transactionIndex} in
- // non-Ratis cluster
- private final long transactionIndex;
-
- private TransactionInfo(String transactionInfo) {
- String[] tInfo =
- transactionInfo.split(TRANSACTION_INFO_SPLIT_KEY);
+ private static TransactionInfo valueOf(String transactionInfo) {
+ final String[] tInfo = transactionInfo.split(TRANSACTION_INFO_SPLIT_KEY);
Preconditions.checkArgument(tInfo.length == 2,
- "Incorrect TransactionInfo value");
+ "Unexpected split length: %s in \"%s\"", tInfo.length,
transactionInfo);
- term = Long.parseLong(tInfo[0]);
- transactionIndex = Long.parseLong(tInfo[1]);
+ try {
+ return valueOf(Long.parseLong(tInfo[0]), Long.parseLong(tInfo[1]));
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Failed to parse " + transactionInfo,
e);
+ }
+ }
+
+ public static TransactionInfo valueOf(long currentTerm, long
transactionIndex) {
+ return valueOf(TermIndex.valueOf(currentTerm, transactionIndex));
}
- private TransactionInfo(long currentTerm, long transactionIndex) {
- this.term = currentTerm;
- this.transactionIndex = transactionIndex;
+ public static TransactionInfo valueOf(TermIndex termIndex) {
+ return new TransactionInfo(termIndex);
}
public boolean isDefault() {
- return transactionIndex == -1 && term == 0;
+ return equals(DEFAULT_VALUE);
}
+ @Override
public int compareTo(TransactionInfo info) {
- if (info.getTerm() == this.getTerm()) {
- return (int)(this.getTransactionIndex() - info.getTransactionIndex());
- } else {
- return (int)(this.getTerm() - info.getTerm());
- }
+ return this.getTermIndex().compareTo(info.getTermIndex());
}
+ public static final TransactionInfo DEFAULT_VALUE = valueOf(0, -1);
+
/**
- * Get current term.
- * @return currentTerm
+ * Use {@link SnapshotInfo} to store (term, index)
+ * which is the Ratis Log term-index in Ratis enabled cluster.
+ * In non-Ratis clusters, term is -1 and index is the unique transaction
index
+ * in OzoneManagerProtocolServerSideTranslatorPB#transactionIndex.
*/
+ private final SnapshotInfo snapshotInfo;
+ /** The string need to be persisted in OM DB. */
+ private final String transactionInfoString;
+
+ private TransactionInfo(TermIndex termIndex) {
+ this.transactionInfoString = termIndex.getTerm() +
TRANSACTION_INFO_SPLIT_KEY + termIndex.getIndex();
+ this.snapshotInfo = new SnapshotInfo() {
+ @Override
+ public TermIndex getTermIndex() {
+ return termIndex;
+ }
+
+ @Override
+ public List<FileInfo> getFiles() {
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ return transactionInfoString;
+ }
+ };
+ }
+
+ /** @return Ratis Log term in Ratis enabled cluster; or -1 for non-Ratis
clusters. */
public long getTerm() {
- return term;
+ return snapshotInfo.getTerm();
}
/**
- * Get current transaction index.
- * @return transactionIndex
+ * @return Ratis Log index in Ratis enabled cluster. For non-Ratis clusters,
return the unique transaction index;
+ * see OzoneManagerProtocolServerSideTranslatorPB#transactionIndex.
*/
public long getTransactionIndex() {
- return transactionIndex;
+ return snapshotInfo.getIndex();
}
public TermIndex getTermIndex() {
- return TermIndex.valueOf(term, transactionIndex);
- }
-
- /**
- * Generate String form of transaction info which need to be persisted in OM
- * DB finally in byte array.
- * @return transaction info.
- */
- private String generateTransactionInfo() {
- return term + TRANSACTION_INFO_SPLIT_KEY + transactionIndex;
- }
-
- /**
- * Convert OMTransactionInfo to byteArray to be persisted to OM DB.
- * @return byte[]
- */
- public byte[] convertToByteArray() {
- return StringUtils.string2Bytes(generateTransactionInfo());
- }
-
- /**
- * Convert byte array persisted in DB to OMTransactionInfo.
- * @param bytes
- * @return OMTransactionInfo
- */
- public static TransactionInfo getFromByteArray(byte[] bytes) {
- String tInfo = StringUtils.bytes2String(bytes);
- return new TransactionInfo(tInfo);
+ return snapshotInfo.getTermIndex();
}
@Override
@@ -141,30 +137,21 @@ public final class TransactionInfo {
return false;
}
TransactionInfo that = (TransactionInfo) o;
- return term == that.term &&
- transactionIndex == that.transactionIndex;
- }
-
- public static TransactionInfo fromTermIndex(TermIndex termIndex) {
- return new Builder().setCurrentTerm(termIndex.getTerm())
- .setTransactionIndex(termIndex.getIndex()).build();
+ return this.getTermIndex().equals(that.getTermIndex());
}
@Override
public int hashCode() {
- return Objects.hash(term, transactionIndex);
+ return Objects.hash(getTerm(), getTransactionIndex());
}
@Override
public String toString() {
- return generateTransactionInfo();
+ return transactionInfoString;
}
/**
* Return transaction info persisted in OM DB.
- * @param metadataManager
- * @return
- * @throws IOException
*/
public static TransactionInfo readTransactionInfo(
DBStoreHAManager metadataManager) throws IOException {
@@ -172,31 +159,6 @@ public final class TransactionInfo {
}
public SnapshotInfo toSnapshotInfo() {
- return new RatisSnapshotInfo(term, transactionIndex);
- }
-
- public static Builder builder() {
- return new Builder();
- }
- /**
- * Builder to build {@link TransactionInfo}.
- */
- public static class Builder {
- private long currentTerm = 0;
- private long transactionIndex = -1;
-
- public Builder setCurrentTerm(long term) {
- this.currentTerm = term;
- return this;
- }
-
- public Builder setTransactionIndex(long tIndex) {
- this.transactionIndex = tIndex;
- return this;
- }
-
- public TransactionInfo build() {
- return new TransactionInfo(currentTerm, transactionIndex);
- }
+ return snapshotInfo;
}
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHADBTransactionBufferImpl.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHADBTransactionBufferImpl.java
index 19990dc23c..f1ee76a198 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHADBTransactionBufferImpl.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHADBTransactionBufferImpl.java
@@ -158,12 +158,7 @@ public class SCMHADBTransactionBufferImpl implements
SCMHADBTransactionBuffer {
.get(TRANSACTION_INFO_KEY);
if (latestTrxInfo == null) {
// transaction table is empty
- latestTrxInfo =
- TransactionInfo
- .builder()
- .setTransactionIndex(-1)
- .setCurrentTerm(0)
- .build();
+ latestTrxInfo = TransactionInfo.DEFAULT_VALUE;
}
latestSnapshot.set(latestTrxInfo.toSnapshotInfo());
} finally {
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMStateMachine.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMStateMachine.java
index 52320719e6..a5583b48b1 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMStateMachine.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMStateMachine.java
@@ -168,10 +168,7 @@ public class SCMStateMachine extends BaseStateMachine {
if (scm.isInSafeMode() && refreshedAfterLeaderReady.get()) {
scm.getScmSafeModeManager().refreshAndValidate();
}
- transactionBuffer.updateLatestTrxInfo(TransactionInfo.builder()
- .setCurrentTerm(trx.getLogEntry().getTerm())
- .setTransactionIndex(trx.getLogEntry().getIndex())
- .build());
+
transactionBuffer.updateLatestTrxInfo(TransactionInfo.valueOf(TermIndex.valueOf(trx.getLogEntry())));
} catch (Exception ex) {
applyTransactionFuture.completeExceptionally(ex);
ExitUtils.terminate(1, ex.getMessage(), ex, StateMachine.LOG);
@@ -320,8 +317,7 @@ public class SCMStateMachine extends BaseStateMachine {
long startTime = Time.monotonicNow();
TransactionInfo latestTrxInfo = transactionBuffer.getLatestTrxInfo();
- TransactionInfo lastAppliedTrxInfo =
- TransactionInfo.fromTermIndex(lastTermIndex);
+ final TransactionInfo lastAppliedTrxInfo =
TransactionInfo.valueOf(lastTermIndex);
if (latestTrxInfo.compareTo(lastAppliedTrxInfo) < 0) {
transactionBuffer.updateLatestTrxInfo(lastAppliedTrxInfo);
@@ -354,9 +350,7 @@ public class SCMStateMachine extends BaseStateMachine {
}
if (transactionBuffer != null) {
- transactionBuffer.updateLatestTrxInfo(
- TransactionInfo.builder().setCurrentTerm(term)
- .setTransactionIndex(index).build());
+ transactionBuffer.updateLatestTrxInfo(TransactionInfo.valueOf(term,
index));
}
if (currentLeaderTerm.get() == term) {
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMInstallSnapshot.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMInstallSnapshot.java
index 53f07abc91..c62d0d2414 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMInstallSnapshot.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMInstallSnapshot.java
@@ -139,8 +139,7 @@ public class TestSCMInstallSnapshot {
// from.
assertNotNull(db);
HAUtils.getTransactionInfoTable(db, new SCMDBDefinition())
- .put(OzoneConsts.TRANSACTION_INFO_KEY, TransactionInfo.builder()
- .setCurrentTerm(10).setTransactionIndex(100).build());
+ .put(OzoneConsts.TRANSACTION_INFO_KEY, TransactionInfo.valueOf(10,
100));
db.close();
ContainerID cid =
scm.getContainerManager().getContainers().get(0).containerID();
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/TestSCMInstallSnapshotWithHA.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/TestSCMInstallSnapshotWithHA.java
index ab9b687dce..e63c0658de 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/TestSCMInstallSnapshotWithHA.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/TestSCMInstallSnapshotWithHA.java
@@ -182,9 +182,8 @@ public class TestSCMInstallSnapshotWithHA {
SCMStateMachine followerSM =
followerSCM.getScmHAManager().getRatisServer().getSCMStateMachine();
followerSCM.getScmMetadataStore().getTransactionInfoTable().
- put(OzoneConsts.TRANSACTION_INFO_KEY, TransactionInfo.builder()
- .setCurrentTerm(lastTermIndex.getTerm())
- .setTransactionIndex(lastTermIndex.getIndex() + 100).build());
+ put(OzoneConsts.TRANSACTION_INFO_KEY,
+ TransactionInfo.valueOf(lastTermIndex.getTerm(),
lastTermIndex.getIndex() + 100));
// Advance the follower
followerSM.notifyTermIndexUpdated(lastTermIndex.getTerm(),
lastTermIndex.getIndex() + 100);
diff --git
a/hadoop-ozone/interface-storage/src/test/java/org/apache/hadoop/ozone/om/helpers/TestTransactionInfoCodec.java
b/hadoop-ozone/interface-storage/src/test/java/org/apache/hadoop/ozone/om/helpers/TestTransactionInfoCodec.java
index 6f9520de76..e5305b7ba5 100644
---
a/hadoop-ozone/interface-storage/src/test/java/org/apache/hadoop/ozone/om/helpers/TestTransactionInfoCodec.java
+++
b/hadoop-ozone/interface-storage/src/test/java/org/apache/hadoop/ozone/om/helpers/TestTransactionInfoCodec.java
@@ -40,10 +40,7 @@ public class TestTransactionInfoCodec
@Test
public void toAndFromPersistedFormat() throws Exception {
- TransactionInfo transactionInfo =
- new TransactionInfo.Builder().setTransactionIndex(100)
- .setCurrentTerm(11).build();
-
+ final TransactionInfo transactionInfo = TransactionInfo.valueOf(11, 100);
final Codec<TransactionInfo> codec = getCodec();
TransactionInfo convertedTransactionInfo =
codec.fromPersistedFormat(codec.toPersistedFormat(transactionInfo));
@@ -55,6 +52,6 @@ public class TestTransactionInfoCodec
public void testInvalidProtocolBuffer() {
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
() ->
getCodec().fromPersistedFormat("random".getBytes(StandardCharsets.UTF_8)));
- assertThat(ex).hasMessage("Incorrect TransactionInfo value");
+ assertThat(ex).hasMessageContaining("Unexpected split length");
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index 053afbed3c..3b9e78b276 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -48,6 +48,7 @@ import java.util.TimerTask;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import com.google.common.base.Optional;
@@ -179,7 +180,6 @@ import
org.apache.hadoop.ozone.om.protocolPB.OMInterServiceProtocolPB;
import org.apache.hadoop.ozone.om.protocolPB.OMAdminProtocolClientSideImpl;
import org.apache.hadoop.ozone.om.protocolPB.OMAdminProtocolPB;
import org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolPB;
-import org.apache.hadoop.ozone.common.ha.ratis.RatisSnapshotInfo;
import org.apache.hadoop.hdds.security.exception.OzoneSecurityException;
import org.apache.hadoop.hdds.utils.TransactionInfo;
import org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer;
@@ -414,7 +414,8 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
private OMNodeDetails omNodeDetails;
private final Map<String, OMNodeDetails> peerNodesMap;
private File omRatisSnapshotDir;
- private final RatisSnapshotInfo omRatisSnapshotInfo;
+ private final AtomicReference<TransactionInfo> omTransactionInfo
+ = new AtomicReference<>(TransactionInfo.DEFAULT_VALUE);
private final Map<String, RatisDropwizardExports> ratisMetricsMap =
new ConcurrentHashMap<>();
private List<RatisDropwizardExports.MetricReporter> ratisReporterList = null;
@@ -692,8 +693,6 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
isForcedBootstrapping = true;
}
- this.omRatisSnapshotInfo = new RatisSnapshotInfo();
-
initializeRatisDirs(conf);
initializeRatisServer(isBootstrapping || isForcedBootstrapping);
@@ -2180,8 +2179,12 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
return (layoutVersion == null) ? null : Integer.parseInt(layoutVersion);
}
- public RatisSnapshotInfo getSnapshotInfo() {
- return omRatisSnapshotInfo;
+ public TransactionInfo getTransactionInfo() {
+ return omTransactionInfo.get();
+ }
+
+ public void setTransactionInfo(TransactionInfo info) {
+ omTransactionInfo.set(info);
}
public long getRatisSnapshotIndex() throws IOException {
@@ -3841,7 +3844,8 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
try {
if (oldOmMetadataManagerStopped) {
time = Time.monotonicNow();
- reloadOMState(lastAppliedIndex, term);
+ reloadOMState();
+ setTransactionInfo(TransactionInfo.valueOf(termIndex));
omRatisServer.getOmStateMachine().unpause(lastAppliedIndex, term);
newMetadataManagerStarted = true;
LOG.info("Reloaded OM state with Term: {} and Index: {}. Spend {} ms",
@@ -3996,9 +4000,7 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
* All the classes which use/ store MetadataManager should also be updated
* with the new MetadataManager instance.
*/
- void reloadOMState(long newSnapshotIndex, long newSnapshotTermIndex)
- throws IOException {
-
+ private void reloadOMState() throws IOException {
instantiateServices(true);
// Restart required services
@@ -4025,10 +4027,6 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
// with new data
Files.deleteIfExists(getMetricsStorageFile().toPath());
saveOmMetrics();
-
- // Update OM snapshot index with the new snapshot index (from the new OM
- // DB state).
- omRatisSnapshotInfo.updateTermIndex(newSnapshotTermIndex,
newSnapshotIndex);
}
public static Logger getLogger() {
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
index 3e59a52bda..c072176d11 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
@@ -372,11 +372,7 @@ public final class OzoneManagerDoubleBuffer {
addToBatchTransactionInfoWithTrace(lastTraceId,
lastRatisTransactionIndex,
() -> omMetadataManager.getTransactionInfoTable().putWithBatch(
- batchOperation, TRANSACTION_INFO_KEY,
- new TransactionInfo.Builder()
- .setTransactionIndex(lastRatisTransactionIndex)
- .setCurrentTerm(term)
- .build()));
+ batchOperation, TRANSACTION_INFO_KEY,
TransactionInfo.valueOf(term, lastRatisTransactionIndex)));
long startTime = Time.monotonicNow();
flushBatchWithTrace(lastTraceId, buffer.size(),
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java
index f94a7b189c..2b2ef704b2 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java
@@ -35,7 +35,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.hdds.utils.TransactionInfo;
-import org.apache.hadoop.ozone.common.ha.ratis.RatisSnapshotInfo;
import org.apache.hadoop.ozone.om.OMConfigKeys;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.OzoneManagerPrepareState;
@@ -95,7 +94,6 @@ public class OzoneManagerStateMachine extends
BaseStateMachine {
private RequestHandler handler;
private RaftGroupId raftGroupId;
private OzoneManagerDoubleBuffer ozoneManagerDoubleBuffer;
- private final RatisSnapshotInfo snapshotInfo;
private final ExecutorService executorService;
private final ExecutorService installSnapshotExecutor;
private final boolean isTracingEnabled;
@@ -119,7 +117,6 @@ public class OzoneManagerStateMachine extends
BaseStateMachine {
this.isTracingEnabled = isTracingEnabled;
this.ozoneManager = omRatisServer.getOzoneManager();
- this.snapshotInfo = ozoneManager.getSnapshotInfo();
loadSnapshotInfoFromDB();
this.threadPrefix = ozoneManager.getThreadNamePrefix();
@@ -163,6 +160,7 @@ public class OzoneManagerStateMachine extends
BaseStateMachine {
@Override
public SnapshotInfo getLatestSnapshot() {
+ final SnapshotInfo snapshotInfo =
ozoneManager.getTransactionInfo().toSnapshotInfo();
LOG.debug("Latest Snapshot Info {}", snapshotInfo);
return snapshotInfo;
}
@@ -491,17 +489,13 @@ public class OzoneManagerStateMachine extends
BaseStateMachine {
public long takeSnapshot() throws IOException {
LOG.info("Current Snapshot Index {}", getLastAppliedTermIndex());
TermIndex lastTermIndex = getLastAppliedTermIndex();
- long lastAppliedIndex = lastTermIndex.getIndex();
- snapshotInfo.updateTermIndex(lastTermIndex.getTerm(),
- lastAppliedIndex);
- TransactionInfo build = new TransactionInfo.Builder()
- .setTransactionIndex(lastAppliedIndex)
- .setCurrentTerm(lastTermIndex.getTerm()).build();
+ final TransactionInfo build = TransactionInfo.valueOf(lastTermIndex);
+ ozoneManager.setTransactionInfo(build);
Table<String, TransactionInfo> txnInfoTable =
ozoneManager.getMetadataManager().getTransactionInfoTable();
txnInfoTable.put(TRANSACTION_INFO_KEY, build);
ozoneManager.getMetadataManager().getStore().flushDB();
- return lastAppliedIndex;
+ return lastTermIndex.getIndex();
}
/**
@@ -699,21 +693,19 @@ public class OzoneManagerStateMachine extends
BaseStateMachine {
TransactionInfo.readTransactionInfo(
ozoneManager.getMetadataManager());
if (transactionInfo != null) {
- setLastAppliedTermIndex(TermIndex.valueOf(
- transactionInfo.getTerm(),
- transactionInfo.getTransactionIndex()));
- snapshotInfo.updateTermIndex(transactionInfo.getTerm(),
- transactionInfo.getTransactionIndex());
+ final TermIndex ti = transactionInfo.getTermIndex();
+ setLastAppliedTermIndex(ti);
+ ozoneManager.setTransactionInfo(transactionInfo);
+ LOG.info("LastAppliedIndex is set from TransactionInfo from OM DB as
{}", ti);
+ } else {
+ LOG.info("TransactionInfo not found in OM DB.");
}
- LOG.info("LastAppliedIndex is set from TransactionInfo from OM DB as {}",
- getLastAppliedTermIndex());
}
/**
* Submits read request to OM and returns the response Message.
* @param request OMRequest
* @return response from OM
- * @throws ServiceException
*/
private Message queryCommand(OMRequest request) {
OMResponse response = handler.handleReadRequest(request);
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/upgrade/OMPrepareResponse.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/upgrade/OMPrepareResponse.java
index 61b106148d..cbac6738f5 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/upgrade/OMPrepareResponse.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/upgrade/OMPrepareResponse.java
@@ -53,8 +53,7 @@ public class OMPrepareResponse extends OMClientResponse {
if (prepareIndex != -1) {
omMetadataManager.getTransactionInfoTable().putWithBatch(batchOperation,
PREPARE_MARKER_KEY,
- new TransactionInfo.Builder()
- .setTransactionIndex(prepareIndex).build());
+ TransactionInfo.valueOf(TransactionInfo.DEFAULT_VALUE.getTerm(),
prepareIndex));
}
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
index 01844acbb6..14911a3241 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java
@@ -97,24 +97,19 @@ public class TestOmMetadataManager {
@Test
public void testTransactionTable() throws Exception {
omMetadataManager.getTransactionInfoTable().put(TRANSACTION_INFO_KEY,
- new TransactionInfo.Builder().setCurrentTerm(1)
- .setTransactionIndex(100).build());
+ TransactionInfo.valueOf(1, 100));
omMetadataManager.getTransactionInfoTable().put(TRANSACTION_INFO_KEY,
- new TransactionInfo.Builder().setCurrentTerm(2)
- .setTransactionIndex(200).build());
+ TransactionInfo.valueOf(2, 200));
omMetadataManager.getTransactionInfoTable().put(TRANSACTION_INFO_KEY,
- new TransactionInfo.Builder().setCurrentTerm(3)
- .setTransactionIndex(250).build());
+ TransactionInfo.valueOf(3, 250));
TransactionInfo transactionInfo =
omMetadataManager.getTransactionInfoTable().get(TRANSACTION_INFO_KEY);
assertEquals(3, transactionInfo.getTerm());
assertEquals(250, transactionInfo.getTransactionIndex());
-
-
}
@Test
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
index d0fe0b3d22..08474a3dbc 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerRatisServer.java
@@ -36,7 +36,6 @@ import org.apache.hadoop.ozone.om.OMStorage;
import org.apache.hadoop.ozone.security.OMCertificateClient;
import org.apache.hadoop.ozone.OmUtils;
import org.apache.hadoop.ozone.OzoneConsts;
-import org.apache.hadoop.ozone.common.ha.ratis.RatisSnapshotInfo;
import org.apache.hadoop.ozone.om.OMConfigKeys;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.helpers.OMNodeDetails;
@@ -125,8 +124,7 @@ public class TestOzoneManagerRatisServer {
ozoneManager);
when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager);
initialTermIndex = TermIndex.valueOf(0, 0);
- RatisSnapshotInfo omRatisSnapshotInfo = new RatisSnapshotInfo();
- when(ozoneManager.getSnapshotInfo()).thenReturn(omRatisSnapshotInfo);
+
when(ozoneManager.getTransactionInfo()).thenReturn(TransactionInfo.DEFAULT_VALUE);
when(ozoneManager.getConfiguration()).thenReturn(conf);
secConfig = new SecurityConfig(conf);
HddsProtos.OzoneManagerDetailsProto omInfo =
@@ -170,10 +168,7 @@ public class TestOzoneManagerRatisServer {
snapshotInfo.getTerm(), snapshotInfo.getIndex() + 100);
omMetadataManager.getTransactionInfoTable().put(TRANSACTION_INFO_KEY,
- new TransactionInfo.Builder()
- .setCurrentTerm(snapshotInfo.getTerm())
- .setTransactionIndex(snapshotInfo.getIndex() + 100)
- .build());
+ TransactionInfo.valueOf(newSnapshotIndex));
// Start new Ratis server. It should pick up and load the new SnapshotInfo
omRatisServer = OzoneManagerRatisServer.newOMRatisServer(conf,
ozoneManager,
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java
index aa0fc49caa..c6c2e0fa4e 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java
@@ -17,7 +17,7 @@
package org.apache.hadoop.ozone.om.ratis;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.ozone.common.ha.ratis.RatisSnapshotInfo;
+import org.apache.hadoop.hdds.utils.TransactionInfo;
import org.apache.hadoop.ozone.om.OMConfigKeys;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
@@ -83,8 +83,7 @@ public class TestOzoneManagerStateMachine {
when(ozoneManager.getPrepareState()).thenReturn(prepareState);
when(ozoneManagerRatisServer.getOzoneManager()).thenReturn(ozoneManager);
- when(ozoneManager.getSnapshotInfo()).thenReturn(
- Mockito.mock(RatisSnapshotInfo.class));
+
when(ozoneManager.getTransactionInfo()).thenReturn(Mockito.mock(TransactionInfo.class));
when(ozoneManager.getConfiguration()).thenReturn(conf);
ozoneManagerStateMachine =
new OzoneManagerStateMachine(ozoneManagerRatisServer, false);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]