)]}'
{"etc/object-server.conf-sample":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3616d3644ddf9b376e13787d04eeef99f7606e75","unresolved":false,"context_lines":[{"line_number":334,"context_line":"#"},{"line_number":335,"context_line":"# concurrency \u003d 1"},{"line_number":336,"context_line":"#"},{"line_number":337,"context_line":"# Instruct remote node to flush data on disk after all objects was transfered."},{"line_number":338,"context_line":"# batch_sync \u003d false"},{"line_number":339,"context_line":"#"},{"line_number":340,"context_line":"# stats_interval \u003d 300"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"3f79a3b5_c0d92828","line":337,"updated":"2018-10-12 17:59:27.000000000","message":"We *definitely* want something here about how it only affects ssync. Maybe also something about when it can be enabled during a rolling upgrade?","commit_id":"ec94d6b757cb22cff7bc0ec11e68d63078a08c83"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3616d3644ddf9b376e13787d04eeef99f7606e75","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.port \u003d None if self.servers_per_port else \\"},{"line_number":154,"context_line":"            int(conf.get(\u0027bind_port\u0027, 6200))"},{"line_number":155,"context_line":"        self.concurrency \u003d int(conf.get(\u0027concurrency\u0027, 1))"},{"line_number":156,"context_line":"        self.batch_sync \u003d config_true_value(conf.get(\u0027batch_sync\u0027, \u0027false\u0027))"},{"line_number":157,"context_line":"        # N.B. to maintain compatibility with legacy configs this option can"},{"line_number":158,"context_line":"        # not be named \u0027workers\u0027 because the object-server uses that option"},{"line_number":159,"context_line":"        # name in the DEFAULT section"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_20633cad","line":156,"updated":"2018-10-12 17:59:27.000000000","message":"Wait, so where does this get used?\n\nOh, over in ssync_sender, as self.daemon.batch_sync... got it.","commit_id":"ec94d6b757cb22cff7bc0ec11e68d63078a08c83"}],"swift/obj/replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3616d3644ddf9b376e13787d04eeef99f7606e75","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            int(conf.get(\u0027bind_port\u0027, 6200))"},{"line_number":140,"context_line":"        self.concurrency \u003d int(conf.get(\u0027concurrency\u0027, 1))"},{"line_number":141,"context_line":"        self.replicator_workers \u003d int(conf.get(\u0027replicator_workers\u0027, 0))"},{"line_number":142,"context_line":"        self.batch_sync \u003d config_true_value(conf.get(\u0027batch_sync\u0027, \u0027false\u0027))"},{"line_number":143,"context_line":"        self.stats_interval \u003d int(conf.get(\u0027stats_interval\u0027, \u0027300\u0027))"},{"line_number":144,"context_line":"        self.ring_check_interval \u003d int(conf.get(\u0027ring_check_interval\u0027, 15))"},{"line_number":145,"context_line":"        self.next_check \u003d time.time() + self.ring_check_interval"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_40c8b854","line":142,"updated":"2018-10-12 17:59:27.000000000","message":"Should there be a warning or anything if you configure both\n\n batch_sync \u003d true\n sync_method \u003d rsync\n\n? I suppose it\u0027s not like we raise any errors if you configure\n\n rsync_timeout \u003d 60\n sync_method \u003d ssync\n\n... but \u0027batch_sync\u0027 isn\u0027t obviously ssync-specific...","commit_id":"ec94d6b757cb22cff7bc0ec11e68d63078a08c83"}],"swift/obj/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3616d3644ddf9b376e13787d04eeef99f7606e75","unresolved":false,"context_lines":[{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        try:"},{"line_number":680,"context_line":"            enable_fsync \u003d config_true_value(request.headers.get("},{"line_number":681,"context_line":"                \u0027X-Backend-Replication-Fsync-Enabled\u0027, \u0027true\u0027))"},{"line_number":682,"context_line":"            disk_file.write_metadata(metadata, fsync\u003denable_fsync)"},{"line_number":683,"context_line":"        except (DiskFileXattrNotSupported, DiskFileNoSpace):"},{"line_number":684,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_407af824","line":681,"updated":"2018-10-12 17:59:27.000000000","message":"nit: Since we don\u0027t expect this to raise either of the errors below, I might move this up out of the try.","commit_id":"ec94d6b757cb22cff7bc0ec11e68d63078a08c83"}],"swift/obj/ssync_receiver.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3616d3644ddf9b376e13787d04eeef99f7606e75","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                        self.frag_index, self.node_index))"},{"line_number":242,"context_line":"        self.fsync_enabled \u003d config_true_value("},{"line_number":243,"context_line":"            self.request.headers.get(\u0027X-Backend-Replication-Fsync-Enabled\u0027,"},{"line_number":244,"context_line":"                                     \u0027true\u0027))"},{"line_number":245,"context_line":"        utils.validate_device_partition(self.device, self.partition)"},{"line_number":246,"context_line":"        self.diskfile_mgr \u003d self.app._diskfile_router[self.policy]"},{"line_number":247,"context_line":"        if not self.diskfile_mgr.get_dev_path(self.device):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_4000b835","line":244,"updated":"2018-10-12 17:59:27.000000000","message":"Should (can?) we send an ack to the sender that we know how to SYNC? What\u0027s the upgrade story going to look like? Without an ack, I feel like it\u0027ll have to be\n\n\u003e Only enable batch_sync once all object nodes are upgraded to support it.","commit_id":"ec94d6b757cb22cff7bc0ec11e68d63078a08c83"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f9c9e5521abf96b06522547624d323996deb5cdd","unresolved":false,"context_lines":[{"line_number":417,"context_line":"            with exceptions.MessageTimeout("},{"line_number":418,"context_line":"                    self.app.client_timeout, \u0027updates line\u0027):"},{"line_number":419,"context_line":"                line \u003d self.fp.readline(self.app.network_chunk_size)"},{"line_number":420,"context_line":"            if not line or line.strip() \u003d\u003d \u0027:UPDATES: END\u0027:"},{"line_number":421,"context_line":"                break"},{"line_number":422,"context_line":"            # Read first line METHOD PATH of subrequest."},{"line_number":423,"context_line":"            method, path \u003d line.strip().split(\u0027 \u0027, 1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_8f327b5c","line":420,"updated":"2018-10-12 21:51:09.000000000","message":"Hmm... now that I think about it, why is the *sender* driving whether to fsync? Could we get rid of the SYNC method entirely and call\n\n libc.sync()\n\nhere instead? Seems like it\u0027d preclude some of my upgrade concerns. Or are we going to need it later, with the parallel-requests patch?","commit_id":"ec94d6b757cb22cff7bc0ec11e68d63078a08c83"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3616d3644ddf9b376e13787d04eeef99f7606e75","unresolved":false,"context_lines":[{"line_number":447,"context_line":"                    replication_headers.append(header)"},{"line_number":448,"context_line":"                if header \u003d\u003d \u0027content-length\u0027:"},{"line_number":449,"context_line":"                    content_length \u003d int(value)"},{"line_number":450,"context_line":"            if method \u003d\u003d \u0027NOOP\u0027:"},{"line_number":451,"context_line":"                continue"},{"line_number":452,"context_line":"            elif method \u003d\u003d \u0027SYNC\u0027:"},{"line_number":453,"context_line":"                # TODO: Move this to common.utils"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_e02f843b","line":450,"range":{"start_line":450,"start_character":26,"end_line":450,"end_character":30},"updated":"2018-10-12 17:59:27.000000000","message":"??\n\nIs this needed?","commit_id":"ec94d6b757cb22cff7bc0ec11e68d63078a08c83"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f9c9e5521abf96b06522547624d323996deb5cdd","unresolved":false,"context_lines":[{"line_number":447,"context_line":"                    replication_headers.append(header)"},{"line_number":448,"context_line":"                if header \u003d\u003d \u0027content-length\u0027:"},{"line_number":449,"context_line":"                    content_length \u003d int(value)"},{"line_number":450,"context_line":"            if method \u003d\u003d \u0027NOOP\u0027:"},{"line_number":451,"context_line":"                continue"},{"line_number":452,"context_line":"            elif method \u003d\u003d \u0027SYNC\u0027:"},{"line_number":453,"context_line":"                # TODO: Move this to common.utils"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_8fe4bbe0","line":450,"range":{"start_line":450,"start_character":26,"end_line":450,"end_character":30},"in_reply_to":"3f79a3b5_e02f843b","updated":"2018-10-12 21:51:09.000000000","message":"Ah, needed over in https://review.openstack.org/#/c/609991/","commit_id":"ec94d6b757cb22cff7bc0ec11e68d63078a08c83"}]}
