|
@ -4,9 +4,11 @@ import ( |
|
|
"context" |
|
|
"context" |
|
|
"fmt" |
|
|
"fmt" |
|
|
"github.com/seaweedfs/seaweedfs/weed/glog" |
|
|
"github.com/seaweedfs/seaweedfs/weed/glog" |
|
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/mq/pub_balancer" |
|
|
"github.com/seaweedfs/seaweedfs/weed/mq/topic" |
|
|
"github.com/seaweedfs/seaweedfs/weed/mq/topic" |
|
|
"github.com/seaweedfs/seaweedfs/weed/pb" |
|
|
"github.com/seaweedfs/seaweedfs/weed/pb" |
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/mq_pb" |
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/mq_pb" |
|
|
|
|
|
"sync" |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
// AssignTopicPartitions Runs on the assigned broker, to execute the topic partition assignment
|
|
|
// AssignTopicPartitions Runs on the assigned broker, to execute the topic partition assignment
|
|
@ -50,3 +52,49 @@ func (b *MessageQueueBroker) AssignTopicPartitions(c context.Context, request *m |
|
|
glog.V(0).Infof("AssignTopicPartitions: topic %s partition assignments: %v", request.Topic, request.BrokerPartitionAssignments) |
|
|
glog.V(0).Infof("AssignTopicPartitions: topic %s partition assignments: %v", request.Topic, request.BrokerPartitionAssignments) |
|
|
return ret, nil |
|
|
return ret, nil |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// called by broker leader to drain existing partitions.
|
|
|
|
|
|
// new/updated partitions will be detected by broker from the filer
|
|
|
|
|
|
func (b *MessageQueueBroker) assignTopicPartitionsToBrokers(ctx context.Context, t *mq_pb.Topic, assignments []*mq_pb.BrokerPartitionAssignment, isAdd bool) error { |
|
|
|
|
|
// notify the brokers to create the topic partitions in parallel
|
|
|
|
|
|
var wg sync.WaitGroup |
|
|
|
|
|
for _, bpa := range assignments { |
|
|
|
|
|
wg.Add(1) |
|
|
|
|
|
go func(bpa *mq_pb.BrokerPartitionAssignment) { |
|
|
|
|
|
defer wg.Done() |
|
|
|
|
|
if doCreateErr := b.withBrokerClient(false, pb.ServerAddress(bpa.LeaderBroker), func(client mq_pb.SeaweedMessagingClient) error { |
|
|
|
|
|
_, doCreateErr := client.AssignTopicPartitions(ctx, &mq_pb.AssignTopicPartitionsRequest{ |
|
|
|
|
|
Topic: t, |
|
|
|
|
|
BrokerPartitionAssignments: []*mq_pb.BrokerPartitionAssignment{ |
|
|
|
|
|
{ |
|
|
|
|
|
Partition: bpa.Partition, |
|
|
|
|
|
}, |
|
|
|
|
|
}, |
|
|
|
|
|
IsLeader: true, |
|
|
|
|
|
IsDraining: !isAdd, |
|
|
|
|
|
}) |
|
|
|
|
|
if doCreateErr != nil { |
|
|
|
|
|
if !isAdd { |
|
|
|
|
|
return fmt.Errorf("drain topic %s %v on %s: %v", t, bpa.LeaderBroker, bpa.Partition, doCreateErr) |
|
|
|
|
|
} else { |
|
|
|
|
|
return fmt.Errorf("create topic %s %v on %s: %v", t, bpa.LeaderBroker, bpa.Partition, doCreateErr) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
brokerStats, found := b.Balancer.Brokers.Get(bpa.LeaderBroker) |
|
|
|
|
|
if !found { |
|
|
|
|
|
brokerStats = pub_balancer.NewBrokerStats() |
|
|
|
|
|
if !b.Balancer.Brokers.SetIfAbsent(bpa.LeaderBroker, brokerStats) { |
|
|
|
|
|
brokerStats, _ = b.Balancer.Brokers.Get(bpa.LeaderBroker) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
brokerStats.RegisterAssignment(t, bpa.Partition, isAdd) |
|
|
|
|
|
return nil |
|
|
|
|
|
}); doCreateErr != nil { |
|
|
|
|
|
glog.Errorf("create topic %s partition %+v on %s: %v", t, bpa.Partition, bpa.LeaderBroker, doCreateErr) |
|
|
|
|
|
} |
|
|
|
|
|
}(bpa) |
|
|
|
|
|
} |
|
|
|
|
|
wg.Wait() |
|
|
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
} |