This is an automated email from the ASF dual-hosted git repository.

jbarrett pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-native.git


The following commit(s) were added to refs/heads/develop by this push:
     new 18c1866  GEODE-8837: Announce correct version on handshake. (#737)
18c1866 is described below

commit 18c1866d9265b873058c49836c8ba6cf93c1db69
Author: Jacob Barrett <[email protected]>
AuthorDate: Tue Feb 2 17:58:56 2021 -0800

    GEODE-8837: Announce correct version on handshake. (#737)
    
    - Support multibyte version.
    - Use current gossip version.
---
 cppcache/src/CacheImpl.cpp               |  1 -
 cppcache/src/ClientProxyMembershipID.cpp | 25 +++++------------------
 cppcache/src/ClientProxyMembershipID.hpp |  1 -
 cppcache/src/TcrConnection.cpp           |  7 ++-----
 cppcache/src/ThinClientLocatorHelper.cpp |  5 ++++-
 cppcache/src/Version.cpp                 | 25 +++++++++++++++++++++--
 cppcache/src/Version.hpp                 | 34 ++++++++++++++++++++++----------
 7 files changed, 58 insertions(+), 40 deletions(-)

diff --git a/cppcache/src/CacheImpl.cpp b/cppcache/src/CacheImpl.cpp
index 12fc785..34df55e 100644
--- a/cppcache/src/CacheImpl.cpp
+++ b/cppcache/src/CacheImpl.cpp
@@ -44,7 +44,6 @@
 #include "ThinClientRegion.hpp"
 #include "ThreadPool.hpp"
 #include "Utils.hpp"
-#include "Version.hpp"
 
 #define DEFAULT_DS_NAME "default_GeodeDS"
 
diff --git a/cppcache/src/ClientProxyMembershipID.cpp 
b/cppcache/src/ClientProxyMembershipID.cpp
index 8779a7d..0c69063 100644
--- a/cppcache/src/ClientProxyMembershipID.cpp
+++ b/cppcache/src/ClientProxyMembershipID.cpp
@@ -142,7 +142,7 @@ void ClientProxyMembershipID::initObjectVars(
         static_cast<int32_t>(durableClntTimeOut.count()));
     int32ptr->toData(m_memID);
   }
-  writeVersion(Version::getOrdinal(), m_memID);
+  Version::write(m_memID, Version::current());
   size_t len;
   char* buf =
       reinterpret_cast<char*>(const_cast<uint8_t*>(m_memID.getBuffer(&len)));
@@ -340,25 +340,10 @@ int16_t ClientProxyMembershipID::compareTo(
 }
 
 void ClientProxyMembershipID::readVersion(int flags, DataInput& input) {
-  if ((flags & ClientProxyMembershipID::VERSION_MASK) != 0) {
-    int8_t ordinal = input.read();
-    LOGDEBUG("ClientProxyMembershipID::readVersion ordinal = %d ", ordinal);
-    if (ordinal == ClientProxyMembershipID::TOKEN_ORDINAL) {
-      LOGDEBUG("ClientProxyMembershipID::readVersion ordinal = %d ",
-               input.readInt16());
-    }
-  }
-}
-
-void ClientProxyMembershipID::writeVersion(int16_t ordinal,
-                                           DataOutput& output) {
-  if (ordinal <= SCHAR_MAX) {
-    output.write(static_cast<int8_t>(ordinal));
-    LOGDEBUG("ClientProxyMembershipID::writeVersion ordinal = %d ", ordinal);
-  } else {
-    output.write(ClientProxyMembershipID::TOKEN_ORDINAL);
-    output.writeInt(ordinal);
-    LOGDEBUG("ClientProxyMembershipID::writeVersion ordinal = %d ", ordinal);
+  if (flags & ClientProxyMembershipID::VERSION_MASK) {
+    const auto version = Version::read(input);
+    LOGDEBUG("ClientProxyMembershipID::readVersion ordinal = %d ",
+             version.getOrdinal());
   }
 }
 
diff --git a/cppcache/src/ClientProxyMembershipID.hpp 
b/cppcache/src/ClientProxyMembershipID.hpp
index f933587..3dd4b3c 100644
--- a/cppcache/src/ClientProxyMembershipID.hpp
+++ b/cppcache/src/ClientProxyMembershipID.hpp
@@ -129,7 +129,6 @@ class ClientProxyMembershipID : public 
DSMemberForVersionStamp {
   static const int8_t TOKEN_ORDINAL;
 
   void readVersion(int flags, DataInput& input);
-  void writeVersion(int16_t ordinal, DataOutput& output);
 
   void readAdditionalData(DataInput& input);
 };
diff --git a/cppcache/src/TcrConnection.cpp b/cppcache/src/TcrConnection.cpp
index 40d1238..58e03e7 100644
--- a/cppcache/src/TcrConnection.cpp
+++ b/cppcache/src/TcrConnection.cpp
@@ -160,11 +160,8 @@ bool TcrConnection::initTcrConnection(
     handShakeMsg.write(static_cast<int8_t>(CLIENT_TO_SERVER));
   }
 
-  // added for versioned client
-  int8_t versionOrdinal = Version::getOrdinal();
-  handShakeMsg.write(versionOrdinal);
-
-  LOGFINE("Client version ordinal is %d", versionOrdinal);
+  Version::write(handShakeMsg, Version::current());
+  LOGFINE("Client version ordinal is %d", Version::current().getOrdinal());
 
   handShakeMsg.write(static_cast<int8_t>(REPLY_OK));
 
diff --git a/cppcache/src/ThinClientLocatorHelper.cpp 
b/cppcache/src/ThinClientLocatorHelper.cpp
index 357681c..1dc5699 100644
--- a/cppcache/src/ThinClientLocatorHelper.cpp
+++ b/cppcache/src/ThinClientLocatorHelper.cpp
@@ -37,6 +37,7 @@
 #include "TcpSslConn.hpp"
 #include "TcrConnectionManager.hpp"
 #include "ThinClientPoolDM.hpp"
+#include "Version.hpp"
 
 namespace apache {
 namespace geode {
@@ -111,6 +112,7 @@ std::unique_ptr<Connector> 
ThinClientLocatorHelper::createConnection(
   }
 }
 
+static constexpr int32_t kGossipVersion = 1002;
 std::shared_ptr<Serializable> ThinClientLocatorHelper::sendRequest(
     const ServerLocation& location,
     const std::shared_ptr<Serializable>& request) const {
@@ -123,7 +125,8 @@ std::shared_ptr<Serializable> 
ThinClientLocatorHelper::sendRequest(
     auto conn = createConnection(location);
     auto data =
         m_poolDM->getConnectionManager().getCacheImpl()->createDataOutput();
-    data.writeInt(static_cast<int32_t>(1001));  // GOSSIPVERSION
+    data.writeInt(kGossipVersion);
+    data.writeInt(Version::current().getOrdinal());
     data.writeObject(request);
     auto sentLength = conn->send(
         reinterpret_cast<char*>(const_cast<uint8_t*>(data.getBuffer())),
diff --git a/cppcache/src/Version.cpp b/cppcache/src/Version.cpp
index 9d3feac..0ebd4ba 100644
--- a/cppcache/src/Version.cpp
+++ b/cppcache/src/Version.cpp
@@ -14,15 +14,36 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 #include "Version.hpp"
 
-#include "CacheImpl.hpp"
+#include <limits>
+
+#include <geode/DataInput.hpp>
+#include <geode/DataOutput.hpp>
 
 namespace apache {
 namespace geode {
 namespace client {
 
-int8_t Version::m_ordinal = 45;  // Geode 1.0.0
+void Version::write(DataOutput& dataOutput, const Version& version,
+                    bool compressed) {
+  const auto ordinal = version.getOrdinal();
+  if (compressed && (ordinal <= std::numeric_limits<int8_t>::max())) {
+    dataOutput.write(static_cast<int8_t>(ordinal));
+  } else {
+    dataOutput.write(kTokenOrdinal);
+    dataOutput.writeInt(ordinal);
+  }
+}
+
+Version Version::read(DataInput& dataInput) {
+  int16_t ordinal = dataInput.read();
+  if (kTokenOrdinal == ordinal) {
+    ordinal = dataInput.readInt16();
+  }
+  return Version(ordinal);
+}
 
 }  // namespace client
 }  // namespace geode
diff --git a/cppcache/src/Version.hpp b/cppcache/src/Version.hpp
index 8fedbde..4b78468 100644
--- a/cppcache/src/Version.hpp
+++ b/cppcache/src/Version.hpp
@@ -1,8 +1,3 @@
-#pragma once
-
-#ifndef GEODE_VERSION_H_
-#define GEODE_VERSION_H_
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -20,22 +15,41 @@
  * limitations under the License.
  */
 
-#include "CacheImpl.hpp"
+#pragma once
+
+#ifndef GEODE_VERSION_H_
+#define GEODE_VERSION_H_
+
+#include <cstdint>
 
 namespace apache {
 namespace geode {
 namespace client {
 
+class DataOutput;
+class DataInput;
+
 class Version {
  public:
-  // getter for ordinal
-  static int8_t getOrdinal() { return Version::m_ordinal; }
+  inline int16_t getOrdinal() const noexcept { return ordinal_; }
+
+  static const Version& current() noexcept {
+    static const auto version = Version{45};  // Geode 1.0.0
+    return version;
+  }
+
+  static void write(DataOutput& dataOutput, const Version& version,
+                    bool compressed = true);
+  static Version read(DataInput& dataOutput);
 
  private:
-  static int8_t m_ordinal;
+  const int16_t ordinal_;
+
+  inline explicit Version(int16_t ordinal) noexcept : ordinal_(ordinal) {}
 
-  Version() {}
+  static constexpr int8_t kTokenOrdinal = -1;
 };
+
 }  // namespace client
 }  // namespace geode
 }  // namespace apache

Reply via email to