refactor sync

* send an empty batch if necessary, as per spec
* reduce lock acquisitions
This commit is contained in:
Shivaram Lingamneni 2025-06-15 13:52:00 -04:00
parent 3966c17dec
commit 3e761ff68a

View file

@ -62,16 +62,13 @@ func broadcastMetadataUpdate(server *Server, sessions iter.Seq[*Session], origin
} }
func syncClientMetadata(server *Server, rb *ResponseBuffer, target *Client) { func syncClientMetadata(server *Server, rb *ResponseBuffer, target *Client) {
if len(rb.session.MetadataSubscriptions()) == 0 {
return
}
batchId := rb.StartNestedBatch("metadata") batchId := rb.StartNestedBatch("metadata")
defer rb.EndNestedBatch(batchId) defer rb.EndNestedBatch(batchId)
subs := rb.session.MetadataSubscriptions()
values := target.ListMetadata() values := target.ListMetadata()
for k, v := range values { for k, v := range values {
if rb.session.isSubscribedTo(k) { if subs.Has(k) {
visibility := "*" visibility := "*"
rb.Add(nil, server.name, "METADATA", target.Nick(), k, visibility, v) rb.Add(nil, server.name, "METADATA", target.Nick(), k, visibility, v)
} }
@ -79,16 +76,14 @@ func syncClientMetadata(server *Server, rb *ResponseBuffer, target *Client) {
} }
func syncChannelMetadata(server *Server, rb *ResponseBuffer, target *Channel) { func syncChannelMetadata(server *Server, rb *ResponseBuffer, target *Channel) {
if len(rb.session.MetadataSubscriptions()) == 0 {
return
}
batchId := rb.StartNestedBatch("metadata") batchId := rb.StartNestedBatch("metadata")
defer rb.EndNestedBatch(batchId) defer rb.EndNestedBatch(batchId)
subs := rb.session.MetadataSubscriptions()
values := target.ListMetadata() values := target.ListMetadata()
for k, v := range values { for k, v := range values {
if rb.session.isSubscribedTo(k) { if subs.Has(k) {
visibility := "*" visibility := "*"
rb.Add(nil, server.name, "METADATA", target.Name(), k, visibility, v) rb.Add(nil, server.name, "METADATA", target.Name(), k, visibility, v)
} }
@ -97,7 +92,7 @@ func syncChannelMetadata(server *Server, rb *ResponseBuffer, target *Channel) {
for _, client := range target.Members() { for _, client := range target.Members() {
values := client.ListMetadata() values := client.ListMetadata()
for k, v := range values { for k, v := range values {
if rb.session.isSubscribedTo(k) { if subs.Has(k) {
visibility := "*" visibility := "*"
rb.Add(nil, server.name, "METADATA", client.Nick(), k, visibility, v) rb.Add(nil, server.name, "METADATA", client.Nick(), k, visibility, v)
} }