diff --git a/weed/mq/pub_balancer/allocate.go b/weed/mq/pub_balancer/allocate.go
index cf94fec5b..8fa0214ad 100644
--- a/weed/mq/pub_balancer/allocate.go
+++ b/weed/mq/pub_balancer/allocate.go
@@ -8,7 +8,7 @@ import (
 	"time"
 )
 
-func allocateTopicPartitions(brokers cmap.ConcurrentMap[string, *BrokerStats], partitionCount int32) (assignments []*mq_pb.BrokerPartitionAssignment) {
+func AllocateTopicPartitions(brokers cmap.ConcurrentMap[string, *BrokerStats], partitionCount int32) (assignments []*mq_pb.BrokerPartitionAssignment) {
 	// divide the ring into partitions
 	now := time.Now().UnixNano()
 	rangeSize := MaxPartitionCount / partitionCount
diff --git a/weed/mq/pub_balancer/allocate_test.go b/weed/mq/pub_balancer/allocate_test.go
index a9056cdb9..3a1598fa0 100644
--- a/weed/mq/pub_balancer/allocate_test.go
+++ b/weed/mq/pub_balancer/allocate_test.go
@@ -53,7 +53,7 @@ func testThem(t *testing.T, tests []struct {
 }) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			gotAssignments := allocateTopicPartitions(tt.args.brokers, tt.args.partitionCount)
+			gotAssignments := AllocateTopicPartitions(tt.args.brokers, tt.args.partitionCount)
 			assert.Equal(t, len(tt.wantAssignments), len(gotAssignments))
 			for i, gotAssignment := range gotAssignments {
 				assert.Equal(t, tt.wantAssignments[i].LeaderBroker, gotAssignment.LeaderBroker)