)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9cfd42d5416e81e58cf597785e9077d0bc3cb3d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"bdf2543e_8698aca4","updated":"2022-06-24 16:15:27.000000000","message":"(not really stealing the review)","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ab9a1ee1787d1bcfeb582179cfff88f10a5c41c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"efe06b11_61595add","updated":"2022-06-24 16:14:27.000000000","message":"I\u0027ll be using the new resolver, so I had to read this one anyway.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"610d31d9d3196d022a159126dcf21fe75aeae738","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e270b105_d2eb27fe","updated":"2022-06-27 10:18:15.000000000","message":"Me and Mateusz (thanks) have spotted quite a few concurrency bugs. It might be better to implement this with a classical fanout pattern (so just one channel per goroutine) especially as this is not really performance-critical.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9d0e2257_60ed726c","in_reply_to":"01fadbb8_43c3bfbb","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a65e9deeed3cc43c3f5da3faa08f96ef25aa51d4","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"01fadbb8_43c3bfbb","in_reply_to":"e270b105_d2eb27fe","updated":"2022-06-27 12:11:22.000000000","message":"Right, so I attempted to implement this supervisor-less, and that\u0027s the result :).\n\nI\u0027ll work on this.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"}],"metropolis/node/core/rpc/resolver.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"610d31d9d3196d022a159126dcf21fe75aeae738","unresolved":true,"context_lines":[{"line_number":35,"context_line":"// current leader fails over."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// The resolver will wait for a first gRPC connection established through it to"},{"line_number":38,"context_line":"// extract the transport credentials used, then use these credentials to call"},{"line_number":39,"context_line":"// the Curator and CuratorLocal services on control plane nodes to perform its"},{"line_number":40,"context_line":"// logic."},{"line_number":41,"context_line":"//"}],"source_content_type":"text/x-go","patch_set":6,"id":"4cabf17e_21314e1c","line":38,"range":{"start_line":38,"start_character":3,"end_line":38,"end_character":41},"updated":"2022-06-27 10:18:15.000000000","message":"How do things like XDS and grpclb handle this? The same?","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":true,"context_lines":[{"line_number":35,"context_line":"// current leader fails over."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// The resolver will wait for a first gRPC connection established through it to"},{"line_number":38,"context_line":"// extract the transport credentials used, then use these credentials to call"},{"line_number":39,"context_line":"// the Curator and CuratorLocal services on control plane nodes to perform its"},{"line_number":40,"context_line":"// logic."},{"line_number":41,"context_line":"//"}],"source_content_type":"text/x-go","patch_set":6,"id":"e1dd8fa9_77609e25","line":38,"range":{"start_line":38,"start_character":3,"end_line":38,"end_character":41},"in_reply_to":"4cabf17e_21314e1c","updated":"2022-06-30 14:06:57.000000000","message":"Yes, from what I could tell.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"fcb45b723d660c2c7e1f2368fd844f22637f4f1a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"// current leader fails over."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// The resolver will wait for a first gRPC connection established through it to"},{"line_number":38,"context_line":"// extract the transport credentials used, then use these credentials to call"},{"line_number":39,"context_line":"// the Curator and CuratorLocal services on control plane nodes to perform its"},{"line_number":40,"context_line":"// logic."},{"line_number":41,"context_line":"//"}],"source_content_type":"text/x-go","patch_set":6,"id":"2f82e2d5_37ecbb0a","line":38,"range":{"start_line":38,"start_character":3,"end_line":38,"end_character":41},"in_reply_to":"e1dd8fa9_77609e25","updated":"2022-06-30 15:36:42.000000000","message":"Ack","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"610d31d9d3196d022a159126dcf21fe75aeae738","unresolved":true,"context_lines":[{"line_number":39,"context_line":"// the Curator and CuratorLocal services on control plane nodes to perform its"},{"line_number":40,"context_line":"// logic."},{"line_number":41,"context_line":"//"},{"line_number":42,"context_line":"// This resolver is designed to be used as a long-running objects which multiple"},{"line_number":43,"context_line":"// gRPC client connections can use. Usually one ClusterResolver instance should"},{"line_number":44,"context_line":"// be used per application."},{"line_number":45,"context_line":"//"}],"source_content_type":"text/x-go","patch_set":6,"id":"8226777d_59a91c84","line":42,"range":{"start_line":42,"start_character":58,"end_line":42,"end_character":65},"updated":"2022-06-27 10:18:15.000000000","message":"`object`","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":39,"context_line":"// the Curator and CuratorLocal services on control plane nodes to perform its"},{"line_number":40,"context_line":"// logic."},{"line_number":41,"context_line":"//"},{"line_number":42,"context_line":"// This resolver is designed to be used as a long-running objects which multiple"},{"line_number":43,"context_line":"// gRPC client connections can use. Usually one ClusterResolver instance should"},{"line_number":44,"context_line":"// be used per application."},{"line_number":45,"context_line":"//"}],"source_content_type":"text/x-go","patch_set":6,"id":"aa0898ea_0bfec416","line":42,"range":{"start_line":42,"start_character":58,"end_line":42,"end_character":65},"in_reply_to":"8226777d_59a91c84","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ab9a1ee1787d1bcfeb582179cfff88f10a5c41c4","unresolved":true,"context_lines":[{"line_number":74,"context_line":"\taddrOverrides map[string]*NodeEndpoint"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"\t// curators is the Curator Map, a set of endpoints that should be used to"},{"line_number":77,"context_line":"\t// establish the current leadership. Initially this is populated by AddNdoe"},{"line_number":78,"context_line":"\t// calls, and is then kept up to date by an internal curator map updater."},{"line_number":79,"context_line":"\tcondCurators *sync.Cond"},{"line_number":80,"context_line":"\tcurators     map[string]bool"}],"source_content_type":"text/x-go","patch_set":6,"id":"dc4e96bb_2ac2f9f3","line":77,"range":{"start_line":77,"start_character":69,"end_line":77,"end_character":76},"updated":"2022-06-24 16:14:27.000000000","message":"typo","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":74,"context_line":"\taddrOverrides map[string]*NodeEndpoint"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"\t// curators is the Curator Map, a set of endpoints that should be used to"},{"line_number":77,"context_line":"\t// establish the current leadership. Initially this is populated by AddNdoe"},{"line_number":78,"context_line":"\t// calls, and is then kept up to date by an internal curator map updater."},{"line_number":79,"context_line":"\tcondCurators *sync.Cond"},{"line_number":80,"context_line":"\tcurators     map[string]bool"}],"source_content_type":"text/x-go","patch_set":6,"id":"1f0fd4a7_958d4973","line":77,"range":{"start_line":77,"start_character":69,"end_line":77,"end_character":76},"in_reply_to":"dc4e96bb_2ac2f9f3","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ab9a1ee1787d1bcfeb582179cfff88f10a5c41c4","unresolved":true,"context_lines":[{"line_number":83,"context_line":"\tcondDialOpts *sync.Cond"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"\t// tlsConfig are the transport credentials retrieved from the first gRPC"},{"line_number":86,"context_line":"\t// connection established through this resolver. These credentials are reused to"},{"line_number":87,"context_line":"\t// connect to authenticate to nodes in the cluster."},{"line_number":88,"context_line":"\ttlsConfig credentials.TransportCredentials"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"\t// dialer is the gRPC dialer retrieved from the first gRPC connection. It is"}],"source_content_type":"text/x-go","patch_set":6,"id":"e8dacfb3_00b25b59","line":87,"range":{"start_line":86,"start_character":80,"end_line":87,"end_character":30},"updated":"2022-06-24 16:14:27.000000000","message":"\"to authenticate to\"?","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":83,"context_line":"\tcondDialOpts *sync.Cond"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"\t// tlsConfig are the transport credentials retrieved from the first gRPC"},{"line_number":86,"context_line":"\t// connection established through this resolver. These credentials are reused to"},{"line_number":87,"context_line":"\t// connect to authenticate to nodes in the cluster."},{"line_number":88,"context_line":"\ttlsConfig credentials.TransportCredentials"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"\t// dialer is the gRPC dialer retrieved from the first gRPC connection. It is"}],"source_content_type":"text/x-go","patch_set":6,"id":"bac7f468_8ea5b3c7","line":87,"range":{"start_line":86,"start_character":80,"end_line":87,"end_character":30},"in_reply_to":"e8dacfb3_00b25b59","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"610d31d9d3196d022a159126dcf21fe75aeae738","unresolved":true,"context_lines":[{"line_number":85,"context_line":"\t// tlsConfig are the transport credentials retrieved from the first gRPC"},{"line_number":86,"context_line":"\t// connection established through this resolver. These credentials are reused to"},{"line_number":87,"context_line":"\t// connect to authenticate to nodes in the cluster."},{"line_number":88,"context_line":"\ttlsConfig credentials.TransportCredentials"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"\t// dialer is the gRPC dialer retrieved from the first gRPC connection. It is"},{"line_number":91,"context_line":"\t// reused similarly to tlsConfig."}],"source_content_type":"text/x-go","patch_set":6,"id":"62ebdcc4_d0cd08a0","line":88,"range":{"start_line":88,"start_character":1,"end_line":88,"end_character":10},"updated":"2022-06-27 10:18:15.000000000","message":"As far as I can see this is just a generic transport credential and does not explicitly have anything to do with TLS. Could we just make this `transportCreds`?\n\nAlso `tlsConfig` makes me think of `tls.Config` which this is not.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":85,"context_line":"\t// tlsConfig are the transport credentials retrieved from the first gRPC"},{"line_number":86,"context_line":"\t// connection established through this resolver. These credentials are reused to"},{"line_number":87,"context_line":"\t// connect to authenticate to nodes in the cluster."},{"line_number":88,"context_line":"\ttlsConfig credentials.TransportCredentials"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"\t// dialer is the gRPC dialer retrieved from the first gRPC connection. It is"},{"line_number":91,"context_line":"\t// reused similarly to tlsConfig."}],"source_content_type":"text/x-go","patch_set":6,"id":"0a3bdee1_51f79ccc","line":88,"range":{"start_line":88,"start_character":1,"end_line":88,"end_character":10},"in_reply_to":"62ebdcc4_d0cd08a0","updated":"2022-06-30 14:06:57.000000000","message":"Combined them as \u0027dial opts\u0027.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ab9a1ee1787d1bcfeb582179cfff88f10a5c41c4","unresolved":true,"context_lines":[{"line_number":219,"context_line":"\treturn b.tlsConfig, b.dialer, ctx.Err()"},{"line_number":220,"context_line":"}"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"func (b *ClusterResolver) waitLeader(ctx context.Context) (*leaderAt, error) {"},{"line_number":223,"context_line":"\tb.condLeader.L.Lock()"},{"line_number":224,"context_line":"\tdefer b.condLeader.L.Lock()"},{"line_number":225,"context_line":"\tfor b.leader \u003d\u003d nil \u0026\u0026 ctx.Err() \u003d\u003d nil {"}],"source_content_type":"text/x-go","patch_set":6,"id":"41b3e08b_81761c3d","line":222,"updated":"2022-06-24 16:14:27.000000000","message":"This is unused, isn\u0027t it?","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":219,"context_line":"\treturn b.tlsConfig, b.dialer, ctx.Err()"},{"line_number":220,"context_line":"}"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"func (b *ClusterResolver) waitLeader(ctx context.Context) (*leaderAt, error) {"},{"line_number":223,"context_line":"\tb.condLeader.L.Lock()"},{"line_number":224,"context_line":"\tdefer b.condLeader.L.Lock()"},{"line_number":225,"context_line":"\tfor b.leader \u003d\u003d nil \u0026\u0026 ctx.Err() \u003d\u003d nil {"}],"source_content_type":"text/x-go","patch_set":6,"id":"0377f235_5e2dbd2d","line":222,"in_reply_to":"41b3e08b_81761c3d","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"}],"metropolis/node/core/rpc/resolver_curmap.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"610d31d9d3196d022a159126dcf21fe75aeae738","unresolved":true,"context_lines":[{"line_number":41,"context_line":"// retrieve all nodes which are running a curator."},{"line_number":42,"context_line":"func (b *ClusterResolver) runCuratorMapUpdater(ctx context.Context) {"},{"line_number":43,"context_line":"\t// Wait for a TLS config to be set."},{"line_number":44,"context_line":"\tcreds, dialer, err :\u003d b.waitDialOpts(ctx)"},{"line_number":45,"context_line":"\tif err !\u003d nil {"},{"line_number":46,"context_line":"\t\tb.logger(\"CURMAPUPDATE: canceled while waiting for dial opts\")"},{"line_number":47,"context_line":"\t\treturn"}],"source_content_type":"text/x-go","patch_set":6,"id":"50043f2b_44a5b3aa","line":44,"range":{"start_line":44,"start_character":25,"end_line":44,"end_character":37},"updated":"2022-06-27 10:18:15.000000000","message":"This goroutine will leak if ctx gets canceled here. The `Wait()` call in waitDialOpts will never return as it is never woken up and thus the context error will never be looked at.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":41,"context_line":"// retrieve all nodes which are running a curator."},{"line_number":42,"context_line":"func (b *ClusterResolver) runCuratorMapUpdater(ctx context.Context) {"},{"line_number":43,"context_line":"\t// Wait for a TLS config to be set."},{"line_number":44,"context_line":"\tcreds, dialer, err :\u003d b.waitDialOpts(ctx)"},{"line_number":45,"context_line":"\tif err !\u003d nil {"},{"line_number":46,"context_line":"\t\tb.logger(\"CURMAPUPDATE: canceled while waiting for dial opts\")"},{"line_number":47,"context_line":"\t\treturn"}],"source_content_type":"text/x-go","patch_set":6,"id":"eda69013_0d3c6bcf","line":44,"range":{"start_line":44,"start_character":25,"end_line":44,"end_character":37},"in_reply_to":"451df748_044c9ff1","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bbade74ab8dc6cc9bdb40a20c449ee917ce1e518","unresolved":true,"context_lines":[{"line_number":41,"context_line":"// retrieve all nodes which are running a curator."},{"line_number":42,"context_line":"func (b *ClusterResolver) runCuratorMapUpdater(ctx context.Context) {"},{"line_number":43,"context_line":"\t// Wait for a TLS config to be set."},{"line_number":44,"context_line":"\tcreds, dialer, err :\u003d b.waitDialOpts(ctx)"},{"line_number":45,"context_line":"\tif err !\u003d nil {"},{"line_number":46,"context_line":"\t\tb.logger(\"CURMAPUPDATE: canceled while waiting for dial opts\")"},{"line_number":47,"context_line":"\t\treturn"}],"source_content_type":"text/x-go","patch_set":6,"id":"451df748_044c9ff1","line":44,"range":{"start_line":44,"start_character":25,"end_line":44,"end_character":37},"in_reply_to":"50043f2b_44a5b3aa","updated":"2022-06-27 12:15:50.000000000","message":"Oh yeah, I solved this for other goroutines/waits by broadcasting on context cancel. But you\u0027re right in another comment that this can also be race\u0027y.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"}],"metropolis/node/core/rpc/resolver_findleader.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"610d31d9d3196d022a159126dcf21fe75aeae738","unresolved":true,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"\tbackoff.RetryNotify(func() error {"},{"line_number":33,"context_line":"\t\t// Wait for a TLS config to be set."},{"line_number":34,"context_line":"\t\tcreds, dialer, err :\u003d b.waitDialOpts(ctx)"},{"line_number":35,"context_line":"\t\tif err !\u003d nil {"},{"line_number":36,"context_line":"\t\t\treturn fmt.Errorf(\"while waiting for dial opts: %w\", err)"},{"line_number":37,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"a0df5945_b20c9a63","line":34,"updated":"2022-06-27 10:18:15.000000000","message":"Same issue as with RunCuratorMapUpdater","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"\tbackoff.RetryNotify(func() error {"},{"line_number":33,"context_line":"\t\t// Wait for a TLS config to be set."},{"line_number":34,"context_line":"\t\tcreds, dialer, err :\u003d b.waitDialOpts(ctx)"},{"line_number":35,"context_line":"\t\tif err !\u003d nil {"},{"line_number":36,"context_line":"\t\t\treturn fmt.Errorf(\"while waiting for dial opts: %w\", err)"},{"line_number":37,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"c28a5ef8_ddbcd1a4","line":34,"in_reply_to":"a0df5945_b20c9a63","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"}],"metropolis/node/core/rpc/resolver_test.go":[{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ab9a1ee1787d1bcfeb582179cfff88f10a5c41c4","unresolved":true,"context_lines":[{"line_number":168,"context_line":"\t\tt.Fatalf(\"Could not dial: %v\", err)"},{"line_number":169,"context_line":"\t}"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"\t// Test logic folloss."},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"\t// Add first node to bootstrap node information from."},{"line_number":174,"context_line":"\tr.AddEndpoint(nodeAtListener(listeners[0]))"}],"source_content_type":"text/x-go","patch_set":6,"id":"63b996ad_fc6c7218","line":171,"range":{"start_line":171,"start_character":15,"end_line":171,"end_character":23},"updated":"2022-06-24 16:14:27.000000000","message":"\"follows\"?","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":168,"context_line":"\t\tt.Fatalf(\"Could not dial: %v\", err)"},{"line_number":169,"context_line":"\t}"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"\t// Test logic folloss."},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"\t// Add first node to bootstrap node information from."},{"line_number":174,"context_line":"\tr.AddEndpoint(nodeAtListener(listeners[0]))"}],"source_content_type":"text/x-go","patch_set":6,"id":"74a2e7c3_d5ef1225","line":171,"range":{"start_line":171,"start_character":15,"end_line":171,"end_character":23},"in_reply_to":"63b996ad_fc6c7218","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"}],"metropolis/node/core/rpc/resolver_watcher.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"610d31d9d3196d022a159126dcf21fe75aeae738","unresolved":true,"context_lines":[{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"func (r *clientWatcher) watch() {"},{"line_number":54,"context_line":"\t// Craft a trivial gRPC service config which forces round-robin behaviour for"},{"line_number":55,"context_line":"\t// RPCs. This makes the gRPC client contact all curators in a round-robin"},{"line_number":56,"context_line":"\t// fashion. Ideally, we would prioritize contacting the leader, but this will do"},{"line_number":57,"context_line":"\t// for now."},{"line_number":58,"context_line":"\tsvcConfig :\u003d r.clientConn.ParseServiceConfig(`{ \"loadBalancingConfig\": [{\"round_robin\": {}}]}`)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"\t// Watch for leader to be updated."}],"source_content_type":"text/x-go","patch_set":6,"id":"c254f0dd_5fd75fef","line":57,"range":{"start_line":54,"start_character":4,"end_line":57,"end_character":12},"updated":"2022-06-27 10:18:15.000000000","message":"This comment needs to be adjusted to the new implementation.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"func (r *clientWatcher) watch() {"},{"line_number":54,"context_line":"\t// Craft a trivial gRPC service config which forces round-robin behaviour for"},{"line_number":55,"context_line":"\t// RPCs. This makes the gRPC client contact all curators in a round-robin"},{"line_number":56,"context_line":"\t// fashion. Ideally, we would prioritize contacting the leader, but this will do"},{"line_number":57,"context_line":"\t// for now."},{"line_number":58,"context_line":"\tsvcConfig :\u003d r.clientConn.ParseServiceConfig(`{ \"loadBalancingConfig\": [{\"round_robin\": {}}]}`)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"\t// Watch for leader to be updated."}],"source_content_type":"text/x-go","patch_set":6,"id":"db2ee091_b0e7d954","line":57,"range":{"start_line":54,"start_character":4,"end_line":57,"end_character":12},"in_reply_to":"c254f0dd_5fd75fef","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ab9a1ee1787d1bcfeb582179cfff88f10a5c41c4","unresolved":true,"context_lines":[{"line_number":78,"context_line":"\t\t\t\tServiceConfig: svcConfig,"},{"line_number":79,"context_line":"\t\t\t})"},{"line_number":80,"context_line":"\t\t}"},{"line_number":81,"context_line":"\t\tr.builder.condLeader.Wait()"},{"line_number":82,"context_line":"\t}"},{"line_number":83,"context_line":"}"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"2b5977f3_e93a3549","line":81,"updated":"2022-06-24 16:14:27.000000000","message":"Could there be a race condition, if Close is called before this goroutine reaches Wait?\n\nhttps://pkg.go.dev/sync#Cond.Broadcast","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"610d31d9d3196d022a159126dcf21fe75aeae738","unresolved":true,"context_lines":[{"line_number":78,"context_line":"\t\t\t\tServiceConfig: svcConfig,"},{"line_number":79,"context_line":"\t\t\t})"},{"line_number":80,"context_line":"\t\t}"},{"line_number":81,"context_line":"\t\tr.builder.condLeader.Wait()"},{"line_number":82,"context_line":"\t}"},{"line_number":83,"context_line":"}"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"c38183de_f99668ea","line":81,"in_reply_to":"2b5977f3_e93a3549","updated":"2022-06-27 10:18:15.000000000","message":"This can indeed cause a goroutine leak if `Broadcast` is being called while a `watch()` goroutine is not `Wait()`ing.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9a5f13f498991b34ccf791c51e9619358cd3a633","unresolved":false,"context_lines":[{"line_number":78,"context_line":"\t\t\t\tServiceConfig: svcConfig,"},{"line_number":79,"context_line":"\t\t\t})"},{"line_number":80,"context_line":"\t\t}"},{"line_number":81,"context_line":"\t\tr.builder.condLeader.Wait()"},{"line_number":82,"context_line":"\t}"},{"line_number":83,"context_line":"}"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"25c53a06_ad38060f","line":81,"in_reply_to":"ba6738d6_4bb6d3f1","updated":"2022-06-30 14:06:57.000000000","message":"Done","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bbade74ab8dc6cc9bdb40a20c449ee917ce1e518","unresolved":true,"context_lines":[{"line_number":78,"context_line":"\t\t\t\tServiceConfig: svcConfig,"},{"line_number":79,"context_line":"\t\t\t})"},{"line_number":80,"context_line":"\t\t}"},{"line_number":81,"context_line":"\t\tr.builder.condLeader.Wait()"},{"line_number":82,"context_line":"\t}"},{"line_number":83,"context_line":"}"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"ba6738d6_4bb6d3f1","line":81,"in_reply_to":"c38183de_f99668ea","updated":"2022-06-27 12:15:50.000000000","message":"This is a reminder why I implemented the Event library :). For a second there I though I reimplemented sync.Condition for no good reason, but this shows how easily you can get race conditions with these. Ugh.","commit_id":"8631de6eb1bcdd310b789bc5e9368a494d427511"}]}
