Hi community,

I have one question regarding VersionRequest/VersionResponse messages.

Before member sends actual message, it has to first determine the remote member version. This is done by exchanging /VersionRequest///VersionResponse/ messages using function /getServerVersion() /from class /TcpClient.java/. There is part of code in /getServerVersion()/ for which I'm unsure which case is actually covering:

https://github.com/apache/geode/blob/854456c81ca7b9545eba252b6fa075318bb33af8/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java#L289

try {
  final Object readObject =objectDeserializer.readObject(versionedIn); if 
(!(readObjectinstanceof VersionResponse)) {
    throw new IllegalThreadStateException(
"Server version response invalid: This could be the result of trying to connect a non-SSL-enabled client to an SSL-enabled locator."); }

  final VersionResponse response = (VersionResponse) readObject; serverVersion 
= response.getVersionOrdinal(); serverVersions.put(address, serverVersion); 
return serverVersion; }catch (EOFException ex) {
// old locators will not recognize the version request and will close the connection }
...
return KnownVersion.OLDEST.ordinal();

The case is when /readObject()/ try to read /VersionResponse/ and then throws /EOFException/. As you can see, there is comment in catch statement explaining the case, but I'm not sure that I understand it correctly. What I assume is that member with old version (less or equal to /KnownVersion.OLDEST/) of Geode does not support /VersionRequest/ message, and will close connection if receive such message. This will result with /EOFException/ on remote member that sent /VersionRequest/. Is this correct understanding? Is this case still valid with the latest non-deprecated version set to /GFE_81/?

The reason why I'm asking this is because in some cases in kuberentes cluster, it is possible to get /EOFException/ when remote member is not yet accessible. In this case member will still try to send message (e.g. /RemoteLocatorJoinRequest/) thinking that it is old member on the other side, and that will then result with /ClassCastException/ when reading response (e.g. /RemoteLocatorJoinResponse/).

BRs,

Jakov

Reply via email to