notify/record_negotiation.go
starainrt 7ed3dd5b37
feat: 完善 RecordStream 的协议协商、运行观测与文档说明
- 将 RecordStream 出站路径收敛为单 writer loop
  - 支持在 batch header 中 piggyback AckSeq,保留独立 ack 作为兼容回退
  - 增加 record stream 打开阶段能力协商,支持 mixed-version peer 自动降级
  - 补充 RecordSnapshot 与 diagnostics summary 的 record-plane 观测项
  - 增加 batch/ack/error frame、piggyback ack、barrier 等待拆分与 apply backlog 指标
  - 收紧 TransportConn detach 后的 runtime snapshot 语义
  - 补充 README 中的 RecordStream 语义、兼容行为与诊断快照说明
  - 补充相关单测与 race 回归验证
2026-04-15 19:52:45 +08:00

49 lines
1.5 KiB
Go

package notify
const (
recordStreamMetadataCapBatchAckKey = "_notify.record_cap_batch_ack"
recordStreamMetadataUseBatchAckKey = "_notify.record_use_batch_ack"
recordStreamMetadataEnabledValue = "1"
)
func advertiseRecordStreamOpenMetadata(metadata StreamMetadata) StreamMetadata {
metadata = cloneStreamMetadata(metadata)
if metadata == nil {
metadata = make(StreamMetadata, 1)
}
metadata[recordStreamMetadataCapBatchAckKey] = recordStreamMetadataEnabledValue
return metadata
}
func negotiateRecordStreamOpenMetadata(channel StreamChannel, metadata StreamMetadata) (StreamMetadata, StreamMetadata) {
metadata = cloneStreamMetadata(metadata)
if normalizeStreamChannel(channel) != StreamRecordChannel {
return metadata, nil
}
if metadata[recordStreamMetadataCapBatchAckKey] != recordStreamMetadataEnabledValue {
return metadata, nil
}
metadata[recordStreamMetadataUseBatchAckKey] = recordStreamMetadataEnabledValue
return metadata, StreamMetadata{
recordStreamMetadataUseBatchAckKey: recordStreamMetadataEnabledValue,
}
}
func mergeStreamMetadata(base StreamMetadata, overlay StreamMetadata) StreamMetadata {
if len(base) == 0 && len(overlay) == 0 {
return nil
}
merged := cloneStreamMetadata(base)
if merged == nil {
merged = make(StreamMetadata, len(overlay))
}
for key, value := range overlay {
merged[key] = value
}
return merged
}
func recordStreamUseBatchAck(metadata StreamMetadata) bool {
return metadata[recordStreamMetadataUseBatchAckKey] == recordStreamMetadataEnabledValue
}