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]


Reply via email to