mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-08 23:50:43 +02:00
* log_buffer: read only ts_ns during metadata-read binary search readTs ran a full proto.Unmarshal of each LogEntry just to compare timestamps during ReadFromBuffer's binary search, allocating fresh slices for the data and key byte fields on every probe. Under metadata-subscription fan-out this decode churn dominated allocations and drove heavy GC, inflating filer RSS well past the live heap. Scan the wire format for ts_ns (field 1) instead and skip the data/key payloads without copying them. readTs is now zero-alloc; the binary search no longer touches the event payloads at all. * log_buffer: alias event payloads instead of copying them on delivery The subscribe read loops decoded each LogEntry with a full proto.Unmarshal, allocating fresh slices for the data and key byte fields on every entry (protobuf consumeBytesNoZero). When many metadata subscribers each re-read the in-memory log window under a reconnect storm, that per-entry copy was a large share of allocation churn -- and for entries a subscriber filters out by prefix, the copied payload was never even looked at. Decode with a wire scan that points data/key at sub-slices of the source buffer instead of copying. The aliased slices are valid only for the duration of the eachLogEntryFn callback; every current subscriber either re-decodes the event into its own struct or hands it to a synchronous grpc Send, so none retain them. Per delivered entry the loop decode drops from 176 B / 2 allocs to zero.