com.datastax.oss.driver.internal.core.metadata.NodeInfo Maven / Gradle / Ivy
/*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 com.datastax.oss.driver.internal.core.metadata;
import com.datastax.oss.driver.api.core.loadbalancing.LoadBalancingPolicy;
import com.datastax.oss.driver.api.core.loadbalancing.NodeDistance;
import com.datastax.oss.driver.api.core.metadata.EndPoint;
import com.datastax.oss.driver.api.core.metadata.Metadata;
import com.datastax.oss.driver.api.core.metadata.Node;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.Nullable;
import java.net.InetSocketAddress;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
/**
* Information about a node, returned by the {@link TopologyMonitor}.
*
* This information will be copied to the corresponding {@link Node} in the metadata.
*/
public interface NodeInfo {
/**
* The endpoint that the driver will use to connect to the node.
*
*
This information is required; the driver will not function properly if this method returns
* {@code null}.
*/
@NonNull
EndPoint getEndPoint();
/**
* The node's broadcast RPC address and port. That is, the address that clients are supposed to
* use to communicate with that node.
*
*
This is currently only used to match broadcast RPC addresses received in status events
* coming in on the control connection. The driver does not use this value to actually connect to
* the node, but rather uses {@link #getEndPoint()}.
*
* @see Node#getBroadcastRpcAddress()
*/
@NonNull
Optional getBroadcastRpcAddress();
/**
* The node's broadcast address and port. That is, the address that other nodes use to communicate
* with that node.
*
* This is only used by the default topology monitor, so if you are writing a custom one and
* don't need this information, you can leave it empty.
*/
@NonNull
Optional getBroadcastAddress();
/**
* The node's listen address and port. That is, the address that the Cassandra process binds to.
*
* This is currently not used anywhere in the driver. If you write a custom topology monitor
* and don't need this information, you can leave it empty.
*/
@NonNull
Optional getListenAddress();
/**
* The data center that this node belongs to, according to the Cassandra snitch.
*
* This is used by some {@link LoadBalancingPolicy} implementations to compute the {@link
* NodeDistance}.
*/
@Nullable
String getDatacenter();
/**
* The rack that this node belongs to, according to the Cassandra snitch.
*
*
This is used by some {@link LoadBalancingPolicy} implementations to compute the {@link
* NodeDistance}.
*/
@Nullable
String getRack();
/**
* The Cassandra version that this node runs.
*
*
This is used when parsing the schema (schema tables sometimes change from one version to the
* next, even if the protocol version stays the same). If this is null, schema parsing will use
* the lowest version for the current protocol version, which might lead to inaccuracies.
*/
@Nullable
String getCassandraVersion();
/**
* The fully-qualifier name of the partitioner class that distributes data across the nodes, as it
* appears in {@code system.local.partitioner}.
*
*
This is used to compute the driver-side token metadata (in particular, token-aware routing
* relies on this information). It is only really needed for the first node of the initial node
* list refresh (but it doesn't hurt to always include it if possible). If it is absent, {@link
* Metadata#getTokenMap()} will remain empty.
*/
@Nullable
String getPartitioner();
/**
* The tokens that this node owns on the ring.
*
*
This is used to compute the driver-side token metadata (in particular, token-aware routing
* relies on this information). If you're not using token metadata in any way, you may return an
* empty set here.
*/
@Nullable
Set getTokens();
/**
* An additional map of free-form properties, that can be used by custom implementations. They
* will be copied as-is into {@link Node#getExtras()}.
*
* This is not required; if you don't have anything specific to report here, it can be null or
* empty.
*/
@Nullable
Map getExtras();
/**
* The host ID that is assigned to this host by cassandra. The driver uses this to uniquely
* identify a node.
*
* This information is required; the driver will not function properly if this method returns
* {@code null}.
*/
@NonNull
UUID getHostId();
/**
* The current version that is associated with the node's schema.
*
*
This is not required; the driver reports it in {@link Node#getSchemaVersion()}, but for
* informational purposes only. It is not used anywhere internally (schema agreement is checked
* with {@link TopologyMonitor#checkSchemaAgreement()}, which by default queries system tables
* directly, not this field).
*/
@Nullable
UUID getSchemaVersion();
}