)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"6ed76d4989e22d4c868db0f34d70eb3ec6130089","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2014-08-06 13:16:21 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Remove routers from down l3 agents"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them. If"},{"line_number":11,"context_line":"the status is down, the router will be rescheduled to an"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"baada198_f162fc13","line":8,"updated":"2014-08-07 22:22:10.000000000","message":"Kevin, have you tested the case of a network node that\u0027s alive and well but the l3 agent crashes? IE the headless router scenario we talked about in the l3 meeting? The router will be scheduled to a 2nd node and will exist twice, until the first agent comes back up. I\u0027d imagine this would mess up connectivity as the same MAC address will exist in two different locations on the network.","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"df0b8c6d8de51e4323abe2850b37eca0bd2c4dc5","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2014-08-06 13:16:21 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Remove routers from down l3 agents"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them. If"},{"line_number":11,"context_line":"the status is down, the router will be rescheduled to an"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"baada198_e1a3e798","line":8,"in_reply_to":"baada198_f162fc13","updated":"2014-08-08 20:08:44.000000000","message":"This is why it\u0027s configurable. It\u0027s not a problem solvable by neutron because neutron\u0027s only method to tell if an l3 agent is active is via the heartbeats.\n\nSome backends will automatically block the old MAC address on that port since there is a correct statically defined entry on the new port.","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f81ddc5872253735b16e8dc6bed054d6c801de42","unresolved":false,"context_lines":[{"line_number":11,"context_line":"the status is down, the router will be rescheduled to an"},{"line_number":12,"context_line":"active agent."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partial-Bug: #1174591"},{"line_number":15,"context_line":"Change-Id: Id7d487f54ca54fdd46b7616c0969319afc0bb589"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"baada198_689a7d61","line":14,"updated":"2014-08-08 01:42:00.000000000","message":"DocImpact!","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"df0b8c6d8de51e4323abe2850b37eca0bd2c4dc5","unresolved":false,"context_lines":[{"line_number":11,"context_line":"the status is down, the router will be rescheduled to an"},{"line_number":12,"context_line":"active agent."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partial-Bug: #1174591"},{"line_number":15,"context_line":"Change-Id: Id7d487f54ca54fdd46b7616c0969319afc0bb589"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"baada198_01b45bd2","line":14,"in_reply_to":"baada198_689a7d61","updated":"2014-08-08 20:08:44.000000000","message":"Done","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4ffcc6b25aff8a8d488c55e3ac3e393af80964db","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kevin Benton \u003cblak111@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-08-13 00:00:53 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Remove routers from down l3 agents"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them. If"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7ac7a964_9d406458","line":7,"updated":"2014-08-14 01:55:47.000000000","message":"Do we want to be more verbose about the limitations of this approach? Or do you feel that the bug report has a sufficient amount of details?","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7e696a74aa24af16ec70d53fabd8f7e679ec2a0d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kevin Benton \u003cblak111@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-08-13 00:00:53 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Remove routers from down l3 agents"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them. If"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7ac7a964_422c1f4b","line":7,"in_reply_to":"7ac7a964_9d406458","updated":"2014-08-14 07:11:31.000000000","message":"I will type more words.","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4ffcc6b25aff8a8d488c55e3ac3e393af80964db","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them. If"},{"line_number":11,"context_line":"the status is down, the router will be rescheduled to an"},{"line_number":12,"context_line":"active agent."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"DocImpact"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7ac7a964_dd5adc4f","line":12,"updated":"2014-08-14 01:55:47.000000000","message":"active and enabled? You used \u0027online\u0027 in the conf file, should we be consistent and/or explain what we mean by \u0027online\u0027?","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4ffcc6b25aff8a8d488c55e3ac3e393af80964db","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"DocImpact"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Partial-Bug: #1174591"},{"line_number":17,"context_line":"Change-Id: Id7d487f54ca54fdd46b7616c0969319afc0bb589"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7ac7a964_1d2c54ab","line":16,"updated":"2014-08-14 01:55:47.000000000","message":"why partial? what\u0027s left to do?","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7e696a74aa24af16ec70d53fabd8f7e679ec2a0d","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"DocImpact"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Partial-Bug: #1174591"},{"line_number":17,"context_line":"Change-Id: Id7d487f54ca54fdd46b7616c0969319afc0bb589"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7ac7a964_620afbd3","line":16,"in_reply_to":"7ac7a964_1d2c54ab","updated":"2014-08-14 07:11:31.000000000","message":"The original bug was for all agents. This only address L3 agents.","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9423cb2cf19dc9e78e0d72357c694fccd72682c2","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them and"},{"line_number":11,"context_line":"admin_state_up set to True. If the agent is dead, the router"},{"line_number":12,"context_line":"will be rescheduled to an alive agent."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This is configuration driven because a dead L3 agent could"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"7ac7a964_03e858b3","line":11,"updated":"2014-08-14 14:14:38.000000000","message":"not sure dead is an appropriate term. Here you\u0027re making the decision based on the fact that no agent reports have come in. Whether the agent has died or not is a different matter. Think about the use case people brought up where there\u0027s a network partition that isolate server and agents.","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"d950843cfda26540dc7b2e2fae6d3d7484604289","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them and"},{"line_number":11,"context_line":"admin_state_up set to True. If the agent is dead, the router"},{"line_number":12,"context_line":"will be rescheduled to an alive agent."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This is configuration driven because a dead L3 agent could"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"7ac7a964_d479b8fd","line":11,"in_reply_to":"7ac7a964_03e858b3","updated":"2014-08-14 15:29:14.000000000","message":"\u0027alive\u0027 is the terminology already used by neutron agent-list. I thought it would be better to match that.","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"11f4f0cf5f4a4119419c0356254f3f929ca1451c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them and"},{"line_number":11,"context_line":"admin_state_up set to True. If the agent is dead, the router"},{"line_number":12,"context_line":"will be rescheduled to an alive agent."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This is configuration driven because a dead L3 agent could"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"7ac7a964_7a8d2a7b","line":11,"in_reply_to":"7ac7a964_2f4a9580","updated":"2014-08-14 17:21:29.000000000","message":"i\u0027ll put more words","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"0ce3c5fc1f29e5d7ac00807cb72ad95d4c2a54b7","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them and"},{"line_number":11,"context_line":"admin_state_up set to True. If the agent is dead, the router"},{"line_number":12,"context_line":"will be rescheduled to an alive agent."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This is configuration driven because a dead L3 agent could"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"7ac7a964_2f4a9580","line":11,"in_reply_to":"7ac7a964_d479b8fd","updated":"2014-08-14 15:55:51.000000000","message":"understood. hopefully doc readers will too.","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"df481711ceba74d6e94cc5fd7ce338185f483737","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kevin Benton \u003cblak111@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-08-13 10:26:22 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Option to remove routers from dead l3 agents"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a configuration-enabled periodic check to examine the"},{"line_number":10,"context_line":"status of all L3 agents with routers scheduled to them and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7ac7a964_98badc6c","line":7,"updated":"2014-08-15 20:39:56.000000000","message":"nit: s/remove/reschedule/ but not important enough to hold this up","commit_id":"9677cf87cb831cfd344bc63cbee23be52392c300"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"df481711ceba74d6e94cc5fd7ce338185f483737","unresolved":false,"context_lines":[{"line_number":11,"context_line":"admin_state_up set to True. If the agent is dead, the router"},{"line_number":12,"context_line":"will be rescheduled to an alive agent."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Neutron considers and agent \u0027dead\u0027 when the server doesn\u0027t"},{"line_number":15,"context_line":"receive any heartbeat messages from the agent over the"},{"line_number":16,"context_line":"RPC channel within a given number of seconds (agent_down_time)."},{"line_number":17,"context_line":"There are various false positive scenarios where the agent may"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7ac7a964_7845006f","line":14,"updated":"2014-08-15 20:39:56.000000000","message":"super nit: s/and/an/","commit_id":"9677cf87cb831cfd344bc63cbee23be52392c300"}],"etc/neutron.conf":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"59eda391a59a9d17580a681c0f154ce07c1dbaec","unresolved":false,"context_lines":[{"line_number":161,"context_line":"# router_auto_schedule \u003d True"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from offline L3 agents to online agents."},{"line_number":164,"context_line":"# router_auto_reschedule_from_dead_agents \u003d False"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":167,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":6,"id":"baada198_4b32255f","line":164,"updated":"2014-08-07 16:16:24.000000000","message":"This seems like a really long name, is just \u0027router_auto_reschedule\u0027 a better option?","commit_id":"7ac76eea37e746718683ebb9b317550bb6943c58"},{"author":{"_account_id":11825,"name":"Sudhakar Babu Gariganti","email":"sudhakar.gariganti@gmail.com","username":"sudhakar-gariganti"},"change_message_id":"4365af8c1811b87a51e81962b164f530145282e2","unresolved":false,"context_lines":[{"line_number":161,"context_line":"# router_auto_schedule \u003d True"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from offline L3 agents to online agents."},{"line_number":164,"context_line":"# router_auto_reschedule_from_dead_agents \u003d False"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":167,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":7,"id":"baada198_6ee189fb","line":164,"updated":"2014-08-08 18:03:53.000000000","message":"we should rename this to more generic flag, so that others also can make use of. For example, if we are adding similar support for DHCP or VPN, we can reuse the flag, instead of adding new ones again.\n\nenable_auto_rescheduling?","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f81ddc5872253735b16e8dc6bed054d6c801de42","unresolved":false,"context_lines":[{"line_number":161,"context_line":"# router_auto_schedule \u003d True"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from offline L3 agents to online agents."},{"line_number":164,"context_line":"# router_auto_reschedule_from_dead_agents \u003d False"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":167,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":7,"id":"baada198_a8a495a3","line":164,"updated":"2014-08-08 01:42:00.000000000","message":"wow could we be any more verbose? :)\nwould allow_automatic_l3agent_failover do? That said I am not fussed.","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"df0b8c6d8de51e4323abe2850b37eca0bd2c4dc5","unresolved":false,"context_lines":[{"line_number":161,"context_line":"# router_auto_schedule \u003d True"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from offline L3 agents to online agents."},{"line_number":164,"context_line":"# router_auto_reschedule_from_dead_agents \u003d False"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":167,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":7,"id":"baada198_610b577c","line":164,"in_reply_to":"baada198_6ee189fb","updated":"2014-08-08 20:08:44.000000000","message":"I would prefer not to make it generic until it actually is generic. It\u0027s probably a good idea to keep them separate anyway because a dnsmasq instance continuing to run if the DHCP agent fails doesn\u0027t hurt as much as a router that continues to run since the router keeps connection state.","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"df0b8c6d8de51e4323abe2850b37eca0bd2c4dc5","unresolved":false,"context_lines":[{"line_number":161,"context_line":"# router_auto_schedule \u003d True"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from offline L3 agents to online agents."},{"line_number":164,"context_line":"# router_auto_reschedule_from_dead_agents \u003d False"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":167,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":7,"id":"baada198_21631f42","line":164,"in_reply_to":"baada198_a8a495a3","updated":"2014-08-08 20:08:44.000000000","message":"I suppose...","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"a2ce57bd1fc0b9decd422cf5e484aa6047b6e54b","unresolved":false,"context_lines":[{"line_number":161,"context_line":"# router_auto_schedule \u003d True"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from offline L3 agents to online agents."},{"line_number":164,"context_line":"# allow_automatic_l3agent_failover \u003d False"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":167,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":10,"id":"7ac7a964_b6e61d15","line":164,"updated":"2014-08-14 03:33:15.000000000","message":"Not sure if this has come up before, but what have you considered the case where we\u0027re running multiple servers? Wouldn\u0027t that stomp on each other? We could disable this flag on N of the N+1 servers for instance, but some deployment tools may find this problematic and it may introduce SPOF. Perhaps a random splay may help mitigate the stomping problem, or am I barking up at the wrong tree?","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"394dcf5cc32b64e76c40833beb6e0c7582d515e7","unresolved":false,"context_lines":[{"line_number":161,"context_line":"# router_auto_schedule \u003d True"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from offline L3 agents to online agents."},{"line_number":164,"context_line":"# allow_automatic_l3agent_failover \u003d False"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":167,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":10,"id":"7ac7a964_43f970c7","line":164,"in_reply_to":"7ac7a964_a4b0a0de","updated":"2014-08-14 14:11:41.000000000","message":"I mean, multiple Neutron Servers running behind a load balancer.","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"e5570bdf4cd6710e3654b765bcf3a62bd20c49e1","unresolved":false,"context_lines":[{"line_number":161,"context_line":"# router_auto_schedule \u003d True"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from offline L3 agents to online agents."},{"line_number":164,"context_line":"# allow_automatic_l3agent_failover \u003d False"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":167,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":10,"id":"7ac7a964_648f6824","line":164,"in_reply_to":"7ac7a964_b6e61d15","updated":"2014-08-14 06:55:10.000000000","message":"Armando, could you elaborate the scenario?\n\nDo you mean that all virtual routers in a failed node would go to another node, potentially crashing this new node?\n\nWouldn\u0027t those get scheduled according to the configured scheduler?\n\nI only see that, for using this feature you need your network nodes to be well capacity planned over the normal usage, but I\u0027m probably missing something.\n\n(And I\u0027m ignoring here the non-naive cases where a node fails to connect to RPC, but the network resources keep working on the old node, probably producing network collisions..., etc. But that is discussed, and this option should be used with that risk in mind)","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7e696a74aa24af16ec70d53fabd8f7e679ec2a0d","unresolved":false,"context_lines":[{"line_number":161,"context_line":"# router_auto_schedule \u003d True"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from offline L3 agents to online agents."},{"line_number":164,"context_line":"# allow_automatic_l3agent_failover \u003d False"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":167,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":10,"id":"7ac7a964_a4b0a0de","line":164,"in_reply_to":"7ac7a964_b6e61d15","updated":"2014-08-14 07:11:31.000000000","message":"Miguel, I believe he is just referring to the case where multiple servers are running this check simultaneously and both decide to reschedule routers at the same time.\n\nThe unbind portion of the rescheduling will only work on one and will raise an error on the other.","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9423cb2cf19dc9e78e0d72357c694fccd72682c2","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from dead L3 agents with"},{"line_number":164,"context_line":"# admin_state_up set to True to alive agents."},{"line_number":165,"context_line":"# allow_automatic_l3agent_failover \u003d False"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":168,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":11,"id":"7ac7a964_2304747a","line":165,"updated":"2014-08-14 14:14:38.000000000","message":"I haven\u0027t seen your reply on the multi-server case. I think that\u0027s important: what is your take?","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"48350aa1cb2f479b694981c220e928e95362ccd6","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"# Allow automatic rescheduling of routers from dead L3 agents with"},{"line_number":164,"context_line":"# admin_state_up set to True to alive agents."},{"line_number":165,"context_line":"# allow_automatic_l3agent_failover \u003d False"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"# Number of DHCP agents scheduled to host a network. This enables redundant"},{"line_number":168,"context_line":"# DHCP agents for configured networks."}],"source_content_type":"text/plain","patch_set":11,"id":"7ac7a964_6923ad05","line":165,"in_reply_to":"7ac7a964_2304747a","updated":"2014-08-14 15:05:16.000000000","message":"oops, disregard.","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"}],"neutron/db/l3_agentschedulers_db.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"a9a97cbceceb0cc5e22bc2c59aca100afb05efd6","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":83,"context_line":"                for binding in bindings:"},{"line_number":84,"context_line":"                    if not binding.l3_agent.is_active:"},{"line_number":85,"context_line":"                        self.remove_router_from_l3_agent("},{"line_number":86,"context_line":"                            context, binding.l3_agent_id, binding.router_id)"},{"line_number":87,"context_line":"            except (n_exc.NeutronException, db_exc.DBError):"},{"line_number":88,"context_line":"                # catch here to ignore exceptions caused by concurrent access"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_f9790cfc","line":85,"updated":"2014-07-31 10:50:32.000000000","message":"that seems to be prone to race conditions in case multiple neutron servers are doing this check.\nI suggest at least to catch DBError in each iteration.\nPlus it would be better to only log something when the it\u0027s really error condition.\n\nAlso, theoretically (while unlikely) it\u0027s possible that we remove router from already healthy agent.","commit_id":"dc40ee5af2150a4b4bd9f7572ad468fe409aa8d4"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"93e50ddc63d37933de14c030999da1633b108888","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":83,"context_line":"                for binding in bindings:"},{"line_number":84,"context_line":"                    if not binding.l3_agent.is_active:"},{"line_number":85,"context_line":"                        self.remove_router_from_l3_agent("},{"line_number":86,"context_line":"                            context, binding.l3_agent_id, binding.router_id)"},{"line_number":87,"context_line":"            except (n_exc.NeutronException, db_exc.DBError):"},{"line_number":88,"context_line":"                # catch here to ignore exceptions caused by concurrent access"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_d785e80a","line":85,"in_reply_to":"baada198_f9790cfc","updated":"2014-07-31 14:25:35.000000000","message":"I\u0027ll move the exception check into the iteration.\n\nBy healthy agent, you mean one that just came online after the \u0027is_active\u0027 check, right? If so, I don\u0027t think that\u0027s something we need to worry about too much. It\u0027s not that it breaks anything, it just unnecessarily goes through the scheduling process again.","commit_id":"dc40ee5af2150a4b4bd9f7572ad468fe409aa8d4"},{"author":{"_account_id":11825,"name":"Sudhakar Babu Gariganti","email":"sudhakar.gariganti@gmail.com","username":"sudhakar-gariganti"},"change_message_id":"664812c7066f50ab03f1af34d516841bb430cf89","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    router_scheduler \u003d None"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def start_periodic_agent_status_check(self, interval\u003d60):"},{"line_number":70,"context_line":"        if not cfg.CONF.router_auto_schedule:"},{"line_number":71,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":72,"context_line":"                       \"automatic router scheduling is disabled.\"))"},{"line_number":73,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_e39f7263","line":70,"updated":"2014-08-01 08:59:16.000000000","message":"I agree with the points brought out by Miguel.\n\nAlso we are kind of fixing on the periodic interval to 60 secs, as we are not passing any value while calling this method from plugin. Its better to base this interval based on report_interval and agent_down_time values. \nThis interval can be slightly greater than the report_interval and less than agent_down_time to ensure we catch the agent failures at the earliest.","commit_id":"84043f1bb163b526bea5dd916bb93aa80f2fc8db"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"58d3f2fdcf33026493cd25392cebfc1f0328fd57","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    router_scheduler \u003d None"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def start_periodic_agent_status_check(self, interval\u003d60):"},{"line_number":70,"context_line":"        if not cfg.CONF.router_auto_schedule:"},{"line_number":71,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":72,"context_line":"                       \"automatic router scheduling is disabled.\"))"},{"line_number":73,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_3aca6fa0","line":70,"updated":"2014-08-01 07:18:51.000000000","message":"Please add another setting to allow this feature to be disabled, we do this in a different way in Red Hat:\n\n    I know the approach you\u0027re trying to implement, and I know it\u0027s used\nin a few companies via the AT\u0026T scripts.\n\n    I once started writing the same implementation you\u0027re proposing,\nbut then I stopped it after talking to our HA experts, they gave me\nvery good reasons, imagine this scenario/failure mode:\n\n\n    1) An agent crashes, therefore it stops answering hearbeats,\n       imagine that it also has some kind of resource exhaustion that\n       wont let it restart automatically even if you configured that...\n\n    2) Neutron server (or the at\u0026t scripts) detect that, and move \n       the vrouters to a different host.\n\n    3) The new l3 agent starts the vrouters, good...\n\n    but now, we have the same IP addresses and Vrouters *working* in both\n    nodes, the old one, which is \"headless\" but has all the qrouter-* \n    namespaces, and the new one which actually has an agent.\n\n    This make you having IP conflicts in the network, duplicate packets,\n    etc...\n\n\n    We solved this in Red Hat (for the time being), using pacemaker + active/passive\nconfiguration,  using two nodes, (but you could do several pairs).., and adding\ntwo things to the setup:\n     1) neutron-netns-cleanup --forced and neutron-ovs-cleanup (when we manually migrate\n                                                                an agent from A to P host)\n\n     2) fencing (that means using IPMI api or LOM to reboot the failed host) via pacemaker\n\n    we use the agent \"host\u003d\" parameter, that sets a logical identifier towards\nneutron-server, in\n\nin \n\nnode1:  \n  we set   host\u003dneutron-network-node\n\nnode2:   \n  we set   host\u003dneutron-network-node \n\nAlso, you need to set the exact same host\u003d logical id into the openvswitch plugin.ini\nfile in the host, otherwise they won\u0027t play well together.\n\nMore details here:\nhttps://github.com/fabbione/rhos-ha-deploy/blob/master/rhos5-rhel7/mrgcloud-setup/RHOS-RHEL-HA-how-to-mrgcloud-rhos5-on-rhel7-neutron-n-latest.txt\n\n\n\n\nBTW:\n    I believe the implementation could be ok if we provide a setting to enable/disable this, \nand keep it disabled by default on first versions.\n\n    why?, if we manage to auto-migrate resources, and then make the agent aware that \nit\u0027s down (not getting reply to it\u0027s heartbeats -not sure if that\u0027s enough-) we could cleanup \nthe migrated host, or fence it down.\n\n              we could also think of interfacing pacemaker or other solutions to do fencing\nfor us.... I have to check if that\u0027s possible.","commit_id":"84043f1bb163b526bea5dd916bb93aa80f2fc8db"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"6c466a115c6fb4350becb4eb50c441b73c0e3bb0","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def start_periodic_agent_status_check(self, interval\u003d60):"},{"line_number":70,"context_line":"        if not cfg.CONF.router_auto_schedule:"},{"line_number":71,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":72,"context_line":"                       \"automatic router scheduling is disabled.\"))"},{"line_number":73,"context_line":"            return"},{"line_number":74,"context_line":"        eventlet.spawn_n(self.periodic_agent_status_check, interval)"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_5220f1af","line":71,"updated":"2014-08-01 02:27:51.000000000","message":"period -\u003e periodic","commit_id":"84043f1bb163b526bea5dd916bb93aa80f2fc8db"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"4ab7eda63e288f7f9f086f2c7d72e2a7237e41a2","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                        except db_exc.DBError as dbex:"},{"line_number":95,"context_line":"                            LOG.debug("},{"line_number":96,"context_line":"                                \"Ignored DB error likely caused by concurrent \""},{"line_number":97,"context_line":"                                \"access from multiple servers.\", dbex)"},{"line_number":98,"context_line":"            except (n_exc.NeutronException, db_exc.DBError):"},{"line_number":99,"context_line":"                # catch here to prevent operational exceptions from killing"},{"line_number":100,"context_line":"                # the coroutine"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_3f482862","line":97,"range":{"start_line":97,"start_character":63,"end_line":97,"end_character":69},"updated":"2014-08-05 12:51:05.000000000","message":"format string mismatch?","commit_id":"8284b022c013b6f0a35b7ce1fc4f0033646916dd"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"a6be3ddd872c96f5c4f0f6a484afa7ac52e0ec77","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                        except db_exc.DBError as dbex:"},{"line_number":95,"context_line":"                            LOG.debug("},{"line_number":96,"context_line":"                                \"Ignored DB error likely caused by concurrent \""},{"line_number":97,"context_line":"                                \"access from multiple servers.\", dbex)"},{"line_number":98,"context_line":"            except (n_exc.NeutronException, db_exc.DBError):"},{"line_number":99,"context_line":"                # catch here to prevent operational exceptions from killing"},{"line_number":100,"context_line":"                # the coroutine"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_ed3443e2","line":97,"in_reply_to":"baada198_3f482862","updated":"2014-08-05 16:25:55.000000000","message":"Done","commit_id":"8284b022c013b6f0a35b7ce1fc4f0033646916dd"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"ab645d64bb01dd5117b8cadb4b327b01e98b1f1a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    \"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    router_scheduler \u003d None"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def start_periodic_agent_status_check(self, interval\u003dNone):"},{"line_number":73,"context_line":"        if not interval:"},{"line_number":74,"context_line":"            interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_fea5b203","line":71,"updated":"2014-08-06 06:48:37.000000000","message":"Since this function is only used at a single spot, in this patch, I think the interval argument can either be removed, or used, but the default argument value is an unneeded \u0027complication\u0027.","commit_id":"39a226497540a27e7345d55ed64db87be54f4a05"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ecc3d8dc77509a551a90dd8e148c7b3e3482c053","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    \"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    router_scheduler \u003d None"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def start_periodic_agent_status_check(self, interval\u003dNone):"},{"line_number":73,"context_line":"        if not interval:"},{"line_number":74,"context_line":"            interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_66b2d097","line":71,"in_reply_to":"baada198_fea5b203","updated":"2014-08-07 07:35:02.000000000","message":"Done","commit_id":"39a226497540a27e7345d55ed64db87be54f4a05"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"ab645d64bb01dd5117b8cadb4b327b01e98b1f1a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":78,"context_line":"            return"},{"line_number":79,"context_line":"        eventlet.spawn_n(self.periodic_agent_status_check, interval)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def periodic_agent_status_check(self, interval):"},{"line_number":82,"context_line":"        \"\"\"Unschedule routers from down l3 agents.\"\"\""},{"line_number":83,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_9e7d9673","line":80,"updated":"2014-08-06 06:48:37.000000000","message":"Have you looked into periodic tasks instead of a while True / sleep cycle?","commit_id":"39a226497540a27e7345d55ed64db87be54f4a05"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ecc3d8dc77509a551a90dd8e148c7b3e3482c053","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":78,"context_line":"            return"},{"line_number":79,"context_line":"        eventlet.spawn_n(self.periodic_agent_status_check, interval)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def periodic_agent_status_check(self, interval):"},{"line_number":82,"context_line":"        \"\"\"Unschedule routers from down l3 agents.\"\"\""},{"line_number":83,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_a1c9327c","line":80,"in_reply_to":"baada198_9e7d9673","updated":"2014-08-07 07:35:02.000000000","message":"I think looping call works a little better here.","commit_id":"39a226497540a27e7345d55ed64db87be54f4a05"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"ab645d64bb01dd5117b8cadb4b327b01e98b1f1a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":88,"context_line":"                for binding in bindings:"},{"line_number":89,"context_line":"                    if not binding.l3_agent.is_active:"},{"line_number":90,"context_line":"                        try:"},{"line_number":91,"context_line":"                            self.remove_router_from_l3_agent("},{"line_number":92,"context_line":"                                context, binding.l3_agent_id,"},{"line_number":93,"context_line":"                                binding.router_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_bee97a1b","line":90,"updated":"2014-08-06 06:48:37.000000000","message":"Have you considered explicitly scheduling the router after you\u0027ve unscheduled it, instead of relying on auto_schedule_routers? Are there advantages or disadvantages?","commit_id":"39a226497540a27e7345d55ed64db87be54f4a05"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"07cd783d31613dbad721a58033f886b5139becd5","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":88,"context_line":"                for binding in bindings:"},{"line_number":89,"context_line":"                    if not binding.l3_agent.is_active:"},{"line_number":90,"context_line":"                        try:"},{"line_number":91,"context_line":"                            self.remove_router_from_l3_agent("},{"line_number":92,"context_line":"                                context, binding.l3_agent_id,"},{"line_number":93,"context_line":"                                binding.router_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_03383f9e","line":90,"in_reply_to":"baada198_bee97a1b","updated":"2014-08-06 15:02:09.000000000","message":"+1 to call scheduling explicitly: L3Scheduler class is extensible and configurable from neutron.conf (although current core ChanceScheduler and LeastRoutersScheduler options are quite naive). Using auto_schedule_routers, the router will be assigned to the first L3 that claims for synchronisation.\n\nI think the first use case is closer to the admin\u0027s expected behaviour.","commit_id":"39a226497540a27e7345d55ed64db87be54f4a05"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ecc3d8dc77509a551a90dd8e148c7b3e3482c053","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":88,"context_line":"                for binding in bindings:"},{"line_number":89,"context_line":"                    if not binding.l3_agent.is_active:"},{"line_number":90,"context_line":"                        try:"},{"line_number":91,"context_line":"                            self.remove_router_from_l3_agent("},{"line_number":92,"context_line":"                                context, binding.l3_agent_id,"},{"line_number":93,"context_line":"                                binding.router_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_2646187f","line":90,"in_reply_to":"baada198_bee97a1b","updated":"2014-08-07 07:35:02.000000000","message":"Advantage is this code stays simpler. Disadvantage is that we have to wait for the autoscheduling.","commit_id":"39a226497540a27e7345d55ed64db87be54f4a05"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"59eda391a59a9d17580a681c0f154ce07c1dbaec","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":73,"context_line":"        interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"},{"line_number":74,"context_line":"        if not cfg.CONF.router_auto_reschedule_from_dead_agents:"},{"line_number":75,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":76,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":77,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_2bc7b112","line":74,"updated":"2014-08-07 16:16:24.000000000","message":"Should this check be moved into the caller, then this can be an affirmative message:\n\n\"Starting periodic L3 agent status check monitor\"\n\nAt a minimum I think you should log when it\u0027s enabled, especially since the default is False.","commit_id":"7ac76eea37e746718683ebb9b317550bb6943c58"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"206413ad3071270827f2c011b9665fc2a59c75bf","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                       initial_delay\u003dinterval)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def unschedule_routers_from_down_agents(self):"},{"line_number":86,"context_line":"        \"\"\"Unschedule routers from down l3 agents.\"\"\""},{"line_number":87,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":88,"context_line":"        bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":89,"context_line":"        for binding in bindings:"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_2cb6f9fc","line":86,"updated":"2014-08-07 08:15:18.000000000","message":"method name and docstring seem a little different from what it does now (reschedule).","commit_id":"7ac76eea37e746718683ebb9b317550bb6943c58"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"59eda391a59a9d17580a681c0f154ce07c1dbaec","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                       initial_delay\u003dinterval)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def unschedule_routers_from_down_agents(self):"},{"line_number":86,"context_line":"        \"\"\"Unschedule routers from down l3 agents.\"\"\""},{"line_number":87,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":88,"context_line":"        bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":89,"context_line":"        for binding in bindings:"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_2b95f1e2","line":86,"in_reply_to":"baada198_2cb6f9fc","updated":"2014-08-07 16:16:24.000000000","message":"I would agree that just making this reschedule_routers() would be a better name.","commit_id":"7ac76eea37e746718683ebb9b317550bb6943c58"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"59eda391a59a9d17580a681c0f154ce07c1dbaec","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                except db_exc.DBError as dbex:"},{"line_number":94,"context_line":"                    LOG.debug("},{"line_number":95,"context_line":"                        \"Ignored DB error likely caused by concurrent \""},{"line_number":96,"context_line":"                        \"access from multiple servers. %s\", dbex)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def add_router_to_l3_agent(self, context, agent_id, router_id):"},{"line_number":99,"context_line":"        \"\"\"Add a l3 agent to host a router.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_9647001e","line":96,"updated":"2014-08-07 16:16:24.000000000","message":"The word \"likely\" makes me think there are other reasons we can get here.  If there is are there any steps we can take to fix things?  Or maybe this should be more than a debug message?  I\u0027m saying this because if a reschedule fails and a router gets stuck somewhere we\u0027ll need to take manual steps to fix it.","commit_id":"7ac76eea37e746718683ebb9b317550bb6943c58"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f81ddc5872253735b16e8dc6bed054d6c801de42","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    router_scheduler \u003d None"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":73,"context_line":"        interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"},{"line_number":74,"context_line":"        if not cfg.CONF.router_auto_reschedule_from_dead_agents:"},{"line_number":75,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":76,"context_line":"                       \"automatic router rescheduling is disabled.\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_c8b2a9e7","line":73,"updated":"2014-08-08 01:42:00.000000000","message":"this can go closer to where it\u0027s used. That said, how did you come to this value? I wonder if a longer timeout would be more appropriate.","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"df0b8c6d8de51e4323abe2850b37eca0bd2c4dc5","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    router_scheduler \u003d None"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":73,"context_line":"        interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"},{"line_number":74,"context_line":"        if not cfg.CONF.router_auto_reschedule_from_dead_agents:"},{"line_number":75,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":76,"context_line":"                       \"automatic router rescheduling is disabled.\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_a1fc8f40","line":73,"in_reply_to":"baada198_c8b2a9e7","updated":"2014-08-08 20:08:44.000000000","message":"I just tried to pick something that will catch down agents in a reasonable time frame. Why do you want a higher timeout? Do you think it\u0027s too expensive to walk through the DB records?","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":11825,"name":"Sudhakar Babu Gariganti","email":"sudhakar.gariganti@gmail.com","username":"sudhakar-gariganti"},"change_message_id":"4365af8c1811b87a51e81962b164f530145282e2","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":73,"context_line":"        interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"},{"line_number":74,"context_line":"        if not cfg.CONF.router_auto_reschedule_from_dead_agents:"},{"line_number":75,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":76,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":77,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_2067a025","line":74,"updated":"2014-08-08 18:03:53.000000000","message":"Agree with Brian\u0027s comment on this line.\nWe can do this check in l3_router_plugin itself.\ni feel \"check and call\" is better than \"call and check\"","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"df0b8c6d8de51e4323abe2850b37eca0bd2c4dc5","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":73,"context_line":"        interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"},{"line_number":74,"context_line":"        if not cfg.CONF.router_auto_reschedule_from_dead_agents:"},{"line_number":75,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":76,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":77,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_613a77e7","line":74,"in_reply_to":"baada198_2067a025","updated":"2014-08-08 20:08:44.000000000","message":"I don\u0027t like the idea of leaving it up to the plugin to honor the configuration setting. If you look through a core plugin like ML2, it never checks configuration before calling.","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":11825,"name":"Sudhakar Babu Gariganti","email":"sudhakar.gariganti@gmail.com","username":"sudhakar-gariganti"},"change_message_id":"4365af8c1811b87a51e81962b164f530145282e2","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            self.reschedule_routers_from_down_agents)"},{"line_number":80,"context_line":"        # add initial delay for agents to check in after the neutron server"},{"line_number":81,"context_line":"        # first starts"},{"line_number":82,"context_line":"        self.periodic_agent_loop.start(interval\u003dinterval,"},{"line_number":83,"context_line":"                                       initial_delay\u003dinterval)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def reschedule_routers_from_down_agents(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_c3b42e1f","line":82,"updated":"2014-08-08 18:03:53.000000000","message":"When there are multiple neutron servers in the environment (for ex: Triple-O based overCloud), each server will start its own thread to check for inactive agents, and it can lead to multiple reschedule\u0027s for the same router as there is no sync between each of the servers","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"df0b8c6d8de51e4323abe2850b37eca0bd2c4dc5","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            self.reschedule_routers_from_down_agents)"},{"line_number":80,"context_line":"        # add initial delay for agents to check in after the neutron server"},{"line_number":81,"context_line":"        # first starts"},{"line_number":82,"context_line":"        self.periodic_agent_loop.start(interval\u003dinterval,"},{"line_number":83,"context_line":"                                       initial_delay\u003dinterval)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def reschedule_routers_from_down_agents(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_044b895f","line":82,"in_reply_to":"baada198_c3b42e1f","updated":"2014-08-08 20:08:44.000000000","message":"If they both try at the same time, one will fail at the _unbind_router call so it should be okay.","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f81ddc5872253735b16e8dc6bed054d6c801de42","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":86,"context_line":"        \"\"\"Reschedule routers from down l3 agents.\"\"\""},{"line_number":87,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":88,"context_line":"        bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":89,"context_line":"        for binding in bindings:"},{"line_number":90,"context_line":"            if not binding.l3_agent.is_active:"},{"line_number":91,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_88eef1b3","line":88,"updated":"2014-08-08 01:42:00.000000000","message":"wouldn\u0027t we want to filter only for the agents that are enabled? I appreciate that the router is not going to be scheduled on agents that have admin_status down, but we can save a few needless DB roundtrips and iterations","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":11825,"name":"Sudhakar Babu Gariganti","email":"sudhakar.gariganti@gmail.com","username":"sudhakar-gariganti"},"change_message_id":"4365af8c1811b87a51e81962b164f530145282e2","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":86,"context_line":"        \"\"\"Reschedule routers from down l3 agents.\"\"\""},{"line_number":87,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":88,"context_line":"        bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":89,"context_line":"        for binding in bindings:"},{"line_number":90,"context_line":"            if not binding.l3_agent.is_active:"},{"line_number":91,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_a3de5ad9","line":88,"in_reply_to":"baada198_88eef1b3","updated":"2014-08-08 18:03:53.000000000","message":"+1. We need not check for all the bindings. Its better we first find the agent(s) which are down and then try to reschedule just those routers. \nImagine the scenario when all the agents are perfectly running fine. We are just iterating through bindings and checking each of binding, where actually we are not required to do anything.","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"c8f52214e519cf93a8e02e93e5492127c7b15646","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":86,"context_line":"        \"\"\"Reschedule routers from down l3 agents.\"\"\""},{"line_number":87,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":88,"context_line":"        bindings \u003d context.session.query(RouterL3AgentBinding).all()"},{"line_number":89,"context_line":"        for binding in bindings:"},{"line_number":90,"context_line":"            if not binding.l3_agent.is_active:"},{"line_number":91,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_84231905","line":88,"in_reply_to":"baada198_88eef1b3","updated":"2014-08-08 20:17:22.000000000","message":"Is there code that already automatically reschedules a routers with admin_state_down?","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f81ddc5872253735b16e8dc6bed054d6c801de42","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            if not binding.l3_agent.is_active:"},{"line_number":91,"context_line":"                try:"},{"line_number":92,"context_line":"                    self.reschedule_router(context, binding.router_id)"},{"line_number":93,"context_line":"                except db_exc.DBError as dbex:"},{"line_number":94,"context_line":"                    LOG.debug("},{"line_number":95,"context_line":"                        \"Ignored DB error likely caused by concurrent \""},{"line_number":96,"context_line":"                        \"access from multiple servers. %s\", dbex)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_88c0b12c","line":93,"updated":"2014-08-08 01:42:00.000000000","message":"this error is worrying. Are we sure we\u0027re not gonna end up in a bad state?","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"df0b8c6d8de51e4323abe2850b37eca0bd2c4dc5","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            if not binding.l3_agent.is_active:"},{"line_number":91,"context_line":"                try:"},{"line_number":92,"context_line":"                    self.reschedule_router(context, binding.router_id)"},{"line_number":93,"context_line":"                except db_exc.DBError as dbex:"},{"line_number":94,"context_line":"                    LOG.debug("},{"line_number":95,"context_line":"                        \"Ignored DB error likely caused by concurrent \""},{"line_number":96,"context_line":"                        \"access from multiple servers. %s\", dbex)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_0499c9cf","line":93,"in_reply_to":"baada198_88c0b12c","updated":"2014-08-08 20:08:44.000000000","message":"If we can end up in a bad state, does that not imply that reschedule_router is broken already? I will however just remove the catch since the loopingcall will still continue if an exception is emitted.","commit_id":"bad2aa51909424c2b0ab268b3eca5a21c1c994b7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"792b4f1e1139cca72fe2d8a0dfb571122b9790ad","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":87,"context_line":"        \"\"\"Reschedule routers from down l3 agents if admin state is up.\"\"\""},{"line_number":88,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":89,"context_line":"        tdelta \u003d timeutils.utcnow() - datetime.timedelta("},{"line_number":90,"context_line":"            seconds\u003dcfg.CONF.agent_down_time)"},{"line_number":91,"context_line":"        down_bindings \u003d ("},{"line_number":92,"context_line":"            context.session.query(RouterL3AgentBinding)."}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_0d2565be","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":14},"updated":"2014-08-09 07:49:39.000000000","message":"the name \"tdelta\" seems weird for a variable holding an absolute time.","commit_id":"5f22a9a73e464ede4a4272067566dfd23e849aa9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b9ea200a8b7432c8afa5eb645ee48674c1cf5c74","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":87,"context_line":"        \"\"\"Reschedule routers from down l3 agents if admin state is up.\"\"\""},{"line_number":88,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":89,"context_line":"        tdelta \u003d timeutils.utcnow() - datetime.timedelta("},{"line_number":90,"context_line":"            seconds\u003dcfg.CONF.agent_down_time)"},{"line_number":91,"context_line":"        down_bindings \u003d ("},{"line_number":92,"context_line":"            context.session.query(RouterL3AgentBinding)."}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_59be31cf","line":89,"in_reply_to":"baada198_0d2565be","updated":"2014-08-11 00:15:43.000000000","message":"Yes, this is definitely worth blocking the patch over. :-)","commit_id":"5f22a9a73e464ede4a4272067566dfd23e849aa9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4ffcc6b25aff8a8d488c55e3ac3e393af80964db","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    router_scheduler \u003d None"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":74,"context_line":"        interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"},{"line_number":75,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":76,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":77,"context_line":"                       \"automatic router rescheduling is disabled.\"))"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_004b075a","line":74,"updated":"2014-08-14 01:55:47.000000000","message":"sorry for not getting back to you on this point. My fear is that this polling will trigger false positives. I haven\u0027t looked about this too closely and I am planning to, but usually an alpha-count algorithm is better to detect persistent failures [1].\n\nThe logic behind an alpha count algorithm is that instead of using one threshold to detect the failure (as you did below), you have two thresholds: if you got failures within the range \u003d\u003e you tolerate; when you go below the threshold, the transient failure disappeared \u003d\u003e all is good and back to normal; if you go above the second threshold \u003d\u003e it means that the transient failures have become a persistent one \u003d\u003e fail and reschedule.\n\nFor instance, even when the clocks are in sync via NTP, something bad may happen, the agent might just miss one report interval, and we end up rescheduling the routers, needlessly. In my opinion, it is more sensible to tolerate a transient failures (in the agent reporting back).\n\n[1] - http://citeseerx.ist.psu.edu/viewdoc/summary?doi\u003d10.1.1.1.4869","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7e696a74aa24af16ec70d53fabd8f7e679ec2a0d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    router_scheduler \u003d None"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":74,"context_line":"        interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"},{"line_number":75,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":76,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":77,"context_line":"                       \"automatic router rescheduling is disabled.\"))"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_428fbf23","line":74,"in_reply_to":"7ac7a964_004b075a","updated":"2014-08-14 07:11:31.000000000","message":"Is this not already handled by setting the agent report interval time set to \u003c half of the agent_down_time?\n\nAlso, keep in mind that this isn\u0027t the threshold for how it considers if an agent is down. This is just how often it runs the periodic check, so regardless of what I set it to, it may still catch an agent that is just above the threshold.","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"394dcf5cc32b64e76c40833beb6e0c7582d515e7","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    router_scheduler \u003d None"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":74,"context_line":"        interval \u003d max(cfg.CONF.agent_down_time / 2, 1)"},{"line_number":75,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":76,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":77,"context_line":"                       \"automatic router rescheduling is disabled.\"))"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_e3bfdcce","line":74,"in_reply_to":"7ac7a964_428fbf23","updated":"2014-08-14 14:11:41.000000000","message":"Agreed, I just think that a period that is greater than the agent_down_time may actually allow for more slack.","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"23022e84ae8370998710b4a844428fd39e29c028","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":76,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":77,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":78,"context_line":"            return"},{"line_number":79,"context_line":"        self.periodic_agent_loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":80,"context_line":"            self.reschedule_routers_from_down_agents)"},{"line_number":81,"context_line":"        # add initial delay to allow agents to check in after the neutron"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_cbf5b5cc","line":78,"updated":"2014-08-14 00:38:25.000000000","message":"nit if new patchset: _LI()","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7e696a74aa24af16ec70d53fabd8f7e679ec2a0d","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":76,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":77,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":78,"context_line":"            return"},{"line_number":79,"context_line":"        self.periodic_agent_loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":80,"context_line":"            self.reschedule_routers_from_down_agents)"},{"line_number":81,"context_line":"        # add initial delay to allow agents to check in after the neutron"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_42609f35","line":78,"in_reply_to":"7ac7a964_cbf5b5cc","updated":"2014-08-14 07:11:31.000000000","message":"Interesting. I haven\u0027t seen this before. Does this help the translators determine priority?\n\nI can\u0027t fix it in this patch though because pep8 will fail. I will make another patch to add these to the flake8 builtins so they can be used in Neutron.","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4ffcc6b25aff8a8d488c55e3ac3e393af80964db","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":87,"context_line":"        \"\"\"Reschedule routers from down l3 agents if admin state is up.\"\"\""},{"line_number":88,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":89,"context_line":"        cutoff \u003d timeutils.utcnow() - datetime.timedelta("},{"line_number":90,"context_line":"            seconds\u003dcfg.CONF.agent_down_time)"},{"line_number":91,"context_line":"        down_bindings \u003d ("},{"line_number":92,"context_line":"            context.session.query(RouterL3AgentBinding)."}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_20ee43ed","line":89,"updated":"2014-08-14 01:55:47.000000000","message":"I wonder what happens during a leap second or clock adjustments in general ;)","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7e696a74aa24af16ec70d53fabd8f7e679ec2a0d","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":87,"context_line":"        \"\"\"Reschedule routers from down l3 agents if admin state is up.\"\"\""},{"line_number":88,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":89,"context_line":"        cutoff \u003d timeutils.utcnow() - datetime.timedelta("},{"line_number":90,"context_line":"            seconds\u003dcfg.CONF.agent_down_time)"},{"line_number":91,"context_line":"        down_bindings \u003d ("},{"line_number":92,"context_line":"            context.session.query(RouterL3AgentBinding)."}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_243490dd","line":89,"in_reply_to":"7ac7a964_20ee43ed","updated":"2014-08-14 07:11:31.000000000","message":"Slow and steady wins the race ala the ntp daemon. An abrupt time change forward comes with violent router rescheduling. :-)\n\nI suppose in the loop I could record the time, check it on the next iteration to verify that the current time doesn\u0027t exceed the last timestamp by (the interval + a few seconds for processing) and, if it does, sleep for agent_down_time to give the agents a chance to report in. \n\nIf you want to see that kind of protection, I will be happy to implement it!","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"394dcf5cc32b64e76c40833beb6e0c7582d515e7","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":87,"context_line":"        \"\"\"Reschedule routers from down l3 agents if admin state is up.\"\"\""},{"line_number":88,"context_line":"        context \u003d n_ctx.get_admin_context()"},{"line_number":89,"context_line":"        cutoff \u003d timeutils.utcnow() - datetime.timedelta("},{"line_number":90,"context_line":"            seconds\u003dcfg.CONF.agent_down_time)"},{"line_number":91,"context_line":"        down_bindings \u003d ("},{"line_number":92,"context_line":"            context.session.query(RouterL3AgentBinding)."}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_a39c046b","line":89,"in_reply_to":"7ac7a964_243490dd","updated":"2014-08-14 14:11:41.000000000","message":"well, automatic rescheduling is a sensitive area, and we\u0027d want to be sure we reschedule only when it\u0027s absolutely necessary, in the best of the abilities of this patch :)","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4ffcc6b25aff8a8d488c55e3ac3e393af80964db","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            context.session.query(RouterL3AgentBinding)."},{"line_number":93,"context_line":"            filter(agents_db.Agent.heartbeat_timestamp \u003c cutoff,"},{"line_number":94,"context_line":"                   agents_db.Agent.admin_state_up))"},{"line_number":95,"context_line":"        for binding in down_bindings:"},{"line_number":96,"context_line":"            self.reschedule_router(context, binding.router_id)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def add_router_to_l3_agent(self, context, agent_id, router_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_20c5635b","line":95,"updated":"2014-08-14 01:55:47.000000000","message":"should we LOG that we are rescheduling stuff because of a failure being detected? Alert at WARN level or something?","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7e696a74aa24af16ec70d53fabd8f7e679ec2a0d","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            context.session.query(RouterL3AgentBinding)."},{"line_number":93,"context_line":"            filter(agents_db.Agent.heartbeat_timestamp \u003c cutoff,"},{"line_number":94,"context_line":"                   agents_db.Agent.admin_state_up))"},{"line_number":95,"context_line":"        for binding in down_bindings:"},{"line_number":96,"context_line":"            self.reschedule_router(context, binding.router_id)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def add_router_to_l3_agent(self, context, agent_id, router_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_8479e495","line":95,"in_reply_to":"7ac7a964_20c5635b","updated":"2014-08-14 07:11:31.000000000","message":"yes","commit_id":"f9e77db82ee766ee02d21731c44966710f82c748"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"48350aa1cb2f479b694981c220e928e95362ccd6","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # add initial delay to allow agents to check in after the neutron"},{"line_number":82,"context_line":"        # server first starts"},{"line_number":83,"context_line":"        self.periodic_agent_loop.start(interval\u003dinterval,"},{"line_number":84,"context_line":"                                       initial_delay\u003dinterval)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":87,"context_line":"        \"\"\"Reschedule routers from down l3 agents if admin state is up.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"7ac7a964_8949e9d2","line":84,"updated":"2014-08-14 15:05:16.000000000","message":"this should be random, IMO","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"11f4f0cf5f4a4119419c0356254f3f929ca1451c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # add initial delay to allow agents to check in after the neutron"},{"line_number":82,"context_line":"        # server first starts"},{"line_number":83,"context_line":"        self.periodic_agent_loop.start(interval\u003dinterval,"},{"line_number":84,"context_line":"                                       initial_delay\u003dinterval)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def reschedule_routers_from_down_agents(self):"},{"line_number":87,"context_line":"        \"\"\"Reschedule routers from down l3 agents if admin state is up.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"7ac7a964_ba526211","line":84,"in_reply_to":"7ac7a964_8949e9d2","updated":"2014-08-14 17:21:29.000000000","message":"Done","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"0493d2b69e5f2cc6474cdf79511d7700112f9731","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                   agents_db.Agent.admin_state_up))"},{"line_number":95,"context_line":"        for binding in down_bindings:"},{"line_number":96,"context_line":"            LOG.warn(_(\"Rescheduling router %(router)s from agent %(agent)s \""},{"line_number":97,"context_line":"                       \"because the agent has died.\"),"},{"line_number":98,"context_line":"                     {\u0027router\u0027: binding.router_id,"},{"line_number":99,"context_line":"                      \u0027agent\u0027: binding.l3_agent_id})"},{"line_number":100,"context_line":"            self.reschedule_router(context, binding.router_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7ac7a964_2388f41e","line":97,"updated":"2014-08-14 14:11:50.000000000","message":"nit: didn\u0027t report, or no heartbeat?","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"11f4f0cf5f4a4119419c0356254f3f929ca1451c","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                   agents_db.Agent.admin_state_up))"},{"line_number":95,"context_line":"        for binding in down_bindings:"},{"line_number":96,"context_line":"            LOG.warn(_(\"Rescheduling router %(router)s from agent %(agent)s \""},{"line_number":97,"context_line":"                       \"because the agent has died.\"),"},{"line_number":98,"context_line":"                     {\u0027router\u0027: binding.router_id,"},{"line_number":99,"context_line":"                      \u0027agent\u0027: binding.l3_agent_id})"},{"line_number":100,"context_line":"            self.reschedule_router(context, binding.router_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7ac7a964_5ab94e2d","line":97,"in_reply_to":"7ac7a964_2388f41e","updated":"2014-08-14 17:21:29.000000000","message":"Done","commit_id":"133c27d5961461498badfb8e6a0fe640c26c448a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"98b3964aa97b80eb6d066aa9401cda61b586cf33","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":76,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":77,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":78,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":79,"context_line":"            return"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_9571d0e2","line":77,"updated":"2014-08-15 15:19:25.000000000","message":"please use the logging hint _LI","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"f57bf0f56a8d8b914cdd1b166adace5ebfe020a0","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":76,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":77,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":78,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":79,"context_line":"            return"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_479ce3c0","line":77,"in_reply_to":"7ac7a964_2c542e20","updated":"2014-08-15 18:51:58.000000000","message":"It\u0027s used in several places:\nfrom neutron.openstack.common.gettextutils import _LE","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b9a5d25399ad8c81d687b9a0693587c719cbe311","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":76,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":77,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":78,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":79,"context_line":"            return"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_bd4b0a2a","line":77,"in_reply_to":"7ac7a964_479ce3c0","updated":"2014-08-15 19:50:58.000000000","message":"I really wish these new requirements were more clearly communicated to the community so these types of things didn\u0027t have to block up reviews. :-(\n\nI really think the transition to _LW, etc should be handled by a single effort to get rid of the monkey patch, add the imports, and change the LOG levels. But alas, my opinion doesn\u0027t matter so I will update this patch to move it forward.","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"4d9611e3c440ab16c8b4a04f55857a308f49d817","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":76,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":77,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":78,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":79,"context_line":"            return"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_2c542e20","line":77,"in_reply_to":"7ac7a964_9571d0e2","updated":"2014-08-15 18:48:53.000000000","message":"These will not work in neutron. We only monkey patch in the _ right now","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"445d41f20654d58583aeef8f28b1d15001b93964","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def start_periodic_agent_status_check(self):"},{"line_number":76,"context_line":"        if not cfg.CONF.allow_automatic_l3agent_failover:"},{"line_number":77,"context_line":"            LOG.info(_(\"Skipping period L3 agent status check because \""},{"line_number":78,"context_line":"                       \"automatic router rescheduling is disabled.\"))"},{"line_number":79,"context_line":"            return"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_5d93d64e","line":77,"in_reply_to":"7ac7a964_bd4b0a2a","updated":"2014-08-15 19:58:14.000000000","message":"FWIW, I agree.  It\u0027s annoying to deal with these before the hacking rule is in place.","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"98b3964aa97b80eb6d066aa9401cda61b586cf33","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        tdelta \u003d timeutils.utcnow() - getattr(self, \u0027_clock_jump_canary\u0027,"},{"line_number":98,"context_line":"                                              timeutils.utcnow())"},{"line_number":99,"context_line":"        if timeutils.total_seconds(tdelta) \u003e cfg.CONF.agent_down_time:"},{"line_number":100,"context_line":"            LOG.warn(_(\"Time since last L3 agent reschedule check has \""},{"line_number":101,"context_line":"                       \"exceeded the interval between checks. Waiting before \""},{"line_number":102,"context_line":"                       \"check to allow agents to send a heartbeat in case \""},{"line_number":103,"context_line":"                       \"there was a clock adjustment.\"))"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_554e5897","line":100,"updated":"2014-08-15 15:19:25.000000000","message":"please use _LW","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"98b3964aa97b80eb6d066aa9401cda61b586cf33","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            filter(agents_db.Agent.heartbeat_timestamp \u003c cutoff,"},{"line_number":113,"context_line":"                   agents_db.Agent.admin_state_up))"},{"line_number":114,"context_line":"        for binding in down_bindings:"},{"line_number":115,"context_line":"            LOG.warn(_(\"Rescheduling router %(router)s from agent %(agent)s \""},{"line_number":116,"context_line":"                       \"because the agent did not report to the server in the \""},{"line_number":117,"context_line":"                       \"last %(dead_time)s seconds.\"),"},{"line_number":118,"context_line":"                     {\u0027router\u0027: binding.router_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_b55ecc43","line":115,"updated":"2014-08-15 15:19:25.000000000","message":"ditto","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"}],"neutron/tests/unit/openvswitch/test_agent_scheduler.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3e24ea00adacf829254051ed8780a9eaf9805453","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import contextlib"},{"line_number":17,"context_line":"import copy"},{"line_number":18,"context_line":"import datetime"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":13,"id":"7ac7a964_6395733f","line":18,"updated":"2014-08-15 01:18:58.000000000","message":"I promise: one last nit :)\n\nShould these tests be under ML2? OVS is going away!","commit_id":"d5ca29aa16c771244c63338b73bf0ef6b2f60a50"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"8001bbb64b07a5df89bf2258b169e77a277f2dae","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import contextlib"},{"line_number":17,"context_line":"import copy"},{"line_number":18,"context_line":"import datetime"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":13,"id":"7ac7a964_b258b033","line":18,"in_reply_to":"7ac7a964_6395733f","updated":"2014-08-15 07:40:29.000000000","message":"I take it you want me to move it...","commit_id":"d5ca29aa16c771244c63338b73bf0ef6b2f60a50"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5481c40d7efaad33c50078c1b8e83667c23950a2","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import contextlib"},{"line_number":17,"context_line":"import copy"},{"line_number":18,"context_line":"import datetime"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":13,"id":"7ac7a964_921c9479","line":18,"in_reply_to":"7ac7a964_b258b033","updated":"2014-08-15 08:00:36.000000000","message":"Actually I have no idea what you want me to change. A refactor to move all of the test cases to the ML2 directory seems to invasive for this patch. I guess you meant just to move the new test cases, but that looks kinda wonky being the only set of custom ML2 tests. You\u0027ll have to clarify.","commit_id":"d5ca29aa16c771244c63338b73bf0ef6b2f60a50"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6c9e10734711d07ec77adf6f1658a0e59febe436","unresolved":false,"context_lines":[{"line_number":622,"context_line":"            self.assertEqual(port_list[\u0027ports\u0027][0][\u0027device_id\u0027],"},{"line_number":623,"context_line":"                             constants.DEVICE_ID_RESERVED_DHCP_PORT)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    def _take_down_agent_and_run_reschedule(self, host):"},{"line_number":626,"context_line":"        # take down the agent on host A and ensure B is alive"},{"line_number":627,"context_line":"        self.adminContext.session.begin(subtransactions\u003dTrue)"},{"line_number":628,"context_line":"        query \u003d self.adminContext.session.query(agents_db.Agent)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_329652f1","line":625,"updated":"2014-08-15 14:59:50.000000000","message":"I was suggesting to have these new test cases elsewhere. My fear is that when the OVS plugin gets removed, these tests will erroneously go with it.","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"586c7ccb398d81b704e7bc2854c7ae4eb5824976","unresolved":false,"context_lines":[{"line_number":622,"context_line":"            self.assertEqual(port_list[\u0027ports\u0027][0][\u0027device_id\u0027],"},{"line_number":623,"context_line":"                             constants.DEVICE_ID_RESERVED_DHCP_PORT)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    def _take_down_agent_and_run_reschedule(self, host):"},{"line_number":626,"context_line":"        # take down the agent on host A and ensure B is alive"},{"line_number":627,"context_line":"        self.adminContext.session.begin(subtransactions\u003dTrue)"},{"line_number":628,"context_line":"        query \u003d self.adminContext.session.query(agents_db.Agent)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_787d006e","line":625,"in_reply_to":"7ac7a964_2719a779","updated":"2014-08-15 20:19:50.000000000","message":"fair enough.","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"4d9611e3c440ab16c8b4a04f55857a308f49d817","unresolved":false,"context_lines":[{"line_number":622,"context_line":"            self.assertEqual(port_list[\u0027ports\u0027][0][\u0027device_id\u0027],"},{"line_number":623,"context_line":"                             constants.DEVICE_ID_RESERVED_DHCP_PORT)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    def _take_down_agent_and_run_reschedule(self, host):"},{"line_number":626,"context_line":"        # take down the agent on host A and ensure B is alive"},{"line_number":627,"context_line":"        self.adminContext.session.begin(subtransactions\u003dTrue)"},{"line_number":628,"context_line":"        query \u003d self.adminContext.session.query(agents_db.Agent)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_2719a779","line":625,"in_reply_to":"7ac7a964_329652f1","updated":"2014-08-15 18:48:53.000000000","message":"The ML2 cases inherit from these. They can\u0027t go away without breaking the ML2 test_agent_scheduler cases.","commit_id":"b0d12192b38ba93fac9f91fd5625ecb0d8257b96"}]}
