)]}'
{"etc/object-server.conf-sample":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87bdf33d520f08375b4d3e3e5f52b94bb3c9bec3","unresolved":true,"context_lines":[{"line_number":89,"context_line":"#"},{"line_number":90,"context_line":"# Non-durable data files may also get reclaimed if they are older than"},{"line_number":91,"context_line":"# reclaim_age, but not if the time they were written to disk (i.e. mtime) is"},{"line_number":92,"context_line":"# less that commit_window ago. A commit_window greater than zero is strongly"},{"line_number":93,"context_line":"# recommended to avoid unintended reclamation of data files that were about"},{"line_number":94,"context_line":"# to become durable."},{"line_number":95,"context_line":"# commit_window \u003d 60"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"ef378abb_f0b5b68c","line":92,"range":{"start_line":92,"start_character":7,"end_line":92,"end_character":12},"updated":"2021-07-15 18:38:38.000000000","message":"s/that/than/","commit_id":"e95305df4e24c14e50622a02d0003248bc84bc87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e27e0825cb7b58227579368d5a6e122e40b718f","unresolved":true,"context_lines":[{"line_number":89,"context_line":"#"},{"line_number":90,"context_line":"# Non-durable data files may also get reclaimed if they are older than"},{"line_number":91,"context_line":"# reclaim_age, but not if the time they were written to disk (i.e. mtime) is"},{"line_number":92,"context_line":"# less than commit_window seconds ago. A commit_window greater than zero is"},{"line_number":93,"context_line":"# strongly recommended to avoid unintended reclamation of data files that were"},{"line_number":94,"context_line":"# about to become durable."},{"line_number":95,"context_line":"# commit_window \u003d 60.0"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"149e6c4b_35101dda","line":92,"range":{"start_line":92,"start_character":55,"end_line":92,"end_character":72},"updated":"2021-07-16 17:46:30.000000000","message":"Realistically, probably want \u003e10 in practice, but it\u0027s probably not worth getting into the nitty gritty of how much disks can suck here.","commit_id":"808bfc72969c7ccffe7f1d4f1b8328cd95f0b417"}],"swift/obj/diskfile.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26779ad0418eea5e72e9d4525fdc8c4761b87781","unresolved":true,"context_lines":[{"line_number":1081,"context_line":"                  key \u0027obsolete\u0027; a list of files remaining in the directory,"},{"line_number":1082,"context_line":"                  reverse sorted, stored under the key \u0027files\u0027."},{"line_number":1083,"context_line":"        \"\"\""},{"line_number":1084,"context_line":"        def is_reclaimable(timestamp):"},{"line_number":1085,"context_line":"            return (time.time() - float(timestamp)) \u003e self.reclaim_age"},{"line_number":1086,"context_line":""},{"line_number":1087,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fff16a60_ac5b0a11","line":1084,"updated":"2021-07-15 17:32:16.000000000","message":"Off-topic: I feel like this should get pulled up to a method -- it was a little jarring to see self.reclaim_delay getting passed to is_file_older(), but no self.reclaim_age for is_reclaimable().","commit_id":"7ff1dc876729f9c5709306326ee854d2b8ae40a9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26779ad0418eea5e72e9d4525fdc8c4761b87781","unresolved":true,"context_lines":[{"line_number":1102,"context_line":"                results[\u0027ts_info\u0027][\u0027timestamp\u0027]):"},{"line_number":1103,"context_line":"            remove_file(join(hsh_path, results[\u0027ts_info\u0027][\u0027filename\u0027]))"},{"line_number":1104,"context_line":"            files.remove(results.pop(\u0027ts_info\u0027)[\u0027filename\u0027])"},{"line_number":1105,"context_line":"        for file_info in results.get(\u0027possible_reclaim\u0027, []):"},{"line_number":1106,"context_line":"            # stray files are not deleted until reclaim-age"},{"line_number":1107,"context_line":"            filepath \u003d join(hsh_path, file_info[\u0027filename\u0027])"},{"line_number":1108,"context_line":"            if (is_reclaimable(file_info[\u0027timestamp\u0027]) and"}],"source_content_type":"text/x-python","patch_set":1,"id":"6b9abfb6_51409e1b","line":1105,"range":{"start_line":1105,"start_character":38,"end_line":1105,"end_character":54},"updated":"2021-07-15 17:32:16.000000000","message":"So I didn\u0027t remember what all might show up here -- there\u0027s more nuance than I was expecting! This covers nondurable frags, but not necessarily all of them: if frag_prefs were passed in, we may end up \"choosing\" a nondurable which will exclude it. In addition, it also covers any .meta files that have no (durable) .data file.","commit_id":"7ff1dc876729f9c5709306326ee854d2b8ae40a9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26779ad0418eea5e72e9d4525fdc8c4761b87781","unresolved":true,"context_lines":[{"line_number":1106,"context_line":"            # stray files are not deleted until reclaim-age"},{"line_number":1107,"context_line":"            filepath \u003d join(hsh_path, file_info[\u0027filename\u0027])"},{"line_number":1108,"context_line":"            if (is_reclaimable(file_info[\u0027timestamp\u0027]) and"},{"line_number":1109,"context_line":"                    is_file_older(filepath, self.reclaim_delay)):"},{"line_number":1110,"context_line":"                results.setdefault(\u0027obsolete\u0027, []).append(file_info)"},{"line_number":1111,"context_line":"        for file_info in results.get(\u0027obsolete\u0027, []):"},{"line_number":1112,"context_line":"            remove_file(join(hsh_path, file_info[\u0027filename\u0027]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"ad7314b7_14eea104","line":1109,"range":{"start_line":1109,"start_character":20,"end_line":1109,"end_character":33},"updated":"2021-07-15 17:32:16.000000000","message":"Handy that we\u0027ve already got the helper :-)","commit_id":"7ff1dc876729f9c5709306326ee854d2b8ae40a9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87bdf33d520f08375b4d3e3e5f52b94bb3c9bec3","unresolved":true,"context_lines":[{"line_number":709,"context_line":"        self.bytes_per_sync \u003d int(conf.get(\u0027mb_per_sync\u0027, 512)) * 1024 * 1024"},{"line_number":710,"context_line":"        self.mount_check \u003d config_true_value(conf.get(\u0027mount_check\u0027, \u0027true\u0027))"},{"line_number":711,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, DEFAULT_RECLAIM_AGE))"},{"line_number":712,"context_line":"        self.commit_window \u003d int(conf.get("},{"line_number":713,"context_line":"            \u0027commit_window\u0027, DEFAULT_COMMIT_WINDOW))"},{"line_number":714,"context_line":"        replication_concurrency_per_device \u003d conf.get("},{"line_number":715,"context_line":"            \u0027replication_concurrency_per_device\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"0d617e09_434031e4","line":712,"updated":"2021-07-15 18:38:38.000000000","message":"maybe we should insist this is \u003e 0 ?","commit_id":"e95305df4e24c14e50622a02d0003248bc84bc87"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d50065bc6ffbb1b50efc597298282b52c953e153","unresolved":true,"context_lines":[{"line_number":1111,"context_line":"            filepath \u003d join(hsh_path, file_info[\u0027filename\u0027])"},{"line_number":1112,"context_line":"            if (is_reclaimable(file_info[\u0027timestamp\u0027]) and"},{"line_number":1113,"context_line":"                    (file_info.get(\u0027durable\u0027, True) or"},{"line_number":1114,"context_line":"                     is_file_older(filepath, self.commit_window))):"},{"line_number":1115,"context_line":"                results.setdefault(\u0027obsolete\u0027, []).append(file_info)"},{"line_number":1116,"context_line":"        for file_info in results.get(\u0027obsolete\u0027, []):"},{"line_number":1117,"context_line":"            remove_file(join(hsh_path, file_info[\u0027filename\u0027]))"}],"source_content_type":"text/x-python","patch_set":2,"id":"2d25780b_ed62f3b4","line":1114,"updated":"2021-07-15 21:08:56.000000000","message":"so we only stat on reclaimable non-durable\u0027s - and the alternative is data loss.  this is a win.","commit_id":"e95305df4e24c14e50622a02d0003248bc84bc87"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d50065bc6ffbb1b50efc597298282b52c953e153","unresolved":true,"context_lines":[{"line_number":1675,"context_line":"                            continue"},{"line_number":1676,"context_line":"                        info \u003d diskfile_info[diskfile_info_key]"},{"line_number":1677,"context_line":"                        if info_key in info:"},{"line_number":1678,"context_line":"                            # durable key not returned from replicated Diskfile"},{"line_number":1679,"context_line":"                            result[result_key] \u003d info[info_key]"},{"line_number":1680,"context_line":"                    if \u0027ts_data\u0027 not in result:"},{"line_number":1681,"context_line":"                        # file sets that do not include a .data or .ts"}],"source_content_type":"text/x-python","patch_set":2,"id":"a7fb4253_baad5d2d","line":1678,"updated":"2021-07-15 21:08:56.000000000","message":"good call on the default for get(\u0027durable\u0027, True)","commit_id":"e95305df4e24c14e50622a02d0003248bc84bc87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e27e0825cb7b58227579368d5a6e122e40b718f","unresolved":true,"context_lines":[{"line_number":1111,"context_line":"            filepath \u003d join(hsh_path, file_info[\u0027filename\u0027])"},{"line_number":1112,"context_line":"            if (is_reclaimable(file_info[\u0027timestamp\u0027]) and"},{"line_number":1113,"context_line":"                    (file_info.get(\u0027durable\u0027, True) or"},{"line_number":1114,"context_line":"                     self.commit_window \u003c\u003d 0 or"},{"line_number":1115,"context_line":"                     is_file_older(filepath, self.commit_window))):"},{"line_number":1116,"context_line":"                results.setdefault(\u0027obsolete\u0027, []).append(file_info)"},{"line_number":1117,"context_line":"        for file_info in results.get(\u0027obsolete\u0027, []):"}],"source_content_type":"text/x-python","patch_set":4,"id":"29614c7c_1385c293","line":1114,"updated":"2021-07-16 17:46:30.000000000","message":"+1, avoid the stat if we don\u0027t really intend to look at the result.","commit_id":"808bfc72969c7ccffe7f1d4f1b8328cd95f0b417"}],"test/unit/obj/test_diskfile.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87bdf33d520f08375b4d3e3e5f52b94bb3c9bec3","unresolved":true,"context_lines":[{"line_number":1061,"context_line":"            self.assertEqual(\u0027/srv/node\u0027, df_mgr.devices)"},{"line_number":1062,"context_line":"            self.assertEqual(604800, df_mgr.reclaim_age)"},{"line_number":1063,"context_line":"            self.assertEqual(60, df_mgr.commit_window)"},{"line_number":1064,"context_line":"            self.assertTrue(df_mgr.mount_check)"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"        for policy in POLICIES:"},{"line_number":1067,"context_line":"            conf \u003d dict(devices\u003dself.testdir,"}],"source_content_type":"text/x-python","patch_set":2,"id":"a986eff7_64a7153c","line":1064,"updated":"2021-07-15 18:38:38.000000000","message":"there\u0027s a load more assertions that could be made here but out of immediate scope","commit_id":"e95305df4e24c14e50622a02d0003248bc84bc87"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87bdf33d520f08375b4d3e3e5f52b94bb3c9bec3","unresolved":true,"context_lines":[{"line_number":2775,"context_line":"            [(\u0027%s#1.data\u0027 % older, True),"},{"line_number":2776,"context_line":"             (\u0027%s#2.data\u0027 % newer, True),"},{"line_number":2777,"context_line":"             (\u0027%s.meta\u0027 % much_older, False),"},{"line_number":2778,"context_line":"             (\u0027%s.ts\u0027 % much_older, False)]]"},{"line_number":2779,"context_line":"        self._test_cleanup_ondisk_files(scenarios, POLICIES.default,"},{"line_number":2780,"context_line":"                                        reclaim_age\u003d1000, commit_window\u003d60)"},{"line_number":2781,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"e1071402_0da20133","line":2778,"range":{"start_line":2778,"start_character":13,"end_line":2778,"end_character":42},"updated":"2021-07-15 18:38:38.000000000","message":"Note: recently written ts is still cleaned up","commit_id":"e95305df4e24c14e50622a02d0003248bc84bc87"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d50065bc6ffbb1b50efc597298282b52c953e153","unresolved":true,"context_lines":[{"line_number":2775,"context_line":"            [(\u0027%s#1.data\u0027 % older, True),"},{"line_number":2776,"context_line":"             (\u0027%s#2.data\u0027 % newer, True),"},{"line_number":2777,"context_line":"             (\u0027%s.meta\u0027 % much_older, False),"},{"line_number":2778,"context_line":"             (\u0027%s.ts\u0027 % much_older, False)]]"},{"line_number":2779,"context_line":"        self._test_cleanup_ondisk_files(scenarios, POLICIES.default,"},{"line_number":2780,"context_line":"                                        reclaim_age\u003d1000, commit_window\u003d60)"},{"line_number":2781,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"daade6bb_7bea1492","line":2778,"range":{"start_line":2778,"start_character":13,"end_line":2778,"end_character":42},"in_reply_to":"e1071402_0da20133","updated":"2021-07-15 21:08:56.000000000","message":"nice!!!  (probably?)","commit_id":"e95305df4e24c14e50622a02d0003248bc84bc87"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e27e0825cb7b58227579368d5a6e122e40b718f","unresolved":true,"context_lines":[{"line_number":1288,"context_line":"            lambda job, node: ([], node))"},{"line_number":1289,"context_line":"        self.reconstructor.reconstruct()"},{"line_number":1290,"context_line":"        # neither nondurable should be removed yet with default commit_window"},{"line_number":1291,"context_line":"        # because their mtimes are too recent"},{"line_number":1292,"context_line":"        self.assertTrue(os.path.exists(datafile_recent))"},{"line_number":1293,"context_line":"        self.assertTrue(os.path.exists(datafile_older))"},{"line_number":1294,"context_line":"        # and we can still make the nondurables durable"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f1edfad_f3beb029","line":1291,"updated":"2021-07-16 17:46:30.000000000","message":"So we\u0027re relying on the test taking \u003c60s in the gate, yeah? Seems like a reasonable assumption, but I want to call it out as we\u0027ve seen issues with overloaded gate nodes the last few cycles.","commit_id":"808bfc72969c7ccffe7f1d4f1b8328cd95f0b417"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92321bad589667a396203499c7a59c91ddd0fc99","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"            lambda job, node: ([], node))"},{"line_number":1289,"context_line":"        self.reconstructor.reconstruct()"},{"line_number":1290,"context_line":"        # neither nondurable should be removed yet with default commit_window"},{"line_number":1291,"context_line":"        # because their mtimes are too recent"},{"line_number":1292,"context_line":"        self.assertTrue(os.path.exists(datafile_recent))"},{"line_number":1293,"context_line":"        self.assertTrue(os.path.exists(datafile_older))"},{"line_number":1294,"context_line":"        # and we can still make the nondurables durable"}],"source_content_type":"text/x-python","patch_set":4,"id":"1d8a3589_775f88b0","line":1291,"in_reply_to":"1f1edfad_f3beb029","updated":"2021-07-19 10:00:38.000000000","message":"Ack","commit_id":"808bfc72969c7ccffe7f1d4f1b8328cd95f0b417"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e27e0825cb7b58227579368d5a6e122e40b718f","unresolved":true,"context_lines":[{"line_number":1333,"context_line":"        # all suffixes are in sync"},{"line_number":1334,"context_line":"        self.reconstructor._get_suffixes_to_sync \u003d ("},{"line_number":1335,"context_line":"            lambda job, node: ([], node))"},{"line_number":1336,"context_line":"        df_mgr.commit_window \u003d 0"},{"line_number":1337,"context_line":"        with mock.patch("},{"line_number":1338,"context_line":"                \u0027swift.obj.diskfile.is_file_older\u0027) as mock_is_file_older:"},{"line_number":1339,"context_line":"            self.reconstructor.reconstruct()"}],"source_content_type":"text/x-python","patch_set":4,"id":"a77488c4_6b247e6e","line":1336,"updated":"2021-07-16 17:46:30.000000000","message":"Would it be worth having another test that leaves commit_window at the default 60s and uses os.utime() to back-date the mtime?","commit_id":"808bfc72969c7ccffe7f1d4f1b8328cd95f0b417"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92321bad589667a396203499c7a59c91ddd0fc99","unresolved":false,"context_lines":[{"line_number":1333,"context_line":"        # all suffixes are in sync"},{"line_number":1334,"context_line":"        self.reconstructor._get_suffixes_to_sync \u003d ("},{"line_number":1335,"context_line":"            lambda job, node: ([], node))"},{"line_number":1336,"context_line":"        df_mgr.commit_window \u003d 0"},{"line_number":1337,"context_line":"        with mock.patch("},{"line_number":1338,"context_line":"                \u0027swift.obj.diskfile.is_file_older\u0027) as mock_is_file_older:"},{"line_number":1339,"context_line":"            self.reconstructor.reconstruct()"}],"source_content_type":"text/x-python","patch_set":4,"id":"c4452ab7_725277ec","line":1336,"in_reply_to":"a77488c4_6b247e6e","updated":"2021-07-19 10:00:38.000000000","message":"Done","commit_id":"808bfc72969c7ccffe7f1d4f1b8328cd95f0b417"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f4a4f2437503783cdfbedbf6e28e8d3215488691","unresolved":true,"context_lines":[{"line_number":1352,"context_line":"    def test_sync_old_nondurable_before_committed_past_commit_window(self):"},{"line_number":1353,"context_line":"        # verify that a *recently written* nondurable fragment won\u0027t survive"},{"line_number":1354,"context_line":"        # being visited by the reconstructor if its timestamp is older than"},{"line_number":1355,"context_line":"        # reclaim_age and commit_window is zero; this test illustrates the"},{"line_number":1356,"context_line":"        # potential data loss bug that commit_window addresses"},{"line_number":1357,"context_line":"        shutil.rmtree(self.ec_obj_path)"},{"line_number":1358,"context_line":"        ips \u003d utils.whataremyips(self.reconstructor.bind_ip)"}],"source_content_type":"text/x-python","patch_set":5,"id":"8ebabb1d_de5d9aa3","line":1355,"range":{"start_line":1355,"start_character":26,"end_line":1355,"end_character":47},"updated":"2021-07-19 19:58:40.000000000","message":"Copied from the other test; needs updating","commit_id":"9656b85fd8bf5dc2f8f380485d61d47e646d6567"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f12c72a5f0cb9dddd0a15887f00365aa2480b376","unresolved":false,"context_lines":[{"line_number":1352,"context_line":"    def test_sync_old_nondurable_before_committed_past_commit_window(self):"},{"line_number":1353,"context_line":"        # verify that a *recently written* nondurable fragment won\u0027t survive"},{"line_number":1354,"context_line":"        # being visited by the reconstructor if its timestamp is older than"},{"line_number":1355,"context_line":"        # reclaim_age and commit_window is zero; this test illustrates the"},{"line_number":1356,"context_line":"        # potential data loss bug that commit_window addresses"},{"line_number":1357,"context_line":"        shutil.rmtree(self.ec_obj_path)"},{"line_number":1358,"context_line":"        ips \u003d utils.whataremyips(self.reconstructor.bind_ip)"}],"source_content_type":"text/x-python","patch_set":5,"id":"4227c7d5_b00852fd","line":1355,"range":{"start_line":1355,"start_character":26,"end_line":1355,"end_character":47},"in_reply_to":"8ebabb1d_de5d9aa3","updated":"2021-07-19 20:19:06.000000000","message":"Done","commit_id":"9656b85fd8bf5dc2f8f380485d61d47e646d6567"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f4a4f2437503783cdfbedbf6e28e8d3215488691","unresolved":true,"context_lines":[{"line_number":1389,"context_line":"        now \u003d time.time()"},{"line_number":1390,"context_line":"        os.utime(datafile_older, (now - 60.1, now - 60.1))"},{"line_number":1391,"context_line":"        self.reconstructor.reconstruct()"},{"line_number":1392,"context_line":"        # older nondurable will be removed with commit_window \u003d 0"},{"line_number":1393,"context_line":"        self.assertTrue(os.path.exists(datafile_recent))"},{"line_number":1394,"context_line":"        self.assertFalse(os.path.exists(datafile_older))"},{"line_number":1395,"context_line":"        df_recent.writer().commit(ts_recent)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1d107c3b_9a56eb0a","line":1392,"range":{"start_line":1392,"start_character":42,"end_line":1392,"end_character":65},"updated":"2021-07-19 19:58:40.000000000","message":"ditto","commit_id":"9656b85fd8bf5dc2f8f380485d61d47e646d6567"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f12c72a5f0cb9dddd0a15887f00365aa2480b376","unresolved":false,"context_lines":[{"line_number":1389,"context_line":"        now \u003d time.time()"},{"line_number":1390,"context_line":"        os.utime(datafile_older, (now - 60.1, now - 60.1))"},{"line_number":1391,"context_line":"        self.reconstructor.reconstruct()"},{"line_number":1392,"context_line":"        # older nondurable will be removed with commit_window \u003d 0"},{"line_number":1393,"context_line":"        self.assertTrue(os.path.exists(datafile_recent))"},{"line_number":1394,"context_line":"        self.assertFalse(os.path.exists(datafile_older))"},{"line_number":1395,"context_line":"        df_recent.writer().commit(ts_recent)"}],"source_content_type":"text/x-python","patch_set":5,"id":"a95cb006_cf0a7235","line":1392,"range":{"start_line":1392,"start_character":42,"end_line":1392,"end_character":65},"in_reply_to":"1d107c3b_9a56eb0a","updated":"2021-07-19 20:19:06.000000000","message":"Done","commit_id":"9656b85fd8bf5dc2f8f380485d61d47e646d6567"}]}
