From 1d8d9570eb1b21568609b0528ef67eecefe0785e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 7 Aug 2026 00:30:28 -0700 Subject: [PATCH] perf(weed/topology): preallocate the disk volume snapshot (#10609) Disk.GetVolumes copies the disk's whole volume map into a fresh slice, and every caller that walks a node's volumes goes through it: the writable-volume refresh loop every few seconds, ToTopologyInfo on each VolumeList, telemetry, and node unregistration. Growing from nil reallocates and copies about twice the final size each time, which at 100k volumes per disk is 60MB of garbage per call. BenchmarkSyncDataNodeRegistration/100000Volumes 199670102 B/op -> 137728051 B/op --- weed/topology/disk.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/topology/disk.go b/weed/topology/disk.go index a7f819eb9..ef5ee0b58 100644 --- a/weed/topology/disk.go +++ b/weed/topology/disk.go @@ -204,6 +204,7 @@ func (d *Disk) doAddOrUpdateVolume(v storage.VolumeInfo) (isNew, isChanged bool) func (d *Disk) GetVolumes() (ret []storage.VolumeInfo) { d.RLock() + ret = make([]storage.VolumeInfo, 0, len(d.volumes)) for _, v := range d.volumes { ret = append(ret, v) }