)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Support GET of shard ranges from container server.  Shard range GETs"},{"line_number":13,"context_line":"support X-Backend-Include-Deleted to include deleted shard ranges in"},{"line_number":14,"context_line":"list and X-Backend-Override-Delete to get shard ranges when container"},{"line_number":15,"context_line":"has been marked as deleted."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Support container PUTs with body in direct_client .py"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"5f7c97a3_7e8d0530","line":15,"updated":"2018-05-16 22:08:43.000000000","message":"Worth also mentioning X-Backend-Record-Type?","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Support GET of shard ranges from container server.  Shard range GETs"},{"line_number":13,"context_line":"support X-Backend-Include-Deleted to include deleted shard ranges in"},{"line_number":14,"context_line":"list and X-Backend-Override-Delete to get shard ranges when container"},{"line_number":15,"context_line":"has been marked as deleted."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Support container PUTs with body in direct_client .py"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"5f7c97a3_2cbbd00e","line":15,"in_reply_to":"5f7c97a3_7e8d0530","updated":"2018-05-18 10:47:35.000000000","message":"Done","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"}],"swift/common/direct_client.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                    content_length \u003d int(v)"},{"line_number":88,"context_line":"        if not contents:"},{"line_number":89,"context_line":"            headers[\u0027Content-Length\u0027] \u003d \u00270\u0027"},{"line_number":90,"context_line":"        if isinstance(contents, six.string_types):"},{"line_number":91,"context_line":"            contents \u003d [contents]"},{"line_number":92,"context_line":"        if content_length is None:"},{"line_number":93,"context_line":"            headers[\u0027Transfer-Encoding\u0027] \u003d \u0027chunked\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_5edb6920","line":90,"range":{"start_line":90,"start_character":32,"end_line":90,"end_character":48},"updated":"2018-05-16 22:08:43.000000000","message":"Does this work well with unicode? Where does it get encoded?","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                    content_length \u003d int(v)"},{"line_number":88,"context_line":"        if not contents:"},{"line_number":89,"context_line":"            headers[\u0027Content-Length\u0027] \u003d \u00270\u0027"},{"line_number":90,"context_line":"        if isinstance(contents, six.string_types):"},{"line_number":91,"context_line":"            contents \u003d [contents]"},{"line_number":92,"context_line":"        if content_length is None:"},{"line_number":93,"context_line":"            headers[\u0027Transfer-Encoding\u0027] \u003d \u0027chunked\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_ac87e00f","line":90,"range":{"start_line":90,"start_character":32,"end_line":90,"end_character":48},"in_reply_to":"5f7c97a3_5edb6920","updated":"2018-05-18 10:47:35.000000000","message":"IIRC this is relocation of code on master so I\u0027m inclined to leave it as is","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        if not contents:"},{"line_number":89,"context_line":"            headers[\u0027Content-Length\u0027] \u003d \u00270\u0027"},{"line_number":90,"context_line":"        if isinstance(contents, six.string_types):"},{"line_number":91,"context_line":"            contents \u003d [contents]"},{"line_number":92,"context_line":"        if content_length is None:"},{"line_number":93,"context_line":"            headers[\u0027Transfer-Encoding\u0027] \u003d \u0027chunked\u0027"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_be72bd48","line":91,"updated":"2018-05-16 22:08:43.000000000","message":"Might also be worth setting content_length.","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        if not contents:"},{"line_number":89,"context_line":"            headers[\u0027Content-Length\u0027] \u003d \u00270\u0027"},{"line_number":90,"context_line":"        if isinstance(contents, six.string_types):"},{"line_number":91,"context_line":"            contents \u003d [contents]"},{"line_number":92,"context_line":"        if content_length is None:"},{"line_number":93,"context_line":"            headers[\u0027Transfer-Encoding\u0027] \u003d \u0027chunked\u0027"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_2cc1902f","line":91,"in_reply_to":"5f7c97a3_be72bd48","updated":"2018-05-18 10:47:35.000000000","message":"ditto","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            while chunk:"},{"line_number":105,"context_line":"                conn.send(\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk))"},{"line_number":106,"context_line":"                chunk \u003d contents_f.read(chunk_size)"},{"line_number":107,"context_line":"            conn.send(\u00270\\r\\n\\r\\n\u0027)"},{"line_number":108,"context_line":"        else:"},{"line_number":109,"context_line":"            left \u003d content_length"},{"line_number":110,"context_line":"            while left \u003e 0:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_3eb54dce","line":107,"updated":"2018-05-16 22:08:43.000000000","message":"nit: Maybe\n\n for chunk in iter(lambda: contents_f.read(chunk_size), b\u0027\u0027):\n     conn.send(\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk))\n conn.send(\u00270\\r\\n\\r\\n\u0027)\n\n?\n\nOff-topic: I wonder if these send()s should have a Timeout on them...","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            while chunk:"},{"line_number":105,"context_line":"                conn.send(\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk))"},{"line_number":106,"context_line":"                chunk \u003d contents_f.read(chunk_size)"},{"line_number":107,"context_line":"            conn.send(\u00270\\r\\n\\r\\n\u0027)"},{"line_number":108,"context_line":"        else:"},{"line_number":109,"context_line":"            left \u003d content_length"},{"line_number":110,"context_line":"            while left \u003e 0:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_8ce544df","line":107,"in_reply_to":"5f7c97a3_3eb54dce","updated":"2018-05-18 10:47:35.000000000","message":"ditto","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                size \u003d chunk_size"},{"line_number":112,"context_line":"                if size \u003e left:"},{"line_number":113,"context_line":"                    size \u003d left"},{"line_number":114,"context_line":"                chunk \u003d contents_f.read(size)"},{"line_number":115,"context_line":"                if not chunk:"},{"line_number":116,"context_line":"                    break"},{"line_number":117,"context_line":"                conn.send(chunk)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_fecb5547","line":114,"updated":"2018-05-16 22:08:43.000000000","message":"Feels more obvious to me as\n\n chunk \u003d contents_f.read(min(chunk_size, left))","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                size \u003d chunk_size"},{"line_number":112,"context_line":"                if size \u003e left:"},{"line_number":113,"context_line":"                    size \u003d left"},{"line_number":114,"context_line":"                chunk \u003d contents_f.read(size)"},{"line_number":115,"context_line":"                if not chunk:"},{"line_number":116,"context_line":"                    break"},{"line_number":117,"context_line":"                conn.send(chunk)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_4ccf2c57","line":114,"in_reply_to":"5f7c97a3_fecb5547","updated":"2018-05-18 10:47:35.000000000","message":"ditto","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    Do not use directly use the get_direct_account or"},{"line_number":136,"context_line":"    get_direct_container instead."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    headers \u003d {} if headers is None else headers"},{"line_number":139,"context_line":"    params \u003d [\u0027format\u003djson\u0027]"},{"line_number":140,"context_line":"    if marker:"},{"line_number":141,"context_line":"        params.append(\u0027marker\u003d%s\u0027 % quote(marker))"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_fe39153f","line":138,"updated":"2018-05-16 22:08:43.000000000","message":"Looks like gen_headers already accepts hdrs_in\u003dNone; I don\u0027t think this is necessary.","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    Do not use directly use the get_direct_account or"},{"line_number":136,"context_line":"    get_direct_container instead."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    headers \u003d {} if headers is None else headers"},{"line_number":139,"context_line":"    params \u003d [\u0027format\u003djson\u0027]"},{"line_number":140,"context_line":"    if marker:"},{"line_number":141,"context_line":"        params.append(\u0027marker\u003d%s\u0027 % quote(marker))"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_6cf54883","line":138,"in_reply_to":"5f7c97a3_fe39153f","updated":"2018-05-18 10:47:35.000000000","message":"Done","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    if add_ts:"},{"line_number":175,"context_line":"        hdrs_out[\u0027X-Timestamp\u0027] \u003d Timestamp.now().internal"},{"line_number":176,"context_line":"    if add_user_agent:"},{"line_number":177,"context_line":"        hdrs_out[\u0027User-Agent\u0027] \u003d \u0027direct-client %s\u0027 % os.getpid()"},{"line_number":178,"context_line":"    return hdrs_out"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_7e1745a5","line":177,"updated":"2018-05-16 22:08:43.000000000","message":"I think we could skip the new arg and just do\n\n hdrs_out.setdefault(\u0027User-Agent\u0027, \u0027direct-client %s\u0027 % os.getpid())","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    if add_ts:"},{"line_number":175,"context_line":"        hdrs_out[\u0027X-Timestamp\u0027] \u003d Timestamp.now().internal"},{"line_number":176,"context_line":"    if add_user_agent:"},{"line_number":177,"context_line":"        hdrs_out[\u0027User-Agent\u0027] \u003d \u0027direct-client %s\u0027 % os.getpid()"},{"line_number":178,"context_line":"    return hdrs_out"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_ccc57c0c","line":177,"in_reply_to":"5f7c97a3_7e1745a5","updated":"2018-05-18 10:47:35.000000000","message":"nope, breaks tests","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":301,"context_line":"              \u0027Container\u0027, conn_timeout, response_timeout)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"def direct_put_container(node, part, account, container, conn_timeout\u003d5,"},{"line_number":305,"context_line":"                         response_timeout\u003d15, headers\u003dNone, contents\u003dNone,"},{"line_number":306,"context_line":"                         content_length\u003dNone, chunk_size\u003d65535):"},{"line_number":307,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_9ee261a0","line":304,"updated":"2018-05-16 22:08:43.000000000","message":"Seems so strange that we didn\u0027t have this method already...","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"}],"swift/container/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":414,"context_line":"            return HTTPCreated(request\u003dreq)"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        record_type \u003d req.headers.get(\u0027x-backend-record-type\u0027, \u0027\u0027).lower()"},{"line_number":417,"context_line":"        if record_type \u003d\u003d RECORD_TYPE_SHARD:"},{"line_number":418,"context_line":"            try:"},{"line_number":419,"context_line":"                # validate incoming data..."},{"line_number":420,"context_line":"                shard_ranges \u003d [ShardRange.from_dict(sr)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_8971e0aa","line":417,"updated":"2018-05-16 00:13:50.000000000","message":"Used by the sharder when reporting stats, yeah?","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":414,"context_line":"            return HTTPCreated(request\u003dreq)"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        record_type \u003d req.headers.get(\u0027x-backend-record-type\u0027, \u0027\u0027).lower()"},{"line_number":417,"context_line":"        if record_type \u003d\u003d RECORD_TYPE_SHARD:"},{"line_number":418,"context_line":"            try:"},{"line_number":419,"context_line":"                # validate incoming data..."},{"line_number":420,"context_line":"                shard_ranges \u003d [ShardRange.from_dict(sr)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_cc2fbca5","line":417,"in_reply_to":"5f7c97a3_8971e0aa","updated":"2018-05-18 10:47:35.000000000","message":"and when creating shard containers","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":419,"context_line":"                # validate incoming data..."},{"line_number":420,"context_line":"                shard_ranges \u003d [ShardRange.from_dict(sr)"},{"line_number":421,"context_line":"                                for sr in json.loads(req.body)]"},{"line_number":422,"context_line":"            except (ValueError, KeyError) as err:"},{"line_number":423,"context_line":"                return HTTPBadRequest(\u0027Invalid body: %r\u0027 % err)"},{"line_number":424,"context_line":"            created \u003d self._maybe_autocreate(broker, req_timestamp, account,"},{"line_number":425,"context_line":"                                             requested_policy_index)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e96174d4","line":422,"updated":"2018-05-16 00:13:50.000000000","message":"Could also throw TypeError if sr is None, or a list, or a string, or...","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":419,"context_line":"                # validate incoming data..."},{"line_number":420,"context_line":"                shard_ranges \u003d [ShardRange.from_dict(sr)"},{"line_number":421,"context_line":"                                for sr in json.loads(req.body)]"},{"line_number":422,"context_line":"            except (ValueError, KeyError) as err:"},{"line_number":423,"context_line":"                return HTTPBadRequest(\u0027Invalid body: %r\u0027 % err)"},{"line_number":424,"context_line":"            created \u003d self._maybe_autocreate(broker, req_timestamp, account,"},{"line_number":425,"context_line":"                                             requested_policy_index)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_af2592ad","line":422,"in_reply_to":"5f7c97a3_e96174d4","updated":"2018-05-18 10:47:35.000000000","message":"Done","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            except (ValueError, KeyError) as err:"},{"line_number":423,"context_line":"                return HTTPBadRequest(\u0027Invalid body: %r\u0027 % err)"},{"line_number":424,"context_line":"            created \u003d self._maybe_autocreate(broker, req_timestamp, account,"},{"line_number":425,"context_line":"                                             requested_policy_index)"},{"line_number":426,"context_line":"            self._update_metadata(req, broker, req_timestamp, \u0027PUT\u0027)"},{"line_number":427,"context_line":"            if shard_ranges:"},{"line_number":428,"context_line":"                # TODO: consider writing the shard ranges into the pending"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_697c8471","line":425,"range":{"start_line":425,"start_character":45,"end_line":425,"end_character":67},"updated":"2018-05-16 00:13:50.000000000","message":"This smells funny... why are we worried about policy index when we\u0027re only inserting shards?","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            except (ValueError, KeyError) as err:"},{"line_number":423,"context_line":"                return HTTPBadRequest(\u0027Invalid body: %r\u0027 % err)"},{"line_number":424,"context_line":"            created \u003d self._maybe_autocreate(broker, req_timestamp, account,"},{"line_number":425,"context_line":"                                             requested_policy_index)"},{"line_number":426,"context_line":"            self._update_metadata(req, broker, req_timestamp, \u0027PUT\u0027)"},{"line_number":427,"context_line":"            if shard_ranges:"},{"line_number":428,"context_line":"                # TODO: consider writing the shard ranges into the pending"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_cf748e9f","line":425,"range":{"start_line":425,"start_character":45,"end_line":425,"end_character":67},"in_reply_to":"5f7c97a3_697c8471","updated":"2018-05-18 10:47:35.000000000","message":"creating a shard container","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":427,"context_line":"            if shard_ranges:"},{"line_number":428,"context_line":"                # TODO: consider writing the shard ranges into the pending"},{"line_number":429,"context_line":"                # file, but if so ensure an all-or-none semantic for the write"},{"line_number":430,"context_line":"                broker.merge_shard_ranges(shard_ranges)"},{"line_number":431,"context_line":"        else:   # put container"},{"line_number":432,"context_line":"            if requested_policy_index is None:"},{"line_number":433,"context_line":"                # use the default index sent by the proxy if available"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_69f1e400","line":430,"updated":"2018-05-16 00:13:50.000000000","message":"Should we attempt a\n\n self.account_update(req, account, container, broker)\n\nafter merging? I understand us not doing it inline with object updates (it\u0027d almost certainly overload the account server), but these should be much less frequent, yeah?\n\nCould be considered after on master, though.","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":427,"context_line":"            if shard_ranges:"},{"line_number":428,"context_line":"                # TODO: consider writing the shard ranges into the pending"},{"line_number":429,"context_line":"                # file, but if so ensure an all-or-none semantic for the write"},{"line_number":430,"context_line":"                broker.merge_shard_ranges(shard_ranges)"},{"line_number":431,"context_line":"        else:   # put container"},{"line_number":432,"context_line":"            if requested_policy_index is None:"},{"line_number":433,"context_line":"                # use the default index sent by the proxy if available"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_6f653ae1","line":430,"in_reply_to":"5f7c97a3_69f1e400","updated":"2018-05-18 10:47:35.000000000","message":"follow on - will require tests too","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        :returns: modified record"},{"line_number":491,"context_line":"        \"\"\""},{"line_number":492,"context_line":"        if isinstance(record, dict):"},{"line_number":493,"context_line":"            # Conversion has already happened (e.g. from a sharded node)"},{"line_number":494,"context_line":"            return record"},{"line_number":495,"context_line":"        if isinstance(record, ShardRange):"},{"line_number":496,"context_line":"            created \u003d record.timestamp"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_c9d7d84a","line":493,"range":{"start_line":493,"start_character":52,"end_line":493,"end_character":71},"updated":"2018-05-16 00:13:50.000000000","message":"!!","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        :returns: modified record"},{"line_number":491,"context_line":"        \"\"\""},{"line_number":492,"context_line":"        if isinstance(record, dict):"},{"line_number":493,"context_line":"            # Conversion has already happened (e.g. from a sharded node)"},{"line_number":494,"context_line":"            return record"},{"line_number":495,"context_line":"        if isinstance(record, ShardRange):"},{"line_number":496,"context_line":"            created \u003d record.timestamp"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_2f69828a","line":493,"range":{"start_line":493,"start_character":52,"end_line":493,"end_character":71},"in_reply_to":"5f7c97a3_c9d7d84a","updated":"2018-05-18 10:47:35.000000000","message":"Done.\n\nAlso, this method is odd but let\u0027s not try to fix that here","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":542,"context_line":"                                                              SHARDED):"},{"line_number":543,"context_line":"            record_type \u003d \u0027shard\u0027"},{"line_number":544,"context_line":"        if record_type \u003d\u003d \u0027shard\u0027:"},{"line_number":545,"context_line":"            resp_headers \u003d gen_resp_headers(info)"},{"line_number":546,"context_line":"            override_deleted \u003d config_true_value("},{"line_number":547,"context_line":"                req.headers.get(\u0027x-backend-override-deleted\u0027, False))"},{"line_number":548,"context_line":"            if is_deleted and not (info and override_deleted):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_8942400e","line":545,"updated":"2018-05-16 00:13:50.000000000","message":"Nothing about is_deleted? How does that adjust resp_headers?\n\nI guess if it\u0027s deleted we shouldn\u0027t be in SHARDING or SHARDED states... so the proxy\u0027s x-backend-record-type:auto should always fall back to objects... so I don\u0027t *think* this risks exposing things back to the *client* that we shouldn\u0027t. *shrug*","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":542,"context_line":"                                                              SHARDED):"},{"line_number":543,"context_line":"            record_type \u003d \u0027shard\u0027"},{"line_number":544,"context_line":"        if record_type \u003d\u003d \u0027shard\u0027:"},{"line_number":545,"context_line":"            resp_headers \u003d gen_resp_headers(info)"},{"line_number":546,"context_line":"            override_deleted \u003d config_true_value("},{"line_number":547,"context_line":"                req.headers.get(\u0027x-backend-override-deleted\u0027, False))"},{"line_number":548,"context_line":"            if is_deleted and not (info and override_deleted):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_02e57d38","line":545,"in_reply_to":"5f7c97a3_8942400e","updated":"2018-05-18 10:47:35.000000000","message":"hmmm, a container can be delete and sharded, need to check this - will add to trello","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":549,"context_line":"                return HTTPNotFound(request\u003dreq, headers\u003dresp_headers)"},{"line_number":550,"context_line":"            resp_headers[\u0027X-Backend-Record-Type\u0027] \u003d \u0027shard\u0027"},{"line_number":551,"context_line":"            includes \u003d get_param(req, \u0027includes\u0027)"},{"line_number":552,"context_line":"            states \u003d get_param(req, \u0027states\u0027) or None"},{"line_number":553,"context_line":"            fill_gaps \u003d False"},{"line_number":554,"context_line":"            if states:"},{"line_number":555,"context_line":"                states \u003d list_from_csv(states)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_29e9ace4","line":552,"range":{"start_line":552,"start_character":45,"end_line":552,"end_character":53},"updated":"2018-05-16 00:13:50.000000000","message":"Why?\n\n \u003e\u003e\u003e list_from_csv(None) \u003d\u003d list_from_csv(\u0027\u0027) \u003d\u003d []\n True","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":549,"context_line":"                return HTTPNotFound(request\u003dreq, headers\u003dresp_headers)"},{"line_number":550,"context_line":"            resp_headers[\u0027X-Backend-Record-Type\u0027] \u003d \u0027shard\u0027"},{"line_number":551,"context_line":"            includes \u003d get_param(req, \u0027includes\u0027)"},{"line_number":552,"context_line":"            states \u003d get_param(req, \u0027states\u0027) or None"},{"line_number":553,"context_line":"            fill_gaps \u003d False"},{"line_number":554,"context_line":"            if states:"},{"line_number":555,"context_line":"                states \u003d list_from_csv(states)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_826e6dc7","line":552,"range":{"start_line":552,"start_character":45,"end_line":552,"end_character":53},"in_reply_to":"5f7c97a3_29e9ace4","updated":"2018-05-18 10:47:35.000000000","message":"Done","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":553,"context_line":"            fill_gaps \u003d False"},{"line_number":554,"context_line":"            if states:"},{"line_number":555,"context_line":"                states \u003d list_from_csv(states)"},{"line_number":556,"context_line":"                fill_gaps \u003d any((\u0027listing\u0027 in states, \u0027updating\u0027 in states))"},{"line_number":557,"context_line":"                try:"},{"line_number":558,"context_line":"                    states \u003d broker.resolve_shard_range_states(states)"},{"line_number":559,"context_line":"                except ValueError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_491f4807","line":556,"updated":"2018-05-16 00:13:50.000000000","message":"Maybe\n\n bool({\u0027listing\u0027, \u0027updating\u0027}.intersection(states))\n\n? *shrug*","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                req.headers.get(\u0027x-backend-include-deleted\u0027, False))"},{"line_number":563,"context_line":"            container_list \u003d broker.get_shard_ranges("},{"line_number":564,"context_line":"                marker, end_marker, includes, reverse, states\u003dstates,"},{"line_number":565,"context_line":"                include_deleted\u003dinclude_deleted, fill_gaps\u003dfill_gaps)"},{"line_number":566,"context_line":"        else:"},{"line_number":567,"context_line":"            resp_headers \u003d gen_resp_headers(info, is_deleted\u003dis_deleted)"},{"line_number":568,"context_line":"            if is_deleted:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_a9be1cd2","line":565,"updated":"2018-05-16 00:13:50.000000000","message":"Nothing for prefix, path, or delimiter? (That last one will be ugly... but almost certainly useful.)\n\nAs it is, a prefix query will ask *every* shard, even ones which can\u0027t possibly contain any items with the prefix...","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f78c4363160aeb651c6a05b4488799624171237f","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                req.headers.get(\u0027x-backend-include-deleted\u0027, False))"},{"line_number":563,"context_line":"            container_list \u003d broker.get_shard_ranges("},{"line_number":564,"context_line":"                marker, end_marker, includes, reverse, states\u003dstates,"},{"line_number":565,"context_line":"                include_deleted\u003dinclude_deleted, fill_gaps\u003dfill_gaps)"},{"line_number":566,"context_line":"        else:"},{"line_number":567,"context_line":"            resp_headers \u003d gen_resp_headers(info, is_deleted\u003dis_deleted)"},{"line_number":568,"context_line":"            if is_deleted:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_fb45a716","line":565,"in_reply_to":"5f7c97a3_a9be1cd2","updated":"2018-05-16 19:45:10.000000000","message":"http://paste.openstack.org/show/721127/ makes prefix a bit better, though maybe I should have plumbed it all the way down into the broker? path could get a similar treatment, but simplified a bit.\n\nDelimiter still sucks, but is a lot more messy.","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46f34dbcdf18b9064e41dc03583369fda2485ec2","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                req.headers.get(\u0027x-backend-include-deleted\u0027, False))"},{"line_number":563,"context_line":"            container_list \u003d broker.get_shard_ranges("},{"line_number":564,"context_line":"                marker, end_marker, includes, reverse, states\u003dstates,"},{"line_number":565,"context_line":"                include_deleted\u003dinclude_deleted, fill_gaps\u003dfill_gaps)"},{"line_number":566,"context_line":"        else:"},{"line_number":567,"context_line":"            resp_headers \u003d gen_resp_headers(info, is_deleted\u003dis_deleted)"},{"line_number":568,"context_line":"            if is_deleted:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_42f7f5d5","line":565,"in_reply_to":"5f7c97a3_fb45a716","updated":"2018-05-18 10:47:35.000000000","message":"Applied this diff to patchset 10 but it causes a probe test failure. Going to back it out.","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7f9e072aff543f2ce40f3958d85206bfff1145b0","unresolved":false,"context_lines":[{"line_number":569,"context_line":"                return HTTPNotFound(request\u003dreq, headers\u003dresp_headers)"},{"line_number":570,"context_line":"            resp_headers[\u0027X-Backend-Record-Type\u0027] \u003d \u0027object\u0027"},{"line_number":571,"context_line":"            # Use the retired db while container is in process of sharding,"},{"line_number":572,"context_line":"            # otherwise use current db"},{"line_number":573,"context_line":"            src_broker \u003d broker.get_brokers()[0]"},{"line_number":574,"context_line":"            container_list \u003d src_broker.list_objects_iter("},{"line_number":575,"context_line":"                limit, marker, end_marker, prefix, delimiter, path,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_09b95013","line":572,"updated":"2018-05-16 00:13:50.000000000","message":"+1, thanks for the comment","commit_id":"84a4e1e06679060bc4ae397517dc6510ce93a503"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"408369c87c8349947afa30f73f74190dfe5fa9e1","unresolved":false,"context_lines":[{"line_number":560,"context_line":"                req.headers.get(\u0027x-backend-include-deleted\u0027, False))"},{"line_number":561,"context_line":"            container_list \u003d broker.get_shard_ranges("},{"line_number":562,"context_line":"                marker, end_marker, includes, reverse, states\u003dstates,"},{"line_number":563,"context_line":"                include_deleted\u003dinclude_deleted, fill_gaps\u003dfill_gaps)"},{"line_number":564,"context_line":"        else:"},{"line_number":565,"context_line":"            resp_headers \u003d gen_resp_headers(info, is_deleted\u003dis_deleted)"},{"line_number":566,"context_line":"            if is_deleted:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_7b1ba572","line":563,"updated":"2018-05-18 19:43:43.000000000","message":"I\u0027ll try to come up with something for prefix/delimiter/path next week...","commit_id":"723eac907c53cc4082703acf63ef77683d698acc"}],"swift/proxy/controllers/container.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def GETorHEAD(self, req):"},{"line_number":85,"context_line":"        \"\"\"Handler for HTTP GET/HEAD requests.\"\"\""},{"line_number":86,"context_line":"        ai \u003d self.account_info(self.account_name, req)"},{"line_number":87,"context_line":"        if not ai[1]:"},{"line_number":88,"context_line":"            if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":89,"context_line":"                aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"},{"line_number":90,"context_line":"                if aresp:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_c9a7c1a7","side":"PARENT","line":87,"range":{"start_line":87,"start_character":15,"end_line":87,"end_character":20},"updated":"2018-05-16 22:08:43.000000000","message":"Off-topic: this seems like *such* a weird thing to switch off of... but I suppose yeah, partition or container count could be zero...","commit_id":"3c44e8503ef20ed44da90a44d70b6ecba2e279c1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\"Handler for HTTP GET/HEAD requests.\"\"\""},{"line_number":86,"context_line":"        ai \u003d self.account_info(self.account_name, req)"},{"line_number":87,"context_line":"        auto_account \u003d self.account_name.startswith("},{"line_number":88,"context_line":"            self.app.auto_create_account_prefix)"},{"line_number":89,"context_line":"        if not (auto_account or ai[1]):"},{"line_number":90,"context_line":"            if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":91,"context_line":"                aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_9ec7c165","line":88,"updated":"2018-05-16 22:08:43.000000000","message":"It feels a little weird that this goes in the *container* controller...","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0da02b38dd1ef8787ac2d11505a30a1fc16c9939","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            return resp"},{"line_number":161,"context_line":"        account_partition, accounts, container_count \u003d \\"},{"line_number":162,"context_line":"            self.account_info(self.account_name, req)"},{"line_number":163,"context_line":"        if not accounts and self.app.account_autocreate:"},{"line_number":164,"context_line":"            if not self.autocreate_account(req, self.account_name):"},{"line_number":165,"context_line":"                return HTTPServerError(request\u003dreq)"},{"line_number":166,"context_line":"            account_partition, accounts, container_count \u003d \\"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_bec4fd60","line":163,"updated":"2018-05-16 22:08:43.000000000","message":"...but yeah, I guess other account autocreate stuff is in here...\n\nSpeaking of, should this be more like\n\n should_autocreate \u003d (\n     self.app.account_autocreate or\n     self.account_name.startswith(self.app.auto_create_account_prefix))\n if not accounts and should_autocreate:\n     ...","commit_id":"5d551e3671d3c13658368a6065e17e5d3fafd7eb"}]}
