|
|
@@ -38,6 +38,11 @@ type Client interface {
|
|
|
// Replicas returns the set of all replica IDs for the given partition.
|
|
|
Replicas(topic string, partitionID int32) ([]int32, error)
|
|
|
|
|
|
+ // InSyncReplicas returns the set of all in-sync replica IDs for the given
|
|
|
+ // partition. In-sync replicas are replicas which are fully caught up with
|
|
|
+ // the partition leader.
|
|
|
+ InSyncReplicas(topic string, partitionID int32) ([]int32, error)
|
|
|
+
|
|
|
// RefreshMetadata takes a list of topics and queries the cluster to refresh the
|
|
|
// available metadata for those topics. If no topics are provided, it will refresh
|
|
|
// metadata for all topics.
|
|
|
@@ -295,6 +300,31 @@ func (client *client) Replicas(topic string, partitionID int32) ([]int32, error)
|
|
|
return dupeAndSort(metadata.Replicas), nil
|
|
|
}
|
|
|
|
|
|
+func (client *client) InSyncReplicas(topic string, partitionID int32) ([]int32, error) {
|
|
|
+ if client.Closed() {
|
|
|
+ return nil, ErrClosedClient
|
|
|
+ }
|
|
|
+
|
|
|
+ metadata := client.cachedMetadata(topic, partitionID)
|
|
|
+
|
|
|
+ if metadata == nil {
|
|
|
+ err := client.RefreshMetadata(topic)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ metadata = client.cachedMetadata(topic, partitionID)
|
|
|
+ }
|
|
|
+
|
|
|
+ if metadata == nil {
|
|
|
+ return nil, ErrUnknownTopicOrPartition
|
|
|
+ }
|
|
|
+
|
|
|
+ if metadata.Err == ErrReplicaNotAvailable {
|
|
|
+ return nil, metadata.Err
|
|
|
+ }
|
|
|
+ return dupeAndSort(metadata.Isr), nil
|
|
|
+}
|
|
|
+
|
|
|
func (client *client) Leader(topic string, partitionID int32) (*Broker, error) {
|
|
|
if client.Closed() {
|
|
|
return nil, ErrClosedClient
|