Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,15 @@ public Boolean getLoadState(GetLoadStateReq request) {
return rpcUtils.retry(()->collectionService.getLoadState(this.getRpcStub(), request));
}

/**
* Get information of all replicas from a collection.
*
* @param request {@link DescribeReplicasReq}
*/
public DescribeReplicasResp describeReplicas(DescribeReplicasReq request) {
return rpcUtils.retry(()->collectionService.describeReplicas(this.getRpcStub(), request));
}

/////////////////////////////////////////////////////////////////////////////////////////////
// Index Operations
/////////////////////////////////////////////////////////////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,55 @@ public CreateCollectionReq.CollectionSchema createSchema() {
.build();
}

public DescribeReplicasResp describeReplicas(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub,
DescribeReplicasReq request) {
if (StringUtils.isEmpty(request.getCollectionName())) {
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Invalid collection name");
}

String title = String.format("DescribeReplicas collectionName:%s", request.getCollectionName());

GetReplicasRequest.Builder requestBuilder = GetReplicasRequest.newBuilder()
.setCollectionName(request.getCollectionName())
.setWithShardNodes(true);

if (StringUtils.isNotEmpty(request.getDatabaseName())) {
requestBuilder.setDbName(request.getDatabaseName());
}

GetReplicasResponse response = blockingStub.getReplicas(requestBuilder.build());
rpcUtils.handleResponse(title, response.getStatus());

List<ReplicaInfo> replicas = new ArrayList<>();
List<io.milvus.grpc.ReplicaInfo> rpcReplicas = response.getReplicasList();
for (io.milvus.grpc.ReplicaInfo info : rpcReplicas) {
List<ShardReplica> shardReplicas = new ArrayList<>();
List<io.milvus.grpc.ShardReplica> rpcShardReplicas = info.getShardReplicasList();
for (io.milvus.grpc.ShardReplica shardReplica : rpcShardReplicas) {
shardReplicas.add(ShardReplica.builder()
.leaderID(shardReplica.getLeaderID())
.leaderAddress(shardReplica.getLeaderAddr())
.channelName(shardReplica.getDmChannelName())
.nodeIDs(shardReplica.getNodeIdsList())
.build());
}

replicas.add(ReplicaInfo.builder()
.replicaID(info.getReplicaID())
.collectionID(info.getCollectionID())
.partitionIDs(info.getPartitionIdsList())
.nodeIDs(info.getNodeIdsList())
.resourceGroupName(info.getResourceGroupName())
.numOutboundNode(info.getNumOutboundNodeMap())
.shardReplicas(shardReplicas)
.build());
}

return DescribeReplicasResp.builder()
.replicas(replicas)
.build();
}

public void waitForCollectionRelease(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, ReleaseCollectionReq request) {
boolean isLoaded = true;
long startTime = System.currentTimeMillis(); // Capture start time/ Timeout in milliseconds (60 seconds)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.milvus.v2.service.collection;

import lombok.Builder;
import lombok.Data;
import lombok.experimental.SuperBuilder;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Data
@SuperBuilder
public class ReplicaInfo {
private Long replicaID;
private Long collectionID;
@Builder.Default
private List<Long> partitionIDs = new ArrayList<>();
@Builder.Default
private List<ShardReplica> shardReplicas = new ArrayList<>();
@Builder.Default
private List<Long> nodeIDs = new ArrayList<>(); // include leaders
@Builder.Default
private String resourceGroupName = "";
@Builder.Default
private Map<String, Integer> numOutboundNode = new HashMap<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.milvus.v2.service.collection;

import lombok.Builder;
import lombok.Data;
import lombok.experimental.SuperBuilder;

import java.util.ArrayList;
import java.util.List;

@Data
@SuperBuilder
public class ShardReplica {
private Long leaderID;
private String leaderAddress; // IP:port
@Builder.Default
private String channelName = "";
@Builder.Default
private List<Long> nodeIDs = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.milvus.v2.service.collection.request;

import lombok.Data;
import lombok.experimental.SuperBuilder;

@Data
@SuperBuilder
public class DescribeReplicasReq {
private String collectionName;
private String databaseName;
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
@SuperBuilder
public class DescribeCollectionResp {
private String collectionName;
private Long collectionID;
private String databaseName;
private String description;
private Long numOfPartitions;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.milvus.v2.service.collection.response;

import io.milvus.v2.service.collection.ReplicaInfo;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.SuperBuilder;

import java.util.ArrayList;
import java.util.List;

@Data
@SuperBuilder
public class DescribeReplicasResp {
@Builder.Default
private List<ReplicaInfo> replicas = new ArrayList<>();
}
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ public DescribeCollectionResp convertDescCollectionResp(DescribeCollectionRespon

DescribeCollectionResp describeCollectionResp = DescribeCollectionResp.builder()
.collectionName(response.getCollectionName())
.collectionID(response.getCollectionID())
.databaseName(response.getDbName())
.description(response.getSchema().getDescription())
.numOfPartitions(response.getNumPartitions())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2192,4 +2192,58 @@ void testResourceGroup() {
.dimension(DIMENSION)
.build());
}

@Test
void testReplica() {
String randomCollectionName = generator.generate(10);

String vectorFieldName = "float_vector";
CreateCollectionReq.CollectionSchema collectionSchema = baseSchema();
collectionSchema.addField(AddFieldReq.builder()
.fieldName(vectorFieldName)
.dataType(DataType.FloatVector)
.dimension(DIMENSION)
.build());

IndexParam indexParam = IndexParam.builder()
.fieldName(vectorFieldName)
.indexType(IndexParam.IndexType.AUTOINDEX)
.metricType(IndexParam.MetricType.COSINE)
.build();

CreateCollectionReq requestCreate = CreateCollectionReq.builder()
.collectionName(randomCollectionName)
.collectionSchema(collectionSchema)
.indexParams(Collections.singletonList(indexParam))
.build();
client.createCollection(requestCreate);

// insert rows
long count = 10000;
List<JsonObject> data = generateRandomData(collectionSchema, count);
InsertResp insertResp = client.insert(InsertReq.builder()
.collectionName(randomCollectionName)
.data(data)
.build());
Assertions.assertEquals(count, insertResp.getInsertCnt());

DescribeCollectionResp descCollResp = client.describeCollection(DescribeCollectionReq.builder()
.collectionName(randomCollectionName)
.build());

DescribeReplicasResp descReplicaResp = client.describeReplicas(DescribeReplicasReq.builder()
.collectionName(randomCollectionName)
.build());
Assertions.assertEquals(1, descReplicaResp.getReplicas().size());
io.milvus.v2.service.collection.ReplicaInfo info = descReplicaResp.getReplicas().get(0);
Assertions.assertEquals(descCollResp.getCollectionID(), info.getCollectionID());
Assertions.assertEquals(1, info.getNodeIDs().size());
Assertions.assertNotEquals(0L, info.getReplicaID());
Assertions.assertFalse(info.getResourceGroupName().isEmpty());
Assertions.assertEquals(1, info.getShardReplicas().size());
io.milvus.v2.service.collection.ShardReplica replica = info.getShardReplicas().get(0);
Assertions.assertFalse(replica.getChannelName().isEmpty());
Assertions.assertFalse(replica.getLeaderAddress().isEmpty());
Assertions.assertNotEquals(0L, replica.getLeaderID());
}
}
Loading