4 changed files with 103 additions and 71 deletions
-
52weed/mq/broker/broker_grpc_assign.go
-
104weed/mq/broker/broker_grpc_configure.go
-
10weed/mq/broker/broker_grpc_lookup.go
-
8weed/mq/pub_balancer/broker_stats.go
@ -0,0 +1,52 @@ |
|||||
|
package broker |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"github.com/seaweedfs/seaweedfs/weed/glog" |
||||
|
"github.com/seaweedfs/seaweedfs/weed/mq/topic" |
||||
|
"github.com/seaweedfs/seaweedfs/weed/pb" |
||||
|
"github.com/seaweedfs/seaweedfs/weed/pb/mq_pb" |
||||
|
) |
||||
|
|
||||
|
// AssignTopicPartitions Runs on the assigned broker, to execute the topic partition assignment
|
||||
|
func (b *MessageQueueBroker) AssignTopicPartitions(c context.Context, request *mq_pb.AssignTopicPartitionsRequest) (*mq_pb.AssignTopicPartitionsResponse, error) { |
||||
|
ret := &mq_pb.AssignTopicPartitionsResponse{} |
||||
|
self := pb.ServerAddress(fmt.Sprintf("%s:%d", b.option.Ip, b.option.Port)) |
||||
|
|
||||
|
// drain existing topic partition subscriptions
|
||||
|
for _, assignment := range request.BrokerPartitionAssignments { |
||||
|
t := topic.FromPbTopic(request.Topic) |
||||
|
partition := topic.FromPbPartition(assignment.Partition) |
||||
|
b.accessLock.Lock() |
||||
|
if request.IsDraining { |
||||
|
// TODO drain existing topic partition subscriptions
|
||||
|
b.localTopicManager.RemoveTopicPartition(t, partition) |
||||
|
} else { |
||||
|
var localPartition *topic.LocalPartition |
||||
|
if localPartition = b.localTopicManager.GetTopicPartition(t, partition); localPartition == nil { |
||||
|
localPartition = topic.FromPbBrokerPartitionAssignment(self, partition, assignment, b.genLogFlushFunc(t, assignment.Partition), b.genLogOnDiskReadFunc(t, assignment.Partition)) |
||||
|
b.localTopicManager.AddTopicPartition(t, localPartition) |
||||
|
} |
||||
|
} |
||||
|
b.accessLock.Unlock() |
||||
|
} |
||||
|
|
||||
|
// if is leader, notify the followers to drain existing topic partition subscriptions
|
||||
|
if request.IsLeader { |
||||
|
for _, brokerPartition := range request.BrokerPartitionAssignments { |
||||
|
for _, follower := range brokerPartition.FollowerBrokers { |
||||
|
err := pb.WithBrokerGrpcClient(false, follower, b.grpcDialOption, func(client mq_pb.SeaweedMessagingClient) error { |
||||
|
_, err := client.AssignTopicPartitions(context.Background(), request) |
||||
|
return err |
||||
|
}) |
||||
|
if err != nil { |
||||
|
return ret, err |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
glog.V(0).Infof("AssignTopicPartitions: topic %s partition assignments: %v", request.Topic, request.BrokerPartitionAssignments) |
||||
|
return ret, nil |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue