)]}'
{"/PATCHSET_LEVEL":[{"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":"48e78b368fb7f6bbec3012114de2fd8a072e1d98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7a71d6a3_529d31a0","updated":"2024-04-30 11:41:48.000000000","message":"First round of review, overall this looks very nice. I need to look at some of the behavioral changes more closely (for example integrating consensus with the Kubernetes service), but overall this looks very good.","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"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":"363320c08ce4475962277a6b8a75e6813cd75dda","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"539b4bbd_1bb5378f","updated":"2024-05-02 10:34:49.000000000","message":"First pass.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"}],"metropolis/node/core/curator/proto/private/storage.proto":[{"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":"48e78b368fb7f6bbec3012114de2fd8a072e1d98","unresolved":true,"context_lines":[{"line_number":69,"context_line":"}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"// KubernetesReconcilerStatus contains status reported by the reconciler."},{"line_number":72,"context_line":"// This is used by the reconciler itself,"},{"line_number":73,"context_line":"// and it is used by the Kubernetes controller service"},{"line_number":74,"context_line":"// to wait for reconciliation to be complete with a compatible version."},{"line_number":75,"context_line":"//"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"63c433dd_7c312b3d","line":72,"range":{"start_line":72,"start_character":3,"end_line":72,"end_character":40},"updated":"2024-04-30 11:41:48.000000000","message":"This comment should be reflowed.","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cc8e95f2c17dada1547a9917e64d9e12f7d057a2","unresolved":false,"context_lines":[{"line_number":69,"context_line":"}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"// KubernetesReconcilerStatus contains status reported by the reconciler."},{"line_number":72,"context_line":"// This is used by the reconciler itself,"},{"line_number":73,"context_line":"// and it is used by the Kubernetes controller service"},{"line_number":74,"context_line":"// to wait for reconciliation to be complete with a compatible version."},{"line_number":75,"context_line":"//"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"ff26a9a5_67c2b964","line":72,"range":{"start_line":72,"start_character":3,"end_line":72,"end_character":40},"in_reply_to":"63c433dd_7c312b3d","updated":"2024-05-01 10:05:39.000000000","message":"I recently read about semantic linefeeds (https://go.dev/doc/comment#paragraphs) maybe I overdid it a bit.","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"}],"metropolis/node/core/roleserve/worker_kubernetes.go":[{"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":"363320c08ce4475962277a6b8a75e6813cd75dda","unresolved":true,"context_lines":[{"line_number":6,"context_line":"\t\"net\""},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"\t\"source.monogon.dev/metropolis/node/core/clusternet\""},{"line_number":9,"context_line":"\tipb \"source.monogon.dev/metropolis/node/core/curator/proto/api\""},{"line_number":10,"context_line":"\t\"source.monogon.dev/metropolis/node/core/identity\""},{"line_number":11,"context_line":"\t\"source.monogon.dev/metropolis/node/core/localstorage\""},{"line_number":12,"context_line":"\t\"source.monogon.dev/metropolis/node/core/network\""}],"source_content_type":"text/x-go","patch_set":3,"id":"059f15ba_c65e2d9c","line":9,"range":{"start_line":9,"start_character":1,"end_line":9,"end_character":64},"updated":"2024-05-02 10:34:49.000000000","message":"Keep the previous sort (proto stubs grouped together).","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3dc2c7a4e67f07ca7cbf4d262e3c43f3b47b81f1","unresolved":true,"context_lines":[{"line_number":6,"context_line":"\t\"net\""},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"\t\"source.monogon.dev/metropolis/node/core/clusternet\""},{"line_number":9,"context_line":"\tipb \"source.monogon.dev/metropolis/node/core/curator/proto/api\""},{"line_number":10,"context_line":"\t\"source.monogon.dev/metropolis/node/core/identity\""},{"line_number":11,"context_line":"\t\"source.monogon.dev/metropolis/node/core/localstorage\""},{"line_number":12,"context_line":"\t\"source.monogon.dev/metropolis/node/core/network\""}],"source_content_type":"text/x-go","patch_set":3,"id":"edb861ff_1e14ede4","line":9,"range":{"start_line":9,"start_character":1,"end_line":9,"end_character":64},"in_reply_to":"059f15ba_c65e2d9c","updated":"2024-05-06 07:47:52.000000000","message":"I did not change this manually, this happens when running goimports as documented in `CODING_STANDARDS.md`. If these should be kept separate, we need to either adjust the formatting tool, or add a comment before the proto import block. What do you suggest?","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"d0211c85ad50720c2bc332985cfae80aa7d64ce0","unresolved":false,"context_lines":[{"line_number":6,"context_line":"\t\"net\""},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"\t\"source.monogon.dev/metropolis/node/core/clusternet\""},{"line_number":9,"context_line":"\tipb \"source.monogon.dev/metropolis/node/core/curator/proto/api\""},{"line_number":10,"context_line":"\t\"source.monogon.dev/metropolis/node/core/identity\""},{"line_number":11,"context_line":"\t\"source.monogon.dev/metropolis/node/core/localstorage\""},{"line_number":12,"context_line":"\t\"source.monogon.dev/metropolis/node/core/network\""}],"source_content_type":"text/x-go","patch_set":3,"id":"ece96a75_af63a9ed","line":9,"range":{"start_line":9,"start_character":1,"end_line":9,"end_character":64},"in_reply_to":"edb861ff_1e14ede4","updated":"2024-05-08 09:11:21.000000000","message":"Hm, that\u0027s odd, I\u0027m also pretty sure I use //:goimports for this and I don\u0027t think it ever sorted it back for me.\n\nIf that\u0027s the case then let it be, and I\u0027ll fix the tool some other day.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"}],"metropolis/node/kubernetes/reconciler/reconciler.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":"48e78b368fb7f6bbec3012114de2fd8a072e1d98","unresolved":true,"context_lines":[{"line_number":19,"context_line":"// functionality. All resources containing the"},{"line_number":20,"context_line":"// metropolis.monogon.dev/builtin\u003dtrue label are assumed to be managed by the"},{"line_number":21,"context_line":"// reconciler."},{"line_number":22,"context_line":"// It currently does not revert modifications made by admins, it is  planned to"},{"line_number":23,"context_line":"// create an admission plugin prohibiting such modifications to resources with"},{"line_number":24,"context_line":"// the metropolis.monogon.dev/builtin label to deal with that problem. This"},{"line_number":25,"context_line":"// would also solve a potential issue where you could delete resources just by"},{"line_number":26,"context_line":"// adding the metropolis.monogon.dev/builtin\u003dtrue label."},{"line_number":27,"context_line":"package reconciler"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"import ("}],"source_content_type":"text/x-go","patch_set":1,"id":"ce73dacf_59c69bdf","line":26,"range":{"start_line":22,"start_character":3,"end_line":26,"end_character":56},"updated":"2024-04-30 11:41:48.000000000","message":"This comment needs updating, IMO you could also merge the top comment from `reconciler_status.go` in here.","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"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":"f16db5527306868d44a3afb5da8bf99d3cb9b026","unresolved":false,"context_lines":[{"line_number":19,"context_line":"// functionality. All resources containing the"},{"line_number":20,"context_line":"// metropolis.monogon.dev/builtin\u003dtrue label are assumed to be managed by the"},{"line_number":21,"context_line":"// reconciler."},{"line_number":22,"context_line":"// It currently does not revert modifications made by admins, it is  planned to"},{"line_number":23,"context_line":"// create an admission plugin prohibiting such modifications to resources with"},{"line_number":24,"context_line":"// the metropolis.monogon.dev/builtin label to deal with that problem. This"},{"line_number":25,"context_line":"// would also solve a potential issue where you could delete resources just by"},{"line_number":26,"context_line":"// adding the metropolis.monogon.dev/builtin\u003dtrue label."},{"line_number":27,"context_line":"package reconciler"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"import ("}],"source_content_type":"text/x-go","patch_set":1,"id":"a403f5f1_1e14c603","line":26,"range":{"start_line":22,"start_character":3,"end_line":26,"end_character":56},"in_reply_to":"662defb4_e53171ed","updated":"2024-05-06 15:26:33.000000000","message":"Acknowledged","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cc8e95f2c17dada1547a9917e64d9e12f7d057a2","unresolved":true,"context_lines":[{"line_number":19,"context_line":"// functionality. All resources containing the"},{"line_number":20,"context_line":"// metropolis.monogon.dev/builtin\u003dtrue label are assumed to be managed by the"},{"line_number":21,"context_line":"// reconciler."},{"line_number":22,"context_line":"// It currently does not revert modifications made by admins, it is  planned to"},{"line_number":23,"context_line":"// create an admission plugin prohibiting such modifications to resources with"},{"line_number":24,"context_line":"// the metropolis.monogon.dev/builtin label to deal with that problem. This"},{"line_number":25,"context_line":"// would also solve a potential issue where you could delete resources just by"},{"line_number":26,"context_line":"// adding the metropolis.monogon.dev/builtin\u003dtrue label."},{"line_number":27,"context_line":"package reconciler"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"import ("}],"source_content_type":"text/x-go","patch_set":1,"id":"662defb4_e53171ed","line":26,"range":{"start_line":22,"start_character":3,"end_line":26,"end_character":56},"in_reply_to":"ce73dacf_59c69bdf","updated":"2024-05-01 10:05:39.000000000","message":"The comment is still accurate, updates are implemented in a subsequent change (2893). I\u0027m not sure moving the comment from `reconciler_status.go` makes sense, because that comment is about the file, not the package.","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"}],"metropolis/node/kubernetes/reconciler/reconciler_status.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":"48e78b368fb7f6bbec3012114de2fd8a072e1d98","unresolved":true,"context_lines":[{"line_number":29,"context_line":"// reconcileAll in a controlled way (leader elected and only when other nodes"},{"line_number":30,"context_line":"// are compatible) and to set the reconciler status in etcd."},{"line_number":31,"context_line":"// The file also contains WaitReady, which watches the status and returns"},{"line_number":32,"context_line":"// when the apiserver can start serving."},{"line_number":33,"context_line":"// These two form the public interface of the reconciler."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"const ("}],"source_content_type":"text/x-go","patch_set":1,"id":"ec670713_0876b3f0","line":32,"range":{"start_line":32,"start_character":12,"end_line":32,"end_character":21},"updated":"2024-04-30 11:41:48.000000000","message":"Isn\u0027t the apiserver the one thing that needs to be running when the reconciler runs?","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"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":"f16db5527306868d44a3afb5da8bf99d3cb9b026","unresolved":false,"context_lines":[{"line_number":29,"context_line":"// reconcileAll in a controlled way (leader elected and only when other nodes"},{"line_number":30,"context_line":"// are compatible) and to set the reconciler status in etcd."},{"line_number":31,"context_line":"// The file also contains WaitReady, which watches the status and returns"},{"line_number":32,"context_line":"// when the apiserver can start serving."},{"line_number":33,"context_line":"// These two form the public interface of the reconciler."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"const ("}],"source_content_type":"text/x-go","patch_set":1,"id":"6b0d3a28_1bcd1f47","line":32,"range":{"start_line":32,"start_character":12,"end_line":32,"end_character":21},"in_reply_to":"02125f39_9771666a","updated":"2024-05-06 15:26:33.000000000","message":"Acknowledged","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cc8e95f2c17dada1547a9917e64d9e12f7d057a2","unresolved":true,"context_lines":[{"line_number":29,"context_line":"// reconcileAll in a controlled way (leader elected and only when other nodes"},{"line_number":30,"context_line":"// are compatible) and to set the reconciler status in etcd."},{"line_number":31,"context_line":"// The file also contains WaitReady, which watches the status and returns"},{"line_number":32,"context_line":"// when the apiserver can start serving."},{"line_number":33,"context_line":"// These two form the public interface of the reconciler."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"const ("}],"source_content_type":"text/x-go","patch_set":1,"id":"02125f39_9771666a","line":32,"range":{"start_line":32,"start_character":12,"end_line":32,"end_character":21},"in_reply_to":"ec670713_0876b3f0","updated":"2024-05-01 10:05:39.000000000","message":"What I mean here is serving requests from clients other than the reconciler. From what I can see, this is mostly how it works. The exception is that kubelets connect directly to the apiserver, which means these requests are served before WaitReady returns.","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"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":"48e78b368fb7f6bbec3012114de2fd8a072e1d98","unresolved":true,"context_lines":[{"line_number":339,"context_line":"\t}"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"\tsupervisor.Logger(ctx).Info(\"Elected.\")"},{"line_number":342,"context_line":"\tisLeader :\u003d clientv3.Compare(clientv3.CreateRevision(election.Key()), \"\u003d\", election.Rev())"},{"line_number":343,"context_line":"\tleadership.Set(isLeader)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"\t\u003c-session.Done()"}],"source_content_type":"text/x-go","patch_set":1,"id":"12d08ff1_9bad0af5","line":342,"range":{"start_line":342,"start_character":1,"end_line":342,"end_character":9},"updated":"2024-04-30 11:41:48.000000000","message":"nit: I would rename this to `isLeaderCheck`. But cool use of primitives!","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cc8e95f2c17dada1547a9917e64d9e12f7d057a2","unresolved":false,"context_lines":[{"line_number":339,"context_line":"\t}"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"\tsupervisor.Logger(ctx).Info(\"Elected.\")"},{"line_number":342,"context_line":"\tisLeader :\u003d clientv3.Compare(clientv3.CreateRevision(election.Key()), \"\u003d\", election.Rev())"},{"line_number":343,"context_line":"\tleadership.Set(isLeader)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"\t\u003c-session.Done()"}],"source_content_type":"text/x-go","patch_set":1,"id":"7988bb63_dc955583","line":342,"range":{"start_line":342,"start_character":1,"end_line":342,"end_character":9},"in_reply_to":"12d08ff1_9bad0af5","updated":"2024-05-01 10:05:39.000000000","message":"Done","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"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":"48e78b368fb7f6bbec3012114de2fd8a072e1d98","unresolved":true,"context_lines":[{"line_number":387,"context_line":"\t\t// The status does not exist yet. Reconcile, then create the status."},{"line_number":388,"context_line":"\t\tlog.Info(\"Status does not exist yet.\")"},{"line_number":389,"context_line":"\t} else if bytes.Equal(statusGet.Kvs[0].Value, doneStatusBytes) {"},{"line_number":390,"context_line":"\t\t// The status is already what we would set, so leave it as is."},{"line_number":391,"context_line":"\t\tlog.Info(\"Status is already up to date.\")"},{"line_number":392,"context_line":"\t} else if !version.ReleaseLessThan(mversion.Version.Release, status.Version.Release) \u0026\u0026"},{"line_number":393,"context_line":"\t\t!version.ReleaseLessThan(status.MinimumCompatibleRelease, minApiserverRelease) {"}],"source_content_type":"text/x-go","patch_set":1,"id":"cfd89b1c_098a2aec","line":390,"range":{"start_line":390,"start_character":5,"end_line":390,"end_character":64},"updated":"2024-04-30 11:41:48.000000000","message":"You shold probably use `proto.Equal` here, proto binary serialization is not guaranteed to be byte-for-byte identical.","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cc8e95f2c17dada1547a9917e64d9e12f7d057a2","unresolved":false,"context_lines":[{"line_number":387,"context_line":"\t\t// The status does not exist yet. Reconcile, then create the status."},{"line_number":388,"context_line":"\t\tlog.Info(\"Status does not exist yet.\")"},{"line_number":389,"context_line":"\t} else if bytes.Equal(statusGet.Kvs[0].Value, doneStatusBytes) {"},{"line_number":390,"context_line":"\t\t// The status is already what we would set, so leave it as is."},{"line_number":391,"context_line":"\t\tlog.Info(\"Status is already up to date.\")"},{"line_number":392,"context_line":"\t} else if !version.ReleaseLessThan(mversion.Version.Release, status.Version.Release) \u0026\u0026"},{"line_number":393,"context_line":"\t\t!version.ReleaseLessThan(status.MinimumCompatibleRelease, minApiserverRelease) {"}],"source_content_type":"text/x-go","patch_set":1,"id":"41694191_4e938c19","line":390,"range":{"start_line":390,"start_character":5,"end_line":390,"end_character":64},"in_reply_to":"cfd89b1c_098a2aec","updated":"2024-05-01 10:05:39.000000000","message":"Done","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"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":"48e78b368fb7f6bbec3012114de2fd8a072e1d98","unresolved":true,"context_lines":[{"line_number":519,"context_line":"\tlog.Infof(\"Initial resource reconciliation succeeded.\")"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"\t// Update status."},{"line_number":522,"context_line":"\tif len(statusGet.Kvs) !\u003d 1 || !bytes.Equal(statusGet.Kvs[0].Value, doneStatusBytes) {"},{"line_number":523,"context_line":"\t\tresp, err :\u003d s.Etcd.Txn(ctx).If(isLeader).Then("},{"line_number":524,"context_line":"\t\t\tclientv3.OpPut(statusKey, string(doneStatusBytes)),"},{"line_number":525,"context_line":"\t\t).Commit()"}],"source_content_type":"text/x-go","patch_set":1,"id":"895c4c3f_d73722fe","line":522,"range":{"start_line":522,"start_character":44,"end_line":522,"end_character":66},"updated":"2024-04-30 11:41:48.000000000","message":"Same thing here, you should compare with `proto.Equal`","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cc8e95f2c17dada1547a9917e64d9e12f7d057a2","unresolved":false,"context_lines":[{"line_number":519,"context_line":"\tlog.Infof(\"Initial resource reconciliation succeeded.\")"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"\t// Update status."},{"line_number":522,"context_line":"\tif len(statusGet.Kvs) !\u003d 1 || !bytes.Equal(statusGet.Kvs[0].Value, doneStatusBytes) {"},{"line_number":523,"context_line":"\t\tresp, err :\u003d s.Etcd.Txn(ctx).If(isLeader).Then("},{"line_number":524,"context_line":"\t\t\tclientv3.OpPut(statusKey, string(doneStatusBytes)),"},{"line_number":525,"context_line":"\t\t).Commit()"}],"source_content_type":"text/x-go","patch_set":1,"id":"d38c4fe9_c41c3f4c","line":522,"range":{"start_line":522,"start_character":44,"end_line":522,"end_character":66},"in_reply_to":"895c4c3f_d73722fe","updated":"2024-05-01 10:05:39.000000000","message":"Done","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"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":"363320c08ce4475962277a6b8a75e6813cd75dda","unresolved":true,"context_lines":[{"line_number":43,"context_line":")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"var ("},{"line_number":46,"context_line":"\t// minReconcilerRelease is the minimum release which the node last performing"},{"line_number":47,"context_line":"\t// reconciliation must have for the local node to be able to start serving."},{"line_number":48,"context_line":"\t// Set this to the next release when making changes to reconciled state which"},{"line_number":49,"context_line":"\t// must be applied before starting to serve."}],"source_content_type":"text/x-go","patch_set":3,"id":"4e5d2b49_b4454f84","line":46,"range":{"start_line":46,"start_character":40,"end_line":46,"end_character":47},"updated":"2024-05-02 10:34:49.000000000","message":"Explicitly state that these are metropolis versions, not Kubernetes versions.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3dc2c7a4e67f07ca7cbf4d262e3c43f3b47b81f1","unresolved":false,"context_lines":[{"line_number":43,"context_line":")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"var ("},{"line_number":46,"context_line":"\t// minReconcilerRelease is the minimum release which the node last performing"},{"line_number":47,"context_line":"\t// reconciliation must have for the local node to be able to start serving."},{"line_number":48,"context_line":"\t// Set this to the next release when making changes to reconciled state which"},{"line_number":49,"context_line":"\t// must be applied before starting to serve."}],"source_content_type":"text/x-go","patch_set":3,"id":"016d2d2b_3d1995d8","line":46,"range":{"start_line":46,"start_character":40,"end_line":46,"end_character":47},"in_reply_to":"4e5d2b49_b4454f84","updated":"2024-05-06 07:47:52.000000000","message":"Done","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"363320c08ce4475962277a6b8a75e6813cd75dda","unresolved":true,"context_lines":[{"line_number":90,"context_line":"\t\tcase ppb.KubernetesReconcilerStatus_STATE_WORKING:"},{"line_number":91,"context_line":"\t\t\tstate \u003d \"working\""},{"line_number":92,"context_line":"\t\t}"},{"line_number":93,"context_line":"\t\tsupervisor.Logger(ctx).Infof(\"Reconciler status: %s, version: %s, minimum compatible release: %s. Local node version: %s, minimum reconciler release: %s.\","},{"line_number":94,"context_line":"\t\t\tstate,"},{"line_number":95,"context_line":"\t\t\tversion.Semver(status.Version),"},{"line_number":96,"context_line":"\t\t\tversion.Release(status.MinimumCompatibleRelease),"}],"source_content_type":"text/x-go","patch_set":3,"id":"dfd2afe9_6b771056","line":93,"range":{"start_line":93,"start_character":43,"end_line":93,"end_character":49},"updated":"2024-05-02 10:34:49.000000000","message":"state","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3dc2c7a4e67f07ca7cbf4d262e3c43f3b47b81f1","unresolved":true,"context_lines":[{"line_number":90,"context_line":"\t\tcase ppb.KubernetesReconcilerStatus_STATE_WORKING:"},{"line_number":91,"context_line":"\t\t\tstate \u003d \"working\""},{"line_number":92,"context_line":"\t\t}"},{"line_number":93,"context_line":"\t\tsupervisor.Logger(ctx).Infof(\"Reconciler status: %s, version: %s, minimum compatible release: %s. Local node version: %s, minimum reconciler release: %s.\","},{"line_number":94,"context_line":"\t\t\tstate,"},{"line_number":95,"context_line":"\t\t\tversion.Semver(status.Version),"},{"line_number":96,"context_line":"\t\t\tversion.Release(status.MinimumCompatibleRelease),"}],"source_content_type":"text/x-go","patch_set":3,"id":"ff8e2ce5_527b2f3b","line":93,"range":{"start_line":93,"start_character":43,"end_line":93,"end_character":49},"in_reply_to":"dfd2afe9_6b771056","updated":"2024-05-06 07:47:52.000000000","message":"Here, \"status\" refers to everything until the full stop, not just the next field. I could change it to `Reconciler status: state: %s, ...` if you prefer that, but otherwise I would like to keep it as is.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"d0211c85ad50720c2bc332985cfae80aa7d64ce0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"\t\tcase ppb.KubernetesReconcilerStatus_STATE_WORKING:"},{"line_number":91,"context_line":"\t\t\tstate \u003d \"working\""},{"line_number":92,"context_line":"\t\t}"},{"line_number":93,"context_line":"\t\tsupervisor.Logger(ctx).Infof(\"Reconciler status: %s, version: %s, minimum compatible release: %s. Local node version: %s, minimum reconciler release: %s.\","},{"line_number":94,"context_line":"\t\t\tstate,"},{"line_number":95,"context_line":"\t\t\tversion.Semver(status.Version),"},{"line_number":96,"context_line":"\t\t\tversion.Release(status.MinimumCompatibleRelease),"}],"source_content_type":"text/x-go","patch_set":3,"id":"d8d0d32b_de2d25fa","line":93,"range":{"start_line":93,"start_character":43,"end_line":93,"end_character":49},"in_reply_to":"ff8e2ce5_527b2f3b","updated":"2024-05-08 09:11:21.000000000","message":"Acknowledged","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"363320c08ce4475962277a6b8a75e6813cd75dda","unresolved":true,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"\t\t// Parse the node release. Skip if the node was deleted, is not a"},{"line_number":192,"context_line":"\t\t// Kubernetes controller, or does not have a release."},{"line_number":193,"context_line":"\t\tif len(kv.Value) \u003d\u003d 0 {"},{"line_number":194,"context_line":"\t\t\treturn"},{"line_number":195,"context_line":"\t\t}"},{"line_number":196,"context_line":"\t\tnode :\u003d ppb.Node{}"},{"line_number":197,"context_line":"\t\tif err :\u003d proto.Unmarshal(kv.Value, \u0026node); err !\u003d nil {"},{"line_number":198,"context_line":"\t\t\tsupervisor.Logger(ctx).Errorf(\"Failed to unmarshal node %q: %w\", nodeKey, err)"}],"source_content_type":"text/x-go","patch_set":3,"id":"dae4cd68_40e59547","line":195,"range":{"start_line":193,"start_character":0,"end_line":195,"end_character":3},"updated":"2024-05-02 10:34:49.000000000","message":"Any reason you\u0027re checking this? A zero-length marshaled proto is valid (so the parse will succeed) and we\u0027re doing subsequent checks on the unmarshaled value anyways (so it\u0027s not like we\u0027ll misinterpret an empty proto as something incidentally bad).","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"2b25147cc599f34b7a2d9c53a452fac98f60dd0d","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"\t\t// Parse the node release. Skip if the node was deleted, is not a"},{"line_number":192,"context_line":"\t\t// Kubernetes controller, or does not have a release."},{"line_number":193,"context_line":"\t\tif len(kv.Value) \u003d\u003d 0 {"},{"line_number":194,"context_line":"\t\t\treturn"},{"line_number":195,"context_line":"\t\t}"},{"line_number":196,"context_line":"\t\tnode :\u003d ppb.Node{}"},{"line_number":197,"context_line":"\t\tif err :\u003d proto.Unmarshal(kv.Value, \u0026node); err !\u003d nil {"},{"line_number":198,"context_line":"\t\t\tsupervisor.Logger(ctx).Errorf(\"Failed to unmarshal node %q: %w\", nodeKey, err)"}],"source_content_type":"text/x-go","patch_set":3,"id":"ea1af13d_79e525ce","line":195,"range":{"start_line":193,"start_character":0,"end_line":195,"end_character":3},"in_reply_to":"86e572a5_d468385e","updated":"2024-05-14 09:06:55.000000000","message":"Acknowledged","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3dc2c7a4e67f07ca7cbf4d262e3c43f3b47b81f1","unresolved":true,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"\t\t// Parse the node release. Skip if the node was deleted, is not a"},{"line_number":192,"context_line":"\t\t// Kubernetes controller, or does not have a release."},{"line_number":193,"context_line":"\t\tif len(kv.Value) \u003d\u003d 0 {"},{"line_number":194,"context_line":"\t\t\treturn"},{"line_number":195,"context_line":"\t\t}"},{"line_number":196,"context_line":"\t\tnode :\u003d ppb.Node{}"},{"line_number":197,"context_line":"\t\tif err :\u003d proto.Unmarshal(kv.Value, \u0026node); err !\u003d nil {"},{"line_number":198,"context_line":"\t\t\tsupervisor.Logger(ctx).Errorf(\"Failed to unmarshal node %q: %w\", nodeKey, err)"}],"source_content_type":"text/x-go","patch_set":3,"id":"86e572a5_d468385e","line":195,"range":{"start_line":193,"start_character":0,"end_line":195,"end_character":3},"in_reply_to":"dae4cd68_40e59547","updated":"2024-05-06 07:47:52.000000000","message":"If the length is zero, that indicates that the node was deleted.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"363320c08ce4475962277a6b8a75e6813cd75dda","unresolved":true,"context_lines":[{"line_number":232,"context_line":"\t}"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"\t// Get the initial nodes data."},{"line_number":235,"context_line":"\tget, err :\u003d s.Etcd.Get(ctx, nodesStart, clientv3.WithRange(nodesEnd))"},{"line_number":236,"context_line":"\tif err !\u003d nil {"},{"line_number":237,"context_line":"\t\treturn fmt.Errorf(\"when retrieving initial nodes: %w\", err)"},{"line_number":238,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"f2b63031_915275f3","line":235,"range":{"start_line":235,"start_character":20,"end_line":235,"end_character":23},"updated":"2024-05-02 10:34:49.000000000","message":"Any reason to not use metropolis/pkg/event/etcd.Range to get/watch the range of nodes here?","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"d0211c85ad50720c2bc332985cfae80aa7d64ce0","unresolved":false,"context_lines":[{"line_number":232,"context_line":"\t}"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"\t// Get the initial nodes data."},{"line_number":235,"context_line":"\tget, err :\u003d s.Etcd.Get(ctx, nodesStart, clientv3.WithRange(nodesEnd))"},{"line_number":236,"context_line":"\tif err !\u003d nil {"},{"line_number":237,"context_line":"\t\treturn fmt.Errorf(\"when retrieving initial nodes: %w\", err)"},{"line_number":238,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"7cf7688e_edcf9cea","line":235,"range":{"start_line":235,"start_character":20,"end_line":235,"end_character":23},"in_reply_to":"9797b8d4_4f9a6aac","updated":"2024-05-08 09:11:21.000000000","message":"Acknowledged","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3dc2c7a4e67f07ca7cbf4d262e3c43f3b47b81f1","unresolved":true,"context_lines":[{"line_number":232,"context_line":"\t}"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"\t// Get the initial nodes data."},{"line_number":235,"context_line":"\tget, err :\u003d s.Etcd.Get(ctx, nodesStart, clientv3.WithRange(nodesEnd))"},{"line_number":236,"context_line":"\tif err !\u003d nil {"},{"line_number":237,"context_line":"\t\treturn fmt.Errorf(\"when retrieving initial nodes: %w\", err)"},{"line_number":238,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"9797b8d4_4f9a6aac","line":235,"range":{"start_line":235,"start_character":20,"end_line":235,"end_character":23},"in_reply_to":"f2b63031_915275f3","updated":"2024-05-06 07:47:52.000000000","message":"event/etcd does not support getting the etcd revision of the last received change. I also don\u0027t see any benefits to using event/etcd over using etcd directly, at least for ranges. It adds a lot of unnecessary complexity, and would not make my code any simpler.\n\nevent/etcd has an internal reconnect loop, which I don\u0027t need, I can just rely on the supervisor restart loop. And it\u0027s buggy: If it reconnects, it just drops all internal state, and thus won\u0027t tell the client about key-values that were deleted during the downtime.\n\nTo me, event/etcd would make sense if it would share a single etcd watcher for all clients, reducing the load on etcd, but it doesn\u0027t do that, each `value.Watch()` creates a new etcd watcher.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"363320c08ce4475962277a6b8a75e6813cd75dda","unresolved":true,"context_lines":[{"line_number":271,"context_line":"\t\treturn err"},{"line_number":272,"context_line":"\t}"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"\tshouldRun :\u003d !version.ReleaseLessThan(mversion.Version.Release, r.maxRelease)"},{"line_number":275,"context_line":"\tif shouldRun {"},{"line_number":276,"context_line":"\t\tsupervisor.Logger(ctx).Info(\"This Kubernetes controller node has the latest release, starting election.\")"},{"line_number":277,"context_line":"\t\terr :\u003d supervisor.Run(ctx, \"elect\", s.elect)"}],"source_content_type":"text/x-go","patch_set":3,"id":"d3006f84_27372d1e","line":274,"range":{"start_line":274,"start_character":23,"end_line":274,"end_character":38},"updated":"2024-05-02 10:34:49.000000000","message":"We should also triple check that our local version isn\u0027t actually higher than the maxRelease in the collected status (eg. because we failed to submit the status of our version and thus the curator still reports an old one).","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3dc2c7a4e67f07ca7cbf4d262e3c43f3b47b81f1","unresolved":true,"context_lines":[{"line_number":271,"context_line":"\t\treturn err"},{"line_number":272,"context_line":"\t}"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"\tshouldRun :\u003d !version.ReleaseLessThan(mversion.Version.Release, r.maxRelease)"},{"line_number":275,"context_line":"\tif shouldRun {"},{"line_number":276,"context_line":"\t\tsupervisor.Logger(ctx).Info(\"This Kubernetes controller node has the latest release, starting election.\")"},{"line_number":277,"context_line":"\t\terr :\u003d supervisor.Run(ctx, \"elect\", s.elect)"}],"source_content_type":"text/x-go","patch_set":3,"id":"f7d908e4_79a07fa0","line":274,"range":{"start_line":274,"start_character":23,"end_line":274,"end_character":38},"in_reply_to":"d3006f84_27372d1e","updated":"2024-05-06 07:47:52.000000000","message":"The overall design actually assumes that the Kubernetes service cannot start before the local version is stored in etcd. Otherwise, a reconciler could change the state to one which is incompatible with an already running apiserver which has not reported its version yet.\n\nWe don\u0027t have this guarantee currently, so I would like to ensure we have it in a later change.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"2b25147cc599f34b7a2d9c53a452fac98f60dd0d","unresolved":false,"context_lines":[{"line_number":271,"context_line":"\t\treturn err"},{"line_number":272,"context_line":"\t}"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"\tshouldRun :\u003d !version.ReleaseLessThan(mversion.Version.Release, r.maxRelease)"},{"line_number":275,"context_line":"\tif shouldRun {"},{"line_number":276,"context_line":"\t\tsupervisor.Logger(ctx).Info(\"This Kubernetes controller node has the latest release, starting election.\")"},{"line_number":277,"context_line":"\t\terr :\u003d supervisor.Run(ctx, \"elect\", s.elect)"}],"source_content_type":"text/x-go","patch_set":3,"id":"634aea04_6845545e","line":274,"range":{"start_line":274,"start_character":23,"end_line":274,"end_character":38},"in_reply_to":"f7d908e4_79a07fa0","updated":"2024-05-14 09:06:55.000000000","message":"Acknowledged","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"363320c08ce4475962277a6b8a75e6813cd75dda","unresolved":true,"context_lines":[{"line_number":339,"context_line":""},{"line_number":340,"context_line":"\tsupervisor.Logger(ctx).Info(\"Elected.\")"},{"line_number":341,"context_line":"\tisLeaderCmp :\u003d clientv3.Compare(clientv3.CreateRevision(election.Key()), \"\u003d\", election.Rev())"},{"line_number":342,"context_line":"\tleadership.Set(isLeaderCmp)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"\t\u003c-session.Done()"},{"line_number":345,"context_line":"\treturn fmt.Errorf(\"curator session done: %w\", ctx.Err())"}],"source_content_type":"text/x-go","patch_set":3,"id":"37cbebb4_c9d12127","line":342,"range":{"start_line":342,"start_character":1,"end_line":342,"end_character":28},"updated":"2024-05-02 10:34:49.000000000","message":"Why not merge `lead` into `elect` at this point? The only thing the `elect` runnable does from now on is to watch the session, which you can also do in `lead` whenever necessary (eg. in the reconciliation loop select, you can also inject losing the session into a context cancellation to kill the runnable ASAP).\n\nThe current setup has the issue that if the `lead` function ever encounters a permanent error (eg. a programming error) it will run again after a backoff without ceding the leadership. This might get us stuck with a reconciler leader that\u0027s broken with no way to let another leader potentially take over.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4771b7c93d7becd773f7bbcad5ad8f2832a6674c","unresolved":false,"context_lines":[{"line_number":339,"context_line":""},{"line_number":340,"context_line":"\tsupervisor.Logger(ctx).Info(\"Elected.\")"},{"line_number":341,"context_line":"\tisLeaderCmp :\u003d clientv3.Compare(clientv3.CreateRevision(election.Key()), \"\u003d\", election.Rev())"},{"line_number":342,"context_line":"\tleadership.Set(isLeaderCmp)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"\t\u003c-session.Done()"},{"line_number":345,"context_line":"\treturn fmt.Errorf(\"curator session done: %w\", ctx.Err())"}],"source_content_type":"text/x-go","patch_set":3,"id":"1d94e6dd_863444a2","line":342,"range":{"start_line":342,"start_character":1,"end_line":342,"end_character":28},"in_reply_to":"0c8f2e87_19ea3440","updated":"2024-05-08 12:25:39.000000000","message":"Done","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3dc2c7a4e67f07ca7cbf4d262e3c43f3b47b81f1","unresolved":true,"context_lines":[{"line_number":339,"context_line":""},{"line_number":340,"context_line":"\tsupervisor.Logger(ctx).Info(\"Elected.\")"},{"line_number":341,"context_line":"\tisLeaderCmp :\u003d clientv3.Compare(clientv3.CreateRevision(election.Key()), \"\u003d\", election.Rev())"},{"line_number":342,"context_line":"\tleadership.Set(isLeaderCmp)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"\t\u003c-session.Done()"},{"line_number":345,"context_line":"\treturn fmt.Errorf(\"curator session done: %w\", ctx.Err())"}],"source_content_type":"text/x-go","patch_set":3,"id":"b2be018b_f74df86e","line":342,"range":{"start_line":342,"start_character":1,"end_line":342,"end_character":28},"in_reply_to":"37cbebb4_c9d12127","updated":"2024-05-06 07:47:52.000000000","message":"I\u0027m not sure if what you are proposing is better. All nodes participating in the election are at the same Metropolis version, so if there is a programming error, it would affect all of them. So if there is a permanent error, that would cause leadership to endlessly rotate between all those nodes, since each node would resign as soon as it is elected.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"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":"d0211c85ad50720c2bc332985cfae80aa7d64ce0","unresolved":true,"context_lines":[{"line_number":339,"context_line":""},{"line_number":340,"context_line":"\tsupervisor.Logger(ctx).Info(\"Elected.\")"},{"line_number":341,"context_line":"\tisLeaderCmp :\u003d clientv3.Compare(clientv3.CreateRevision(election.Key()), \"\u003d\", election.Rev())"},{"line_number":342,"context_line":"\tleadership.Set(isLeaderCmp)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"\t\u003c-session.Done()"},{"line_number":345,"context_line":"\treturn fmt.Errorf(\"curator session done: %w\", ctx.Err())"}],"source_content_type":"text/x-go","patch_set":3,"id":"0c8f2e87_19ea3440","line":342,"range":{"start_line":342,"start_character":1,"end_line":342,"end_character":28},"in_reply_to":"b2be018b_f74df86e","updated":"2024-05-08 09:11:21.000000000","message":"I think having it rotate between leaders still has a better chance of getting unstuck than spinning within one leader. For example, if we reach some stuckness due to a bug which appears only after the node has been up for enough time, or if the node has some persisted state which causes stuckness.\n\nGranted, this is unlikely to happen with the current codebase, but I like to think how this might change in the future.\n\nPlus I do feel like inlining the two functions will generally simplify this code path quite a bit (no need for the barrier/rendezvous channel, for example).","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"}],"metropolis/node/kubernetes/reconciler/reconciler_status_test.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":"48e78b368fb7f6bbec3012114de2fd8a072e1d98","unresolved":true,"context_lines":[{"line_number":50,"context_line":"\treturn curEtcd"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"func setStatus(t *testing.T, cl client.Namespaced, status *ppb.KubernetesReconcilerStatus) {"},{"line_number":54,"context_line":"\tctx :\u003d context.Background()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"\tstatusBytes, err :\u003d proto.Marshal(status)"}],"source_content_type":"text/x-go","patch_set":1,"id":"33b3d766_766d820b","line":53,"range":{"start_line":53,"start_character":11,"end_line":53,"end_character":12},"updated":"2024-04-30 11:41:48.000000000","message":"You can use t.Helper() in these functions to make sure that if they fail the stack trace goes to the call site, not the helper function.","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cc8e95f2c17dada1547a9917e64d9e12f7d057a2","unresolved":false,"context_lines":[{"line_number":50,"context_line":"\treturn curEtcd"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"func setStatus(t *testing.T, cl client.Namespaced, status *ppb.KubernetesReconcilerStatus) {"},{"line_number":54,"context_line":"\tctx :\u003d context.Background()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"\tstatusBytes, err :\u003d proto.Marshal(status)"}],"source_content_type":"text/x-go","patch_set":1,"id":"a028fe86_34461fa9","line":53,"range":{"start_line":53,"start_character":11,"end_line":53,"end_character":12},"in_reply_to":"33b3d766_766d820b","updated":"2024-05-01 10:05:39.000000000","message":"Done","commit_id":"fbfbfba97b072181d7d371a7e5e71d43ec3ea6d0"}],"version/version.go":[{"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":"363320c08ce4475962277a6b8a75e6813cd75dda","unresolved":true,"context_lines":[{"line_number":38,"context_line":"\treturn ver"},{"line_number":39,"context_line":"}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"func ReleaseLessThan(a, b *spec.Version_Release) bool {"},{"line_number":42,"context_line":"\tif a.Major !\u003d b.Major {"},{"line_number":43,"context_line":"\t\treturn a.Major \u003c b.Major"},{"line_number":44,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"78d760c2_f9c2b373","line":41,"range":{"start_line":41,"start_character":5,"end_line":41,"end_character":20},"updated":"2024-05-02 10:34:49.000000000","message":"Add a godoc comment for exported functions.","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3dc2c7a4e67f07ca7cbf4d262e3c43f3b47b81f1","unresolved":false,"context_lines":[{"line_number":38,"context_line":"\treturn ver"},{"line_number":39,"context_line":"}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"func ReleaseLessThan(a, b *spec.Version_Release) bool {"},{"line_number":42,"context_line":"\tif a.Major !\u003d b.Major {"},{"line_number":43,"context_line":"\t\treturn a.Major \u003c b.Major"},{"line_number":44,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"1fc71bb4_fe4dfec4","line":41,"range":{"start_line":41,"start_character":5,"end_line":41,"end_character":20},"in_reply_to":"78d760c2_f9c2b373","updated":"2024-05-06 07:47:52.000000000","message":"Done","commit_id":"6382863aabc1c2e2cda2b3a8021dabd453e2b816"}]}
