)]}'
{"/PATCHSET_LEVEL":[{"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":"3dd8de11e7717699b1464308e4131d79dd63ad03","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0ab827d8_a427219f","updated":"2022-02-07 13:47:01.000000000","message":"@lorenz: rebased on top of curent main, PTAL.","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"f9f2fe35bff121ac452fa1ff5a46056ef6842a5d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"448a7809_d6caae46","updated":"2022-02-08 17:33:31.000000000","message":"It\u0027s nice seeing the whole dataflow-driven management take shape. But IMO this will need simplification at some point, this level of verbosity is not sustainable long-term.","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"c672fc4f43df8642c467aa5379b4584cc26262c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1097626f_35d27c32","updated":"2022-02-10 14:24:52.000000000","message":"a","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"71d83563980db1d2eacb6a7389c04a665969824f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"c3709248_971f48d3","in_reply_to":"1097626f_35d27c32","updated":"2022-02-21 14:23:10.000000000","message":"Whoops, sorry.","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"c672fc4f43df8642c467aa5379b4584cc26262c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1bec248d_8ccd958e","in_reply_to":"448a7809_d6caae46","updated":"2022-02-10 14:24:52.000000000","message":"I agree, which is also why this change took me so long to push out. But as mentioned in another comment, I\u0027m pretty sure this will all roll up to significantly less code when we have type parameters / generics. Or, if we decide to use codegen.","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"e647b4eec69ca17d2cbb15c8ec0640a65c5bac94","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"0382dd47_f9f84fd5","updated":"2022-02-21 13:37:03.000000000","message":"PTAL","commit_id":"1c337d03ff66746d8a97ee2e22c1d13e112c6b82"}],"metropolis/node/core/roleserve/roleserve.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":"f9f2fe35bff121ac452fa1ff5a46056ef6842a5d","unresolved":true,"context_lines":[{"line_number":1,"context_line":"// package roleserve implements the roleserver/“Role Server”."},{"line_number":2,"context_line":"//"},{"line_number":3,"context_line":"// The Role Server is the owner of any node role dependant services, like the"},{"line_number":4,"context_line":"// control plane (Consensus/etcd and Curator) and Kubernetes. It watches the"},{"line_number":5,"context_line":"// node roles as assigned by the cluster\u0027s curator, updates the status of the"},{"line_number":6,"context_line":"// node within the curator, and spawns on-demand services."}],"source_content_type":"text/x-go","patch_set":4,"id":"ab6cd115_8a8a1822","line":3,"updated":"2022-02-08 17:33:31.000000000","message":"Could you add that the roleserver is a service running on each node handling roles on itself? It can be inferred but I needed to read quite far into this to extract that information.","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"c672fc4f43df8642c467aa5379b4584cc26262c4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"// package roleserve implements the roleserver/“Role Server”."},{"line_number":2,"context_line":"//"},{"line_number":3,"context_line":"// The Role Server is the owner of any node role dependant services, like the"},{"line_number":4,"context_line":"// control plane (Consensus/etcd and Curator) and Kubernetes. It watches the"},{"line_number":5,"context_line":"// node roles as assigned by the cluster\u0027s curator, updates the status of the"},{"line_number":6,"context_line":"// node within the curator, and spawns on-demand services."}],"source_content_type":"text/x-go","patch_set":4,"id":"08664055_2090e1c4","line":3,"in_reply_to":"ab6cd115_8a8a1822","updated":"2022-02-10 14:24:52.000000000","message":"Done","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"f9f2fe35bff121ac452fa1ff5a46056ef6842a5d","unresolved":true,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\tbootstrapData     bootstrapDataValue"},{"line_number":71,"context_line":"\tlocalRoles        localRolesValue"},{"line_number":72,"context_line":"\tClusterMembership ClusterMembershipValue"},{"line_number":73,"context_line":"\tKubernetesStatus  KubernetesStatusValue"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"\tcontrolPlane *workerControlPlane"}],"source_content_type":"text/x-go","patch_set":4,"id":"c0da705a_5f789f60","line":72,"range":{"start_line":72,"start_character":1,"end_line":72,"end_character":18},"updated":"2022-02-08 17:33:31.000000000","message":"Could you reorder those so that exported fields are first?","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"c672fc4f43df8642c467aa5379b4584cc26262c4","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\tbootstrapData     bootstrapDataValue"},{"line_number":71,"context_line":"\tlocalRoles        localRolesValue"},{"line_number":72,"context_line":"\tClusterMembership ClusterMembershipValue"},{"line_number":73,"context_line":"\tKubernetesStatus  KubernetesStatusValue"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"\tcontrolPlane *workerControlPlane"}],"source_content_type":"text/x-go","patch_set":4,"id":"094a8f6b_c8891733","line":72,"range":{"start_line":72,"start_character":1,"end_line":72,"end_character":18},"in_reply_to":"c0da705a_5f789f60","updated":"2022-02-10 14:24:52.000000000","message":"Done","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"}],"metropolis/node/core/roleserve/worker_controlplane.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":"f9f2fe35bff121ac452fa1ff5a46056ef6842a5d","unresolved":true,"context_lines":[{"line_number":99,"context_line":"\tclusterMembershipC :\u003d make(chan *ClusterMembership)"},{"line_number":100,"context_line":"\trolesC :\u003d make(chan *cpb.NodeRoles)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"\tsupervisor.RunGroup(ctx, map[string]supervisor.Runnable{"},{"line_number":103,"context_line":"\t\t// Plain conversion from Event Value to channel."},{"line_number":104,"context_line":"\t\t\"map-bootstrap-data\": func(ctx context.Context) error {"},{"line_number":105,"context_line":"\t\t\tw :\u003d s.bootstrapData.Watch()"}],"source_content_type":"text/x-go","patch_set":4,"id":"47f0bec9_d71f12b6","line":102,"range":{"start_line":102,"start_character":1,"end_line":102,"end_character":20},"updated":"2022-02-08 17:33:31.000000000","message":"That\u0027s a lot of code for essentially depending on multiple event values which will probably be quite common in a dataflow-oriented supervisor system. Any thoughts on what could/should be done to make event values work better for this?","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"747cddd67a9e123f24f4aaefd6100e093cc749d4","unresolved":false,"context_lines":[{"line_number":99,"context_line":"\tclusterMembershipC :\u003d make(chan *ClusterMembership)"},{"line_number":100,"context_line":"\trolesC :\u003d make(chan *cpb.NodeRoles)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"\tsupervisor.RunGroup(ctx, map[string]supervisor.Runnable{"},{"line_number":103,"context_line":"\t\t// Plain conversion from Event Value to channel."},{"line_number":104,"context_line":"\t\t\"map-bootstrap-data\": func(ctx context.Context) error {"},{"line_number":105,"context_line":"\t\t\tw :\u003d s.bootstrapData.Watch()"}],"source_content_type":"text/x-go","patch_set":4,"id":"16010f43_08f333a5","line":102,"range":{"start_line":102,"start_character":1,"end_line":102,"end_character":20},"in_reply_to":"064b07c7_d14348a4","updated":"2022-02-22 19:30:04.000000000","message":"Ack","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"c672fc4f43df8642c467aa5379b4584cc26262c4","unresolved":true,"context_lines":[{"line_number":99,"context_line":"\tclusterMembershipC :\u003d make(chan *ClusterMembership)"},{"line_number":100,"context_line":"\trolesC :\u003d make(chan *cpb.NodeRoles)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"\tsupervisor.RunGroup(ctx, map[string]supervisor.Runnable{"},{"line_number":103,"context_line":"\t\t// Plain conversion from Event Value to channel."},{"line_number":104,"context_line":"\t\t\"map-bootstrap-data\": func(ctx context.Context) error {"},{"line_number":105,"context_line":"\t\t\tw :\u003d s.bootstrapData.Watch()"}],"source_content_type":"text/x-go","patch_set":4,"id":"064b07c7_d14348a4","line":102,"range":{"start_line":102,"start_character":1,"end_line":102,"end_character":20},"in_reply_to":"47f0bec9_d71f12b6","updated":"2022-02-10 14:24:52.000000000","message":"It is a lot of code, and it\u0027s why I\u0027ve spent so much time on this change - trying to make it less verbose :).\n\nI think this is the best we can do without type parameters / generics or code generation. If it wasn\u0027t for Go 1.18 landing soon with support for the former, I would\u0027ve employed codegen here.\n\nMost of the repeated code is just that - repeated code that will easily roll back up into a single generic codepath. I haven\u0027t yet designed an exact implementation with 1.18 generics, but  my gut feeling is that it will be trivial to port this over.","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"f9f2fe35bff121ac452fa1ff5a46056ef6842a5d","unresolved":true,"context_lines":[{"line_number":161,"context_line":"\t\t\t\t// data is only effectively used to populate the JoinCluster parameter of etcd,"},{"line_number":162,"context_line":"\t\t\t\t// which in turns is only used when a node is starting without any data present."},{"line_number":163,"context_line":"\t\t\t\t// And since we managed to get our own node roles and that won the race against"},{"line_number":164,"context_line":"\t\t\t\t// bootstrap data, it means the bootstrap was succesfull and we can now start"},{"line_number":165,"context_line":"\t\t\t\t// without the bootstrap data."},{"line_number":166,"context_line":"\t\t\t\t//"},{"line_number":167,"context_line":"\t\t\t\t// The only problem is when we remove a ConsensusMember from a node which still"}],"source_content_type":"text/x-go","patch_set":4,"id":"1bc4803b_ee90f477","line":164,"range":{"start_line":164,"start_character":50,"end_line":164,"end_character":60},"updated":"2022-02-08 17:33:31.000000000","message":"successful","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"c672fc4f43df8642c467aa5379b4584cc26262c4","unresolved":false,"context_lines":[{"line_number":161,"context_line":"\t\t\t\t// data is only effectively used to populate the JoinCluster parameter of etcd,"},{"line_number":162,"context_line":"\t\t\t\t// which in turns is only used when a node is starting without any data present."},{"line_number":163,"context_line":"\t\t\t\t// And since we managed to get our own node roles and that won the race against"},{"line_number":164,"context_line":"\t\t\t\t// bootstrap data, it means the bootstrap was succesfull and we can now start"},{"line_number":165,"context_line":"\t\t\t\t// without the bootstrap data."},{"line_number":166,"context_line":"\t\t\t\t//"},{"line_number":167,"context_line":"\t\t\t\t// The only problem is when we remove a ConsensusMember from a node which still"}],"source_content_type":"text/x-go","patch_set":4,"id":"e7f771cf_647ec9a3","line":164,"range":{"start_line":164,"start_character":50,"end_line":164,"end_character":60},"in_reply_to":"1bc4803b_ee90f477","updated":"2022-02-10 14:24:52.000000000","message":"Done","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"f9f2fe35bff121ac452fa1ff5a46056ef6842a5d","unresolved":true,"context_lines":[{"line_number":165,"context_line":"\t\t\t\t// without the bootstrap data."},{"line_number":166,"context_line":"\t\t\t\t//"},{"line_number":167,"context_line":"\t\t\t\t// The only problem is when we remove a ConsensusMember from a node which still"},{"line_number":168,"context_line":"\t\t\t\t// hass BootstrapData lingering from first bootup. However, we currently do not"},{"line_number":169,"context_line":"\t\t\t\t// support removing consensus roles (or any roles for that matter)."},{"line_number":170,"context_line":"\t\t\t\t//"},{"line_number":171,"context_line":"\t\t\t\t// TODO(q3k): support the above edge case. This can be done, for example, by"}],"source_content_type":"text/x-go","patch_set":4,"id":"7ab1b409_4ba2149c","line":168,"range":{"start_line":168,"start_character":7,"end_line":168,"end_character":11},"updated":"2022-02-08 17:33:31.000000000","message":"has","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"c672fc4f43df8642c467aa5379b4584cc26262c4","unresolved":false,"context_lines":[{"line_number":165,"context_line":"\t\t\t\t// without the bootstrap data."},{"line_number":166,"context_line":"\t\t\t\t//"},{"line_number":167,"context_line":"\t\t\t\t// The only problem is when we remove a ConsensusMember from a node which still"},{"line_number":168,"context_line":"\t\t\t\t// hass BootstrapData lingering from first bootup. However, we currently do not"},{"line_number":169,"context_line":"\t\t\t\t// support removing consensus roles (or any roles for that matter)."},{"line_number":170,"context_line":"\t\t\t\t//"},{"line_number":171,"context_line":"\t\t\t\t// TODO(q3k): support the above edge case. This can be done, for example, by"}],"source_content_type":"text/x-go","patch_set":4,"id":"d3053795_0e88e4e5","line":168,"range":{"start_line":168,"start_character":7,"end_line":168,"end_character":11},"in_reply_to":"7ab1b409_4ba2149c","updated":"2022-02-10 14:24:52.000000000","message":"Done","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"f9f2fe35bff121ac452fa1ff5a46056ef6842a5d","unresolved":false,"context_lines":[{"line_number":375,"context_line":"\t\t\tnc :\u003d ncI.(*controlPlaneStartup)"},{"line_number":376,"context_line":"\t\t\tif nc.changed(startup) {"},{"line_number":377,"context_line":"\t\t\t\tsupervisor.Logger(ctx).Infof(\"Configuration changed, restarting...\")"},{"line_number":378,"context_line":"\t\t\t\treturn fmt.Errorf(\"config changed, restarting\")"},{"line_number":379,"context_line":"\t\t\t}"},{"line_number":380,"context_line":"\t\t}"},{"line_number":381,"context_line":"\t})"}],"source_content_type":"text/x-go","patch_set":4,"id":"fde04452_7b238181","line":378,"range":{"start_line":378,"start_character":11,"end_line":378,"end_character":21},"updated":"2022-02-08 17:33:31.000000000","message":"Eventually we need some marker on an error to distinguish between \"expected\" runnable exits and \"unexpected\" runnable exits (otherwise we cannot for example collect error statistics), but this is currently not the only code doing this, so let\u0027s leave that for later.","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"}],"metropolis/node/core/roleserve/worker_rolefetch.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":"f9f2fe35bff121ac452fa1ff5a46056ef6842a5d","unresolved":true,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"// workerRoleFetch is the Role Fetcher, an internal bookkeeping service"},{"line_number":12,"context_line":"// responsible for populating localRoles based on a clusterMembership whenever"},{"line_number":13,"context_line":"// the node is HOME and cluster credentials / curator access is asvailable."},{"line_number":14,"context_line":"type workerRoleFetch struct {"},{"line_number":15,"context_line":"\tclusterMembership *ClusterMembershipValue"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-go","patch_set":4,"id":"aee5eec6_455c4bc3","line":13,"range":{"start_line":13,"start_character":64,"end_line":13,"end_character":74},"updated":"2022-02-08 17:33:31.000000000","message":"available","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"},{"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":"c672fc4f43df8642c467aa5379b4584cc26262c4","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"// workerRoleFetch is the Role Fetcher, an internal bookkeeping service"},{"line_number":12,"context_line":"// responsible for populating localRoles based on a clusterMembership whenever"},{"line_number":13,"context_line":"// the node is HOME and cluster credentials / curator access is asvailable."},{"line_number":14,"context_line":"type workerRoleFetch struct {"},{"line_number":15,"context_line":"\tclusterMembership *ClusterMembershipValue"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-go","patch_set":4,"id":"f9e7b612_1cb89a24","line":13,"range":{"start_line":13,"start_character":64,"end_line":13,"end_character":74},"in_reply_to":"aee5eec6_455c4bc3","updated":"2022-02-10 14:24:52.000000000","message":"Done","commit_id":"a7cbc1891938dc38fc1b66a6d3e837a021d8d46f"}]}
