Record Class TransportVersion

java.lang.Object
java.lang.Record
org.elasticsearch.TransportVersion
All Implemented Interfaces:
Comparable<TransportVersion>, VersionId<TransportVersion>

public record TransportVersion(int id) extends Record implements VersionId<TransportVersion>
Represents the version of the wire protocol used to communicate between a pair of ES nodes.

Prior to 8.8.0, the release Version was used everywhere. This class separates the wire protocol version from the release version.

Each transport version constant has an id number, which for versions prior to 8.9.0 is the same as the release version for backwards compatibility. In 8.9.0 this is changed to an incrementing number, disconnected from the release version.

Each version constant has a unique id string. This is not actually used in the binary protocol, but is there to ensure each protocol version is only added to the source file once. This string needs to be unique (normally a UUID, but can be any other unique nonempty string). If two concurrent PRs add the same transport version, the different unique ids cause a git conflict, ensuring that the second PR to be merged must be updated with the next free version first. Without the unique id string, git will happily merge the two versions together, resulting in the same transport version being used across multiple commits, causing problems when you try to upgrade between those two merged commits.

Version compatibility

The earliest compatible version is hardcoded in the TransportVersions.MINIMUM_COMPATIBLE field. Previously, this was dynamically calculated from the major/minor versions of Version, but TransportVersion does not have separate major/minor version numbers. So the minimum compatible version is hard-coded as the transport version used by the highest minor release of the previous major version. TransportVersions.MINIMUM_COMPATIBLE should be updated appropriately whenever a major release happens.

The earliest CCS compatible version is hardcoded at TransportVersions.MINIMUM_CCS_VERSION, as the transport version used by the previous minor release. This should be updated appropriately whenever a minor release happens.

Scope of usefulness of TransportVersion

TransportVersion is a property of the transport connection between a pair of nodes, and should not be used as an indication of the version of any single node. The TransportVersion of a connection is negotiated between the nodes via some logic that is not totally trivial, and may change in future. Any other places that might make decisions based on this version effectively have to reproduce this negotiation logic, which would be fragile. If you need to make decisions based on the version of a single node, do so using a different version value. If you need to know whether the cluster as a whole speaks a new enough TransportVersion to understand a newly-added feature, use ClusterState.getMinTransportVersion().
  • Constructor Details

    • TransportVersion

      public TransportVersion(int id)
      Creates an instance of a TransportVersion record class.
      Parameters:
      id - the value for the id record component
  • Method Details

    • readVersion

      public static TransportVersion readVersion(StreamInput in) throws IOException
      Throws:
      IOException
    • fromId

      public static TransportVersion fromId(int id)
    • writeVersion

      public static void writeVersion(TransportVersion version, StreamOutput out) throws IOException
      Throws:
      IOException
    • min

      public static TransportVersion min(TransportVersion version1, TransportVersion version2)
      Returns the minimum version of version1 and version2
    • max

      public static TransportVersion max(TransportVersion version1, TransportVersion version2)
      Returns the maximum version of version1 and version2
    • isCompatible

      public static boolean isCompatible(TransportVersion version)
      Returns true if the specified version is compatible with this running version of Elasticsearch.
    • current

      public static TransportVersion current()
      Reference to the most recent transport version. This should be the transport version with the highest id.
    • fromString

      public static TransportVersion fromString(String str)
    • toString

      public String toString()
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      Specified by:
      toString in class Record
      Returns:
      a string representation of this object
    • hashCode

      public final int hashCode()
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      Specified by:
      hashCode in class Record
      Returns:
      a hash code value for this object
    • equals

      public final boolean equals(Object o)
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with '=='.
      Specified by:
      equals in class Record
      Parameters:
      o - the object with which to compare
      Returns:
      true if this object is the same as the o argument; false otherwise.
    • id

      public int id()
      Returns the value of the id record component.
      Specified by:
      id in interface VersionId<TransportVersion>
      Returns:
      the value of the id record component