)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":3217,"name":"Ian Wells","username":"ijw-ubuntu"},"change_message_id":"a32009cce0ff4bd5fb5aefb2f4508c5ed989b5bf","unresolved":false,"context_lines":[{"line_number":15,"context_line":"After:"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"./bin/nova-manage floating delete --ip_range 10.250.0.0/16"},{"line_number":18,"context_line":"69.56user 2.24system 1:30.16elapsed 79%CPU (0avgtext+0avgdata 671440maxresident)k"},{"line_number":19,"context_line":"0inputs+0outputs (0major+46636minor)pagefaults 0swaps"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Resolves bug 1023560."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAALH%2F%2FfVg%3D","line":18,"updated":"2012-09-06 18:17:49.000000000","message":"This is taking nearly 600MB more memory than it used to.","commit_id":"79516cfba3179f5d5b992b909e254e4fbaff4094"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":3217,"name":"Ian Wells","username":"ijw-ubuntu"},"change_message_id":"6c7ec605d2e6220904701caef2a7cdfad8333bf5","unresolved":false,"context_lines":[{"line_number":742,"context_line":"    existing_ips \u003d {}"},{"line_number":743,"context_line":"    session \u003d get_session()"},{"line_number":744,"context_line":"    with session.begin():"},{"line_number":745,"context_line":"        for floating in _floating_ip_get_all(context, session\u003dsession).all():"},{"line_number":746,"context_line":"            addr \u003d floating[\u0027address\u0027]"},{"line_number":747,"context_line":"            if addr in addresses:"},{"line_number":748,"context_line":"                floating.delete(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2FflU%3D","line":745,"updated":"2012-09-06 11:35:39.000000000","message":"This may be faster than it was, but it\u0027s still nasty DB code.  Fetch  the whole table, then delete rows that match a condition tested in the application?  The condition should be pushed into the SQL statement.\n\nI\u0027m also surprised it\u0027s faster than the previous version,  actually.  In fact, it shouldn\u0027t be, since it\u0027s not necessary (from an SQL perspective, our implementation aside) to fetch a row from the DB in order to delete it.","commit_id":"79516cfba3179f5d5b992b909e254e4fbaff4094"},{"author":{"_account_id":3217,"name":"Ian Wells","username":"ijw-ubuntu"},"change_message_id":"a8b96df2ca204b825b04a30df073c1647d54aada","unresolved":false,"context_lines":[{"line_number":742,"context_line":"    existing_ips \u003d {}"},{"line_number":743,"context_line":"    session \u003d get_session()"},{"line_number":744,"context_line":"    with session.begin():"},{"line_number":745,"context_line":"        for floating in _floating_ip_get_all(context, session\u003dsession).all():"},{"line_number":746,"context_line":"            addr \u003d floating[\u0027address\u0027]"},{"line_number":747,"context_line":"            if addr in addresses:"},{"line_number":748,"context_line":"                floating.delete(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2FfVo%3D","line":745,"in_reply_to":"AAAALH%2F%2FfWc%3D","updated":"2012-09-06 18:15:01.000000000","message":"With a class B and 64k addresses I suspect you\u0027ll hit a MySQL limit on argument passing, though I totally agree with the .delete() part.  \n\nReally you want to construct a range query with INET_ATON\nor INET6_ATON in it rather than an \u0027in\u0027 query, as opposed to enumerating the whole network client-side - it\u0027s unavoidable on creation given the setup, but unnecessary for deletion.","commit_id":"79516cfba3179f5d5b992b909e254e4fbaff4094"},{"author":{"_account_id":4987,"name":"Eugene Kirpichov","email":"ekirpichov@gmail.com","username":"ekirpichov"},"change_message_id":"bc159b03e383366c26dce3ff91d4be633d8c9209","unresolved":false,"context_lines":[{"line_number":742,"context_line":"    existing_ips \u003d {}"},{"line_number":743,"context_line":"    session \u003d get_session()"},{"line_number":744,"context_line":"    with session.begin():"},{"line_number":745,"context_line":"        for floating in _floating_ip_get_all(context, session\u003dsession).all():"},{"line_number":746,"context_line":"            addr \u003d floating[\u0027address\u0027]"},{"line_number":747,"context_line":"            if addr in addresses:"},{"line_number":748,"context_line":"                floating.delete(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2FfWc%3D","line":745,"in_reply_to":"AAAALH%2F%2FflU%3D","updated":"2012-09-06 17:55:57.000000000","message":"Indeed, should be instead something like _floating_ip_get_all(context, session\u003dsession).filter(FloatingIp.address.in_(ips)).delete()","commit_id":"79516cfba3179f5d5b992b909e254e4fbaff4094"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"da4f8145872d52c1416cfff7a4ff27486f9aa7de","unresolved":false,"context_lines":[{"line_number":751,"context_line":"    warnings \u003d []"},{"line_number":752,"context_line":"    for addr in addresses:"},{"line_number":753,"context_line":"        ex \u003d exception.FloatingIpNotFoundForAddress(address\u003daddr)"},{"line_number":754,"context_line":"        warnings.append(ex)"},{"line_number":755,"context_line":"    return warnings"},{"line_number":756,"context_line":""},{"line_number":757,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2FfkE%3D","line":754,"updated":"2012-09-06 12:55:16.000000000","message":"More pythonic to construct as a list comprehension?\n\n  return [exception.FloatingIpNotFoundForAddress(address\u003daddr)\n          for addr in addresses]","commit_id":"79516cfba3179f5d5b992b909e254e4fbaff4094"},{"author":{"_account_id":3217,"name":"Ian Wells","username":"ijw-ubuntu"},"change_message_id":"761721112de2b2c68d5bdd2a2e9caecd13e823e4","unresolved":false,"context_lines":[{"line_number":736,"context_line":""},{"line_number":737,"context_line":"def _ip_range_splitter(ips):"},{"line_number":738,"context_line":"    \"\"\"Yields blocks of IPs no more than 256 elements long.\"\"\""},{"line_number":739,"context_line":"    out \u003d []"},{"line_number":740,"context_line":"    count \u003d 0"},{"line_number":741,"context_line":"    for ip in ips:"},{"line_number":742,"context_line":"        out.append(ip[\u0027address\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALH%2F%2FdZQ%3D","line":739,"updated":"2012-09-09 13:52:11.000000000","message":"Only criticism is the hard coded 255/256 which ought to be a constant for neatness (and so that you explain why 256 was chosen).","commit_id":"5339141f04bf3ce470677e5fc3800ce4ac3fc0ae"}]}
