<div dir="ltr"><div style="font-family:arial,sans-serif;font-size:14px">Recently we encountered some ovs-agent crash issues.  [1][2][3]</div><div style="font-family:arial,sans-serif;font-size:14px"> </div><div style="font-family:arial,sans-serif;font-size:14px">
<b>[Root cause]</b></div><div style="font-family:arial,sans-serif;font-size:14px">1. Currently only a 'restarted' flag is used in rpc_loop() to identify ovs status.  </div><div style="font-family:arial,sans-serif;font-size:14px">
<i><font face="courier new, monospace" style="background-color:rgb(255,255,255)" color="#0000ff"> ovs_restarted = self.check_ovs_restart() </font></i></div><div style="font-family:arial,sans-serif;font-size:14px"> </div><div style="font-family:arial,sans-serif;font-size:14px">
<b>True</b>: ovs is running, but a restart happened before this loop. rpc_loop() reset bridges and re-process ports.</div><div style="font-family:arial,sans-serif;font-size:14px"><b>False</b>: ovs is running since last loop, rpc_loop() continue to process in a normal way.</div>
<div style="font-family:arial,sans-serif;font-size:14px"> </div><div style="font-family:arial,sans-serif;font-size:14px">But if ovs is dead, or is not up yet during a restart, check_ovs_restart() will incorrectly returns "True". Then rpc_loop() continues to reset bridges, and apply other ovs operations, till causing exceptions/crash.  Related Bug: [1] [2]</div>
<div style="font-family:arial,sans-serif;font-size:14px"> </div><div style="font-family:arial,sans-serif;font-size:14px">2. Also, during agent boot up, ovs status is not checked at all. Agent crashes without no useful log info, when ovs is dead. Related Bug: [3]</div>
<div style="font-family:arial,sans-serif;font-size:14px"> </div><div style="font-family:arial,sans-serif;font-size:14px"><b>[Proposal]</b></div><div style="font-family:arial,sans-serif;font-size:14px">1. Add const {NORMAL, DEAD, RESTARTED} to represent ovs status.  </div>
<div style="font-family:arial,sans-serif;font-size:14px">NORMAL - ovs is running since last loop, rpc_loop() continue to process in a normal way.</div><div style="font-family:arial,sans-serif;font-size:14px">RESTARTED - ovs is running, but a restart happened before this loop. rpc_loop() reset bridges and re-process ports.</div>
<div style="font-family:arial,sans-serif;font-size:14px">DEAD - keep agent running, but rpc_loop() doesn't apply ovs operations to prevent unnecessary exceptions/crash. When ovs is up, it enters RESTARTED mode;</div><div style="font-family:arial,sans-serif;font-size:14px">
 </div><div style="font-family:arial,sans-serif;font-size:14px">2. Check ovs status during agent boot up, if it's DEAD, exit graceful since subsequent operations causes a crash, and write log to remind that ovs_dead causes agent termination.</div>
<div style="font-family:arial,sans-serif;font-size:14px"> </div><div style="font-family:arial,sans-serif;font-size:14px"><b>[Code Review]</b> <a href="https://review.openstack.org/#/c/110538/" target="_blank">https://review.openstack.org/#/c/110538/</a>   Will be appreciated if you could share some thoughts or do a quick code review. Thanks.</div>
<div style="font-family:arial,sans-serif;font-size:14px"> </div><div style="font-family:arial,sans-serif;font-size:14px">Best,</div><div style="font-family:arial,sans-serif;font-size:14px">Robin</div><div style="font-family:arial,sans-serif;font-size:14px">
 </div><div style="font-family:arial,sans-serif;font-size:14px">[1] <a href="https://bugs.launchpad.net/neutron/+bug/1296202" target="_blank">https://bugs.launchpad.net/neutron/+bug/1296202</a></div><div style="font-family:arial,sans-serif;font-size:14px">
[2] <a href="https://bugs.launchpad.net/neutron/+bug/1350179" target="_blank">https://bugs.launchpad.net/neutron/+bug/1350179</a></div><div style="font-family:arial,sans-serif;font-size:14px">[3] <a href="https://bugs.launchpad.net/neutron/+bug/1351135" target="_blank">https://bugs.launchpad.net/neutron/+bug/1351135</a></div>
</div>