)]}'
{"designate/api/middleware.py":[{"author":{"_account_id":8099,"name":"Graham Hayes","email":"gr@ham.ie","username":"graham"},"change_message_id":"4f2b90e7e701264b8708ecd2e128ac7465f2fff0","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _extract_all_projects_count(self, ctxt, request):"},{"line_number":95,"context_line":"        ctxt.all_tenants_count \u003d True"},{"line_number":96,"context_line":"        value \u003d request.headers.get(\u0027X-All-Projects-Count\u0027)"},{"line_number":97,"context_line":"        if value:"},{"line_number":98,"context_line":"            ctxt.all_tenants_count \u003d strutils.bool_from_string(value)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_2d582dfa","line":96,"range":{"start_line":96,"start_character":37,"end_line":96,"end_character":57},"updated":"2016-06-28 12:34:36.000000000","message":"Honestly, I would prefer this being \"DNS-Show-Total-Count\" or \"OpenStack-DNS-Show-Total-Count\"\n\nwe could then show or hide the counts on all requests, not just All-Projects /recordsets calls\n\nWe can set that in the client by default, as we do not use the count number anywhere in the output.\n\nSimilarly we could do it for UI\u0027s that do not have a \"x of y\"\n\nAlso, We can drop the \"X-\" the guidance is that from now on, \"X-\" is deprecated - see https://github.com/openstack/api-wg/blob/master/guidelines/headers.rst","commit_id":"38ef282b6c7c4a5e8e144157ddd51a0c000325e5"},{"author":{"_account_id":6662,"name":"James Li","email":"yueli.m@gmail.com","username":"james-li-3"},"change_message_id":"b73ef924326439c06b7d9f92381a3f97357bbfc1","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _extract_all_projects_count(self, ctxt, request):"},{"line_number":95,"context_line":"        ctxt.all_tenants_count \u003d True"},{"line_number":96,"context_line":"        value \u003d request.headers.get(\u0027X-All-Projects-Count\u0027)"},{"line_number":97,"context_line":"        if value:"},{"line_number":98,"context_line":"            ctxt.all_tenants_count \u003d strutils.bool_from_string(value)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_88a2c849","line":96,"range":{"start_line":96,"start_character":37,"end_line":96,"end_character":57},"in_reply_to":"3aaa91ec_2d582dfa","updated":"2016-06-29 03:44:05.000000000","message":"I think a typical use case is that operator wants to hide total_count for all tenant calls but keep it for regular calls, the reason is that for all tenant calls the count query has to do a string matching (e.g. filtering like \u0027name\u003d%foo%\u0027) for every row in the whole recordsets table, which is much more expensive/slow than for regular calls.\n\n\nIf that\u0027s valid, that means we need two headers? maybe one is \u0027OpenStack-DNS-Show-All-Projects-Count\u0027, the other \u0027OpenStack-DNS-Show-Regular-Count\u0027.","commit_id":"38ef282b6c7c4a5e8e144157ddd51a0c000325e5"},{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"0bf159a11e132f6adc4e360c6f3b6bac381fdb73","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _extract_all_projects_count(self, ctxt, request):"},{"line_number":95,"context_line":"        ctxt.all_tenants_count \u003d True"},{"line_number":96,"context_line":"        value \u003d request.headers.get(\u0027X-All-Projects-Count\u0027)"},{"line_number":97,"context_line":"        if value:"},{"line_number":98,"context_line":"            ctxt.all_tenants_count \u003d strutils.bool_from_string(value)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_d955a450","line":96,"range":{"start_line":96,"start_character":37,"end_line":96,"end_character":57},"in_reply_to":"3aaa91ec_88a2c849","updated":"2016-06-29 14:48:29.000000000","message":"I think the header should be a generic \"hide counts\". Then if an operator wants to hide it in some tooling for every call, they can do that. Or if it\u0027s just an all tenants thing that\u0027s fine. But I don\u0027t want two headers.","commit_id":"38ef282b6c7c4a5e8e144157ddd51a0c000325e5"},{"author":{"_account_id":8099,"name":"Graham Hayes","email":"gr@ham.ie","username":"graham"},"change_message_id":"c0835dc154801ea2f5d206bac9f554ca2c40d3df","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _extract_all_projects_count(self, ctxt, request):"},{"line_number":95,"context_line":"        ctxt.all_tenants_count \u003d True"},{"line_number":96,"context_line":"        value \u003d request.headers.get(\u0027X-All-Projects-Count\u0027)"},{"line_number":97,"context_line":"        if value:"},{"line_number":98,"context_line":"            ctxt.all_tenants_count \u003d strutils.bool_from_string(value)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_7c845e0a","line":96,"range":{"start_line":96,"start_character":37,"end_line":96,"end_character":57},"in_reply_to":"3aaa91ec_d955a450","updated":"2016-06-29 14:59:15.000000000","message":"Sorry - my brain inverted this.\n\nWe cannot change this now, but what we can do is add a new header \n\n\"OpenStack-DNS-Hide-Counts\" that will hide all counts.\n\nWe can set that in the python-designateclient cli plugin (as the info is not used), and if an operator had say a \"smart\" proxy in front of its API, it could look at the request, and check a URL, and see if the \"all-projects\" header / URL query was also set. then it could possibly inject this new header as required.\n\nIn theory.","commit_id":"38ef282b6c7c4a5e8e144157ddd51a0c000325e5"},{"author":{"_account_id":8099,"name":"Graham Hayes","email":"gr@ham.ie","username":"graham"},"change_message_id":"11885dd6bf1ae4576cc20992ca02a94249c70ec1","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                value \u003d request.GET.pop(i)"},{"line_number":92,"context_line":"                ctxt.all_tenants \u003d strutils.bool_from_string(value)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _extract_all_projects_count(self, ctxt, request):"},{"line_number":95,"context_line":"        ctxt.hide_counts \u003d False"},{"line_number":96,"context_line":"        value \u003d request.headers.get(\u0027OpenStack-DNS-Hide-Counts\u0027)"},{"line_number":97,"context_line":"        if value:"}],"source_content_type":"text/x-python","patch_set":5,"id":"dada55a8_a1dec43c","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":35},"updated":"2016-07-19 20:07:57.000000000","message":"should probably call this \"_extract_dns_hide_counts\"","commit_id":"007ddb63b663b382d032e93e3888bb6e64a84847"},{"author":{"_account_id":6662,"name":"James Li","email":"yueli.m@gmail.com","username":"james-li-3"},"change_message_id":"c59069416cf33eac56844392d46bbaeeb284f1aa","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                value \u003d request.GET.pop(i)"},{"line_number":92,"context_line":"                ctxt.all_tenants \u003d strutils.bool_from_string(value)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _extract_all_projects_count(self, ctxt, request):"},{"line_number":95,"context_line":"        ctxt.hide_counts \u003d False"},{"line_number":96,"context_line":"        value \u003d request.headers.get(\u0027OpenStack-DNS-Hide-Counts\u0027)"},{"line_number":97,"context_line":"        if value:"}],"source_content_type":"text/x-python","patch_set":5,"id":"dada55a8_0a121309","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":35},"in_reply_to":"dada55a8_a1dec43c","updated":"2016-07-20 17:03:27.000000000","message":"Done","commit_id":"007ddb63b663b382d032e93e3888bb6e64a84847"}],"designate/api/v2/controllers/blacklists.py":[{"author":{"_account_id":15171,"name":"Eric Larson","email":"eric.larson@rackspace.com","username":"elarson"},"change_message_id":"b924086f76a8a3377806349ddcac1eabe70e4b9b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        context \u003d request.environ[\u0027context\u0027]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # Extract the pagination params"},{"line_number":54,"context_line":"        marker, limit, sort_key, sort_dir \u003d utils.get_paging_params(context,"},{"line_number":55,"context_line":"            params, self.SORT_KEYS)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        # Extract any filter params"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_0702880b","line":54,"updated":"2016-06-15 20:23:07.000000000","message":"Nit: move this one to the next line so it is clear the args have changed but the function hasn\u0027t.","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"}],"designate/api/v2/controllers/common.py":[{"author":{"_account_id":15171,"name":"Eric Larson","email":"eric.larson@rackspace.com","username":"elarson"},"change_message_id":"b924086f76a8a3377806349ddcac1eabe70e4b9b","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        controller_obj.central_api.get_zone(context, zone_id)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    # Extract the pagination params"},{"line_number":26,"context_line":"    marker, limit, sort_key, sort_dir \u003d utils.get_paging_params(context,"},{"line_number":27,"context_line":"            params, controller_obj.SORT_KEYS)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # Extract any filter params."}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_b9111c56","line":26,"updated":"2016-06-15 20:23:07.000000000","message":"same nit","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8099,"name":"Graham Hayes","email":"gr@ham.ie","username":"graham"},"change_message_id":"f2b7f4c765f28dd6a7b9e475899c793fcdd3e26b","unresolved":false,"context_lines":[{"line_number":27,"context_line":"            params, controller_obj.SORT_KEYS)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # Extract any filter params."},{"line_number":30,"context_line":"    accepted_filters \u003d (\u0027name\u0027, \u0027type\u0027, \u0027ttl\u0027, \u0027data\u0027, \u0027status\u0027)"},{"line_number":31,"context_line":"    criterion \u003d controller_obj._apply_filter_params("},{"line_number":32,"context_line":"            params, accepted_filters, {})"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_b2df4dd5","line":30,"updated":"2016-06-16 13:19:11.000000000","message":"Removing accepted filters is technically an API change.\nNot sure what we should do about it.","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"63babca8356e65cb6b12e995aee63884e6b449fd","unresolved":false,"context_lines":[{"line_number":27,"context_line":"            params, controller_obj.SORT_KEYS)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # Extract any filter params."},{"line_number":30,"context_line":"    accepted_filters \u003d (\u0027name\u0027, \u0027type\u0027, \u0027ttl\u0027, \u0027data\u0027, \u0027status\u0027)"},{"line_number":31,"context_line":"    criterion \u003d controller_obj._apply_filter_params("},{"line_number":32,"context_line":"            params, accepted_filters, {})"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_a3cedab4","line":30,"in_reply_to":"7aa08908_b2df4dd5","updated":"2016-06-16 14:42:54.000000000","message":"Also, is there a particular reason that \u0027description\u0027 isn\u0027t allowed? I could see people using the description as a type of \"tagging\" mechanism.","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"e2e22d7c1372a739ef2b4d5f770014fbfe4b8eb6","unresolved":false,"context_lines":[{"line_number":27,"context_line":"            context, params, controller_obj.SORT_KEYS)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # Extract any filter params."},{"line_number":30,"context_line":"    accepted_filters \u003d (\u0027name\u0027, \u0027type\u0027, \u0027ttl\u0027, \u0027data\u0027, \u0027status\u0027, \u0027description\u0027)"},{"line_number":31,"context_line":"    criterion \u003d controller_obj._apply_filter_params("},{"line_number":32,"context_line":"            params, accepted_filters, {})"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_8c0ce795","line":30,"updated":"2016-08-08 19:53:28.000000000","message":"super nit alert\n\nYou could add the comma, and pop it on the next line so that future diffs are hopefully better, although with the length of this line, I don\u0027t know how much it\u0027ll matter.","commit_id":"6b319e2d1d2551b929bb8de3f150a456a4b1f6c5"},{"author":{"_account_id":6662,"name":"James Li","email":"yueli.m@gmail.com","username":"james-li-3"},"change_message_id":"7be49000fadd5f36de65393d577e42abec0fafb5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"            context, params, controller_obj.SORT_KEYS)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # Extract any filter params."},{"line_number":30,"context_line":"    accepted_filters \u003d (\u0027name\u0027, \u0027type\u0027, \u0027ttl\u0027, \u0027data\u0027, \u0027status\u0027, \u0027description\u0027)"},{"line_number":31,"context_line":"    criterion \u003d controller_obj._apply_filter_params("},{"line_number":32,"context_line":"            params, accepted_filters, {})"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_e1a96e25","line":30,"in_reply_to":"9ad45d7e_8c0ce795","updated":"2016-08-11 19:37:22.000000000","message":"Done","commit_id":"6b319e2d1d2551b929bb8de3f150a456a4b1f6c5"},{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"e2e22d7c1372a739ef2b4d5f770014fbfe4b8eb6","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        force_index \u003d False"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    recordsets \u003d controller_obj.central_api.find_recordsets("},{"line_number":41,"context_line":"            context, criterion, marker, limit, sort_key, sort_dir, force_index)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    return recordsets"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_cca37f9d","line":41,"updated":"2016-08-08 19:53:28.000000000","message":"As a style thing, I would prefer making the keyword arg explicit here.","commit_id":"6b319e2d1d2551b929bb8de3f150a456a4b1f6c5"},{"author":{"_account_id":6662,"name":"James Li","email":"yueli.m@gmail.com","username":"james-li-3"},"change_message_id":"7be49000fadd5f36de65393d577e42abec0fafb5","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        force_index \u003d False"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    recordsets \u003d controller_obj.central_api.find_recordsets("},{"line_number":41,"context_line":"            context, criterion, marker, limit, sort_key, sort_dir, force_index)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    return recordsets"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_c466f8b9","line":41,"in_reply_to":"9ad45d7e_cca37f9d","updated":"2016-08-11 19:37:22.000000000","message":"sorry, I don\u0027t quite understand. Isn\u0027t the arguments of find_recordsets() already explicit? Do you mean to use **kwargs?","commit_id":"6b319e2d1d2551b929bb8de3f150a456a4b1f6c5"}],"designate/api/v2/controllers/pools.py":[{"author":{"_account_id":15171,"name":"Eric Larson","email":"eric.larson@rackspace.com","username":"elarson"},"change_message_id":"b924086f76a8a3377806349ddcac1eabe70e4b9b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        context \u003d request.environ[\u0027context\u0027]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # Extract the pagination params"},{"line_number":52,"context_line":"        marker, limit, sort_key, sort_dir \u003d utils.get_paging_params(context,"},{"line_number":53,"context_line":"            params, self.SORT_KEYS)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        # Extract any filter params."}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_b938fcd5","line":52,"updated":"2016-06-15 20:23:07.000000000","message":"same nit","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"}],"designate/api/v2/controllers/recordsets.py":[{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"e2e22d7c1372a739ef2b4d5f770014fbfe4b8eb6","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class RecordSetsViewController(rest.RestController):"},{"line_number":29,"context_line":"    SORT_KEYS \u003d [\u0027created_at\u0027, \u0027updated_at\u0027, \u0027zone_id\u0027, \u0027tenant_id\u0027,"},{"line_number":30,"context_line":"                 \u0027name\u0027, \u0027type\u0027, \u0027ttl\u0027]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @pecan.expose(template\u003d\u0027json:\u0027, content_type\u003d\u0027application/json\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_4ce94f1a","line":29,"updated":"2016-08-08 19:53:28.000000000","message":"Why remove id here? I mean I don\u0027t know why you\u0027d want to sort by ID but...\n\nSame question for records, although I don\u0027t even know how that would work.","commit_id":"6b319e2d1d2551b929bb8de3f150a456a4b1f6c5"},{"author":{"_account_id":6662,"name":"James Li","email":"yueli.m@gmail.com","username":"james-li-3"},"change_message_id":"7be49000fadd5f36de65393d577e42abec0fafb5","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class RecordSetsViewController(rest.RestController):"},{"line_number":29,"context_line":"    SORT_KEYS \u003d [\u0027created_at\u0027, \u0027updated_at\u0027, \u0027zone_id\u0027, \u0027tenant_id\u0027,"},{"line_number":30,"context_line":"                 \u0027name\u0027, \u0027type\u0027, \u0027ttl\u0027]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @pecan.expose(template\u003d\u0027json:\u0027, content_type\u003d\u0027application/json\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_843fe0b2","line":29,"in_reply_to":"9ad45d7e_4ce94f1a","updated":"2016-08-11 19:37:22.000000000","message":"A sort key must be a DB table column so \u0027records\u0027 is invalid. I think it\u0027s a bug here;\n\nAs for \u0027id\u0027, the default behavior is to sort by created_at and id. I don\u0027t think sorting by id itself ONLY makes any sense.","commit_id":"6b319e2d1d2551b929bb8de3f150a456a4b1f6c5"}],"designate/api/v2/controllers/service_status.py":[{"author":{"_account_id":15171,"name":"Eric Larson","email":"eric.larson@rackspace.com","username":"elarson"},"change_message_id":"b924086f76a8a3377806349ddcac1eabe70e4b9b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        request \u003d pecan.request"},{"line_number":32,"context_line":"        context \u003d pecan.request.environ[\u0027context\u0027]"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        marker, limit, sort_key, sort_dir \u003d utils.get_paging_params(context,"},{"line_number":35,"context_line":"            params, self.SORT_KEYS)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        accepted_filters \u003d [\"hostname\", \"service_name\", \"status\"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_79a97490","line":34,"updated":"2016-06-15 20:23:07.000000000","message":"same nit","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"}],"designate/api/v2/controllers/tlds.py":[{"author":{"_account_id":15171,"name":"Eric Larson","email":"eric.larson@rackspace.com","username":"elarson"},"change_message_id":"b924086f76a8a3377806349ddcac1eabe70e4b9b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        context \u003d request.environ[\u0027context\u0027]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # Extract the pagination params"},{"line_number":52,"context_line":"        marker, limit, sort_key, sort_dir \u003d utils.get_paging_params(context,"},{"line_number":53,"context_line":"            params, self.SORT_KEYS)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        # Extract any filter params."}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_b993dc5b","line":52,"updated":"2016-06-15 20:23:07.000000000","message":"same nit","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"}],"designate/api/v2/controllers/tsigkeys.py":[{"author":{"_account_id":15171,"name":"Eric Larson","email":"eric.larson@rackspace.com","username":"elarson"},"change_message_id":"b924086f76a8a3377806349ddcac1eabe70e4b9b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        context \u003d request.environ[\u0027context\u0027]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # Extract the pagination params"},{"line_number":54,"context_line":"        marker, limit, sort_key, sort_dir \u003d utils.get_paging_params(context,"},{"line_number":55,"context_line":"            params, self.SORT_KEYS)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        # Extract any filter params"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_198b1020","line":54,"updated":"2016-06-15 20:23:07.000000000","message":"I\u0027m going to stop marking these ;)","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"}],"designate/central/rpcapi.py":[{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"e2e22d7c1372a739ef2b4d5f770014fbfe4b8eb6","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                                recordset_id\u003drecordset_id)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def find_recordsets(self, context, criterion\u003dNone, marker\u003dNone, limit\u003dNone,"},{"line_number":208,"context_line":"                        sort_key\u003dNone, sort_dir\u003dNone, force_index\u003dFalse):"},{"line_number":209,"context_line":"        return self.client.call(context, \u0027find_recordsets\u0027,"},{"line_number":210,"context_line":"                                criterion\u003dcriterion, marker\u003dmarker,"},{"line_number":211,"context_line":"                                limit\u003dlimit, sort_key\u003dsort_key,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_2cbb3bc6","line":208,"updated":"2016-08-08 19:53:28.000000000","message":"I think this needs an RPC version update.","commit_id":"6b319e2d1d2551b929bb8de3f150a456a4b1f6c5"}],"designate/sqlalchemy/base.py":[{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"833574b1bf070d833f3e0c305fa81ac1a028c30c","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            select_from(rzjoin).where(zones_table.c.deleted \u003d\u003d \u00270\u0027)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        if rrset_index_hint:"},{"line_number":311,"context_line":"            inner_q \u003d inner_q.with_hint(recordsets_table, rrset_index_hint)"},{"line_number":312,"context_line":"        if filtering_records:"},{"line_number":313,"context_line":"            inner_q \u003d inner_q.with_hint(records_table, record_index_hint)"},{"line_number":314,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_7258698b","line":311,"range":{"start_line":311,"start_character":30,"end_line":311,"end_character":39},"updated":"2016-06-15 20:55:24.000000000","message":"`with_hint`, that\u0027s pretty cool","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":741,"name":"Kiall Mac Innes","email":"kiall@macinnes.ie","username":"kiall"},"change_message_id":"c5e6f91c47e9f7a34718f8cb63d9d935033e4233","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            select_from(rzjoin).where(zones_table.c.deleted \u003d\u003d \u00270\u0027)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        if rrset_index_hint:"},{"line_number":311,"context_line":"            inner_q \u003d inner_q.with_hint(recordsets_table, rrset_index_hint)"},{"line_number":312,"context_line":"        if filtering_records:"},{"line_number":313,"context_line":"            inner_q \u003d inner_q.with_hint(records_table, record_index_hint)"},{"line_number":314,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_67acd09f","line":311,"range":{"start_line":311,"start_character":30,"end_line":311,"end_character":39},"in_reply_to":"7aa08908_7258698b","updated":"2016-06-17 10:20:47.000000000","message":"Nice. Didn\u0027t know this even existed.","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"833574b1bf070d833f3e0c305fa81ac1a028c30c","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # Count query does not scale well for large amount of recordsets,"},{"line_number":372,"context_line":"        # so don\u0027t do it on all tenants requests."},{"line_number":373,"context_line":"        total_count \u003d None"},{"line_number":374,"context_line":"        if not context.all_tenants:"},{"line_number":375,"context_line":"            resultproxy \u003d self.session.execute(count_q)"},{"line_number":376,"context_line":"            result \u003d resultproxy.fetchone()"},{"line_number":377,"context_line":"            total_count \u003d 0 if result is None else result[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_3210a1ab","line":374,"updated":"2016-06-15 20:55:24.000000000","message":"I think I\u0027d like to see this done more generally, if possible. Doing a huge all-tenants query against /v2/zones will suffer from the same issue.","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8099,"name":"Graham Hayes","email":"gr@ham.ie","username":"graham"},"change_message_id":"f2b7f4c765f28dd6a7b9e475899c793fcdd3e26b","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # Count query does not scale well for large amount of recordsets,"},{"line_number":372,"context_line":"        # so don\u0027t do it on all tenants requests."},{"line_number":373,"context_line":"        total_count \u003d None"},{"line_number":374,"context_line":"        if not context.all_tenants:"},{"line_number":375,"context_line":"            resultproxy \u003d self.session.execute(count_q)"},{"line_number":376,"context_line":"            result \u003d resultproxy.fetchone()"},{"line_number":377,"context_line":"            total_count \u003d 0 if result is None else result[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_52e709ac","line":374,"updated":"2016-06-16 13:19:11.000000000","message":"This *is* a breaking API change.\n\nWe have to find a way of optimising it - is performance that bad, even with an index?","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":741,"name":"Kiall Mac Innes","email":"kiall@macinnes.ie","username":"kiall"},"change_message_id":"0686b0e4a6ba5315a1d6c3a6f9839fc4cd7daf8a","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # Count query does not scale well for large amount of recordsets,"},{"line_number":372,"context_line":"        # so don\u0027t do it on all tenants requests."},{"line_number":373,"context_line":"        total_count \u003d None"},{"line_number":374,"context_line":"        if not context.all_tenants:"},{"line_number":375,"context_line":"            resultproxy \u003d self.session.execute(count_q)"},{"line_number":376,"context_line":"            result \u003d resultproxy.fetchone()"},{"line_number":377,"context_line":"            total_count \u003d 0 if result is None else result[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_9608702a","line":374,"in_reply_to":"5a9d85d2_e672e07b","updated":"2016-06-27 21:45:48.000000000","message":"\u003e Surely not changing the default behavior, but allowing a user to opt-out of this kind of thing for an all-tenants query would be acceptable if we don\u0027t have any better options?\n\nThis is perfectly fine, we can add flags to disable sending this extra + expensive to generate data.. The annoying thing is, very very very few people will ever use it :(","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":741,"name":"Kiall Mac Innes","email":"kiall@macinnes.ie","username":"kiall"},"change_message_id":"c5e6f91c47e9f7a34718f8cb63d9d935033e4233","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # Count query does not scale well for large amount of recordsets,"},{"line_number":372,"context_line":"        # so don\u0027t do it on all tenants requests."},{"line_number":373,"context_line":"        total_count \u003d None"},{"line_number":374,"context_line":"        if not context.all_tenants:"},{"line_number":375,"context_line":"            resultproxy \u003d self.session.execute(count_q)"},{"line_number":376,"context_line":"            result \u003d resultproxy.fetchone()"},{"line_number":377,"context_line":"            total_count \u003d 0 if result is None else result[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_87a73cbb","line":374,"in_reply_to":"7aa08908_23ae6ae7","updated":"2016-06-17 10:20:47.000000000","message":"Yea, blocked API changes suck :( Especially when it\u0027s a \"good change\". A few notes on this:\n\n1) Lets start a new RST file in the docs \"Learnings from APIv2\" - this kinda knowledge will be long lost by the time V3 rolls around and we have a real chance to fix it... Even if V3 never happens, it\u0027s worth documenting the shortcomings of the API.\n\n2) Can we get away with pre-computing the most likely counts? e.g. total overall, totals per tenant, totals per name? These can be maintained accurately easily enough with atomic increments and decrements. (The issue becomes row count for piles of \"name: bla.com, rrset_count: 1\") - but this may be a better trade off?","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"63babca8356e65cb6b12e995aee63884e6b449fd","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # Count query does not scale well for large amount of recordsets,"},{"line_number":372,"context_line":"        # so don\u0027t do it on all tenants requests."},{"line_number":373,"context_line":"        total_count \u003d None"},{"line_number":374,"context_line":"        if not context.all_tenants:"},{"line_number":375,"context_line":"            resultproxy \u003d self.session.execute(count_q)"},{"line_number":376,"context_line":"            result \u003d resultproxy.fetchone()"},{"line_number":377,"context_line":"            total_count \u003d 0 if result is None else result[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_23ae6ae7","line":374,"in_reply_to":"7aa08908_52e709ac","updated":"2016-06-16 14:42:54.000000000","message":"When you get to \u003e 1 Million rrsets, yeah it gets pretty awful. \n\nWe figured there\u0027s no need to do a total count for all-tenants queries because you can use /admin/reports to get the same information.\n\nIf we can\u0027t change this for all tenants queries because of the api change (/me rolls his eyes a bit), we also talked about supplying a custom header that disabled these count queries for any request. But we didn\u0027t love the idea of having custom one-off headers for stuff. That\u0027s a dangerous road to go down.","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"ad247607cf6ae865f27b9612b1faec3ed4a1bb28","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # Count query does not scale well for large amount of recordsets,"},{"line_number":372,"context_line":"        # so don\u0027t do it on all tenants requests."},{"line_number":373,"context_line":"        total_count \u003d None"},{"line_number":374,"context_line":"        if not context.all_tenants:"},{"line_number":375,"context_line":"            resultproxy \u003d self.session.execute(count_q)"},{"line_number":376,"context_line":"            result \u003d resultproxy.fetchone()"},{"line_number":377,"context_line":"            total_count \u003d 0 if result is None else result[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a9d85d2_e672e07b","line":374,"in_reply_to":"7aa08908_87a73cbb","updated":"2016-06-20 15:20:50.000000000","message":"1. On a \"Learnings from APIv2\" doc: ++++++++\n\n2. I wonder how that\u0027d work with quotas and stuff? You don\u0027t want to be using a count that you\u0027re not 100% on for quota enforcement. I guess quota enforcement doesn\u0027t happen on every GET, but still, seems weird to have a special path for counting things, but not use it in all the counting situations.\n\nI\u0027m interested in the API change rules if a user purposely supplies a \u0027X-NO-DESIGNATE-COUNT: true\u0027 header. Surely not changing the default behavior, but allowing a user to opt-out of this kind of thing for an all-tenants query would be acceptable if we don\u0027t have any better options?","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"}],"designate/sqlalchemy/utils.py":[{"author":{"_account_id":8099,"name":"Graham Hayes","email":"gr@ham.ie","username":"graham"},"change_message_id":"f2b7f4c765f28dd6a7b9e475899c793fcdd3e26b","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":34,"context_line":"ZONE_FILTERING_INDEX \u003d \u0027id_deleted\u0027"},{"line_number":35,"context_line":"RECORD_FILTERING_INDEX \u003d \u0027rrid_status\u0027"},{"line_number":36,"context_line":"RRSET_FILTERING_INDEX \u003d {"},{"line_number":37,"context_line":"    \u0027created_at\u0027: \u0027tenant_created_at_id_name_type_ttl\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_32ea3d75","line":34,"updated":"2016-06-16 13:19:11.000000000","message":"these should be in tables.py i think","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":6662,"name":"James Li","email":"yueli.m@gmail.com","username":"james-li-3"},"change_message_id":"6e7b7aa3dfbc50dc7515a00dded828ae96f0763c","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":34,"context_line":"ZONE_FILTERING_INDEX \u003d \u0027id_deleted\u0027"},{"line_number":35,"context_line":"RECORD_FILTERING_INDEX \u003d \u0027rrid_status\u0027"},{"line_number":36,"context_line":"RRSET_FILTERING_INDEX \u003d {"},{"line_number":37,"context_line":"    \u0027created_at\u0027: \u0027tenant_created_at_id_name_type_ttl\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_215a3451","line":34,"in_reply_to":"7aa08908_32ea3d75","updated":"2016-06-27 13:58:59.000000000","message":"It looks I got a circular import when importing designate.storage.impl_sqlalchemy.tables from here.","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"}],"designate/storage/impl_sqlalchemy/migrate_repo/versions/099_add_filtering_index.py":[{"author":{"_account_id":8099,"name":"Graham Hayes","email":"gr@ham.ie","username":"graham"},"change_message_id":"f2b7f4c765f28dd6a7b9e475899c793fcdd3e26b","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    zones_table \u003d Table(\u0027zones\u0027, meta, autoload\u003dTrue)"},{"line_number":28,"context_line":"    records_table \u003d Table(\u0027records\u0027, meta, autoload\u003dTrue)"},{"line_number":29,"context_line":"    recordsets_table \u003d Table(\u0027recordsets\u0027, meta, autoload\u003dTrue)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    Index(\u0027id_deleted\u0027, zones_table.c.id, zones_table.c.deleted"},{"line_number":32,"context_line":"          ).create(migrate_engine)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_12ed818e","line":30,"updated":"2016-06-16 13:19:11.000000000","message":"++ On what Tim said","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"833574b1bf070d833f3e0c305fa81ac1a028c30c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    zones_table \u003d Table(\u0027zones\u0027, meta, autoload\u003dTrue)"},{"line_number":28,"context_line":"    records_table \u003d Table(\u0027records\u0027, meta, autoload\u003dTrue)"},{"line_number":29,"context_line":"    recordsets_table \u003d Table(\u0027recordsets\u0027, meta, autoload\u003dTrue)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    Index(\u0027id_deleted\u0027, zones_table.c.id, zones_table.c.deleted"},{"line_number":32,"context_line":"          ).create(migrate_engine)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_9259955e","line":30,"updated":"2016-06-15 20:55:24.000000000","message":"So this is obviously a ton of indexes, which is going to have some impact on insert time.\n\nIf there\u0027s a valid justification for each of these indexes, and we can show that it doesn\u0027t adversely impact the insert performance in a meaningful way, I could get behind this.\n\nSo what would be cool is to have a. Some justification that these are all needed, b. Some sort of test that shows that this makes sense performance-wise for problems besides this one. Maybe something like https://github.com/openstack/designate/tree/master/tools/mysql_pending_notify_bench","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":741,"name":"Kiall Mac Innes","email":"kiall@macinnes.ie","username":"kiall"},"change_message_id":"c5e6f91c47e9f7a34718f8cb63d9d935033e4233","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    zones_table \u003d Table(\u0027zones\u0027, meta, autoload\u003dTrue)"},{"line_number":28,"context_line":"    records_table \u003d Table(\u0027records\u0027, meta, autoload\u003dTrue)"},{"line_number":29,"context_line":"    recordsets_table \u003d Table(\u0027recordsets\u0027, meta, autoload\u003dTrue)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    Index(\u0027id_deleted\u0027, zones_table.c.id, zones_table.c.deleted"},{"line_number":32,"context_line":"          ).create(migrate_engine)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_a7ffd832","line":30,"in_reply_to":"7aa08908_12ed818e","updated":"2016-06-17 10:20:47.000000000","message":"Yea, this is likely going to kill INSERT/UPDATE performance, which get progressively slower with row and index counts.. Then again, maybe that\u0027s perfectly acceptable tradeoff .. I also suspect many of these are redundant as far as MySQL is concerned, pt-duplicate-key-checker[1] is a great little tool to examine the database and provide an analysis.\n\npt-index-usage[2] may also be useful, examining query logs to identify which indexes are unused for the current query set. But, given it\u0027s based on real usage patterns which change, I\u0027d be interested in seeing if this can somehow be made \"generic\" such that we provide just the most basic indexes, and allow deployers to add new indexes (forced to a name prefix to avoid conficts on future DB migrations), then configure it\u0027s usage for certain filter patterns. Thoughts?\n\n[1]: https://www.percona.com/doc/percona-toolkit/2.2/pt-duplicate-key-checker.html\n[2]: https://www.percona.com/doc/percona-toolkit/2.2/pt-index-usage.html","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8099,"name":"Graham Hayes","email":"gr@ham.ie","username":"graham"},"change_message_id":"f2b7f4c765f28dd6a7b9e475899c793fcdd3e26b","unresolved":false,"context_lines":[{"line_number":92,"context_line":"          ).create(migrate_engine)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def downgrade(migrate_engine):"},{"line_number":96,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":97,"context_line":"    zones_table \u003d Table(\u0027zones\u0027, meta, autoload\u003dTrue)"},{"line_number":98,"context_line":"    records_table \u003d Table(\u0027records\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_f2ef1584","line":95,"updated":"2016-06-16 13:19:11.000000000","message":"We do not do down grade in OpenStack any more - just remove the entire function","commit_id":"c1ca9d28bba125edacc30508707cff71b58e7d28"},{"author":{"_account_id":8174,"name":"Tim Simmons","email":"tim.r.simmons@gmail.com","username":"TimSimmons"},"change_message_id":"e2e22d7c1372a739ef2b4d5f770014fbfe4b8eb6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Rackspace"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Author: James Li \u003cjames.li@rackspace.com\u003e"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_ccd1bffd","line":1,"updated":"2016-08-08 19:53:28.000000000","message":"If you could change the name of this file to be a bit more descriptive, that\u0027d be good.","commit_id":"6b319e2d1d2551b929bb8de3f150a456a4b1f6c5"}]}
