<div dir="ltr">Hi guys, <div><br></div><div>It's not a big secret that working on "races" especially in OpenStack gates is quite complicated task. </div><div><br></div><div>Current workflow: </div><div>1) Some tempest test run fails  </div><div>2) Build rules for  elastic-recheck & report bug</div><div>3) Recheck specific bug XXX</div><div>4) Collect stats </div><div>5) Attempt to fix BUG, believe that it fixes bug and MERGE IT!</div><div>6) Montior stats: <a href="http://status.openstack.org/elastic-recheck/">http://status.openstack.org/elastic-recheck/</a></div><div>7) Repeat 5-6 until bug is fixed</div><div><br></div><div><br></div><div>With Rally we can improve this workflow. </div><div><div><br></div><div>As you probably know, in many projects we are running rally-job.</div><div>Usually it's called "gate-rally-dsvm-<something>"</div></div><div><br></div><div>This job does simple thing:</div><div>1) Run dsvm job that installs OpenStack + Rally </div><div>2) Run Rally Task (set of benchmarks) against this Cloud</div><div>3) Create a pretty page with results:</div><div><a href="http://logs.openstack.org/71/137671/1/check/gate-rally-dsvm-rally/6dc39b6/">http://logs.openstack.org/71/137671/1/check/gate-rally-dsvm-rally/6dc39b6/</a><br></div><div>4) Put +1/-1 vote depending on criteria of success (sla) of benchmarks specified in task</div><div><br></div><div><br></div><div>This job is very precise and flexible opposite to tempest job that just run predefined in tempest and infra set of functional tests. </div><div><br></div><div>You have a plugins dir: </div><div>1) <a href="https://github.com/openstack/cinder/tree/master/rally-jobs/plugins">https://github.com/openstack/cinder/tree/master/rally-jobs/plugins</a></div><div>where you can put plugins. In Rally almost everything is pluggable:  success criteria, load generators, benchmark scenarios and context,...</div><div>2) You have task file with specification of what benchmark to run: </div><div><a href="https://github.com/openstack/cinder/blob/master/rally-jobs/cinder.yaml">https://github.com/openstack/cinder/blob/master/rally-jobs/cinder.yaml</a><br></div><div>That allows you to specify what benchmarks to run in gates. </div><div> </div><div><br></div><div>New workflow for fixing races with Rally: </div><div>1) Create or use existing benchmark that test code that will reproduce raices close to 100%.</div><div>2) Push patch to review. And ensure that rally job fails</div><div>3) Push fix + in depending patch changes in rally task file that reproduce bug</div><div>4) If bug is not reproduced merge first patch and abandon change with rally task changes. </div><div>5) PROFIT!</div><div><br></div><div><br></div><div>As a demo I made changes in rally task that reproduces cinder high priority bug (volumes are not attached):</div><div><a href="https://bugs.launchpad.net/nova/+bug/1240728">https://bugs.launchpad.net/nova/+bug/1240728</a></div><div> </div><div><br></div><div>So here is the patch: </div><div>1) <a href="https://review.openstack.org/#/c/137885/">https://review.openstack.org/#/c/137885/</a></div><div>2) We are specifying in rally task to run 11 times benchmark, that simultaneously do 4 scenarios: create server, create volume, attach to server volume, detach volume, delete server.</div><div>3) We can see that Rally job return -1. After that we can click on it's url  and see this page: </div><div><a href="http://logs.openstack.org/85/137885/2/check/gate-rally-dsvm-cinder/7790157/">http://logs.openstack.org/85/137885/2/check/gate-rally-dsvm-cinder/7790157/</a><br></div><div><br></div><div>4) There are 2 interesting links on it: </div><div>A) HTML reprot. That shows actually what benchmark failed:</div><div><a href="http://logs.openstack.org/85/137885/2/check/gate-rally-dsvm-cinder/7790157/rally-plot/results.html.gz">http://logs.openstack.org/85/137885/2/check/gate-rally-dsvm-cinder/7790157/rally-plot/results.html.gz</a><br></div><div>B) DSVM logs (Logs of all services):</div><div><a href="http://logs.openstack.org/85/137885/2/check/gate-rally-dsvm-cinder/7790157/logs/">http://logs.openstack.org/85/137885/2/check/gate-rally-dsvm-cinder/7790157/logs/</a> </div><div>And here you can find cinder logs and actually exception that occurs: </div><div>screen-c-vol.txt.gz -></div><div><a href="http://logs.openstack.org/85/137885/2/check/gate-rally-dsvm-cinder/7790157/logs/screen-c-vol.txt.gz?level=ERROR">http://logs.openstack.org/85/137885/2/check/gate-rally-dsvm-cinder/7790157/logs/screen-c-vol.txt.gz?level=ERROR</a><br></div><div><br></div><div><br></div><div>So now we can repeat race condition in gates with close to 100% likelihood in other words we are able to test that fix really fix this issue. </div><div><br></div><div><br></div><div>Happy bug fixing!=)</div><div><br></div><div>Best regards,</div><div>Boris Pavlovic </div><div><br></div></div>