)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"09e8a243a2bda4fbddf2be9fd7e9b6a17bfc6a02","unresolved":false,"context_lines":[{"line_number":15,"context_line":"  - audit_all_objects() calls object_audit_location_generator() for each"},{"line_number":16,"context_line":"    policy"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Ida92ba0a5e1e486a4f7132c6539460b38c34ec87"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"df7087c5_95904545","line":18,"updated":"2018-03-14 18:15:17.000000000","message":"Closes-Bug: 1534212","commit_id":"e9a3fde4bb4b5f9c4ed9010ce5c4ab2a6df93656"}],"swift/obj/auditor.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2c00581477de46720d44e637369488ae4b5ba228","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            loc_generators.append("},{"line_number":129,"context_line":"                self.diskfile_router[policy]"},{"line_number":130,"context_line":"                    .object_audit_location_generator("},{"line_number":131,"context_line":"                        policy, device_dirs\u003ddevice_dirs,"},{"line_number":132,"context_line":"                        auditor_type\u003dself.auditor_type))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        all_locs \u003d chain(*loc_generators)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_928ea0ce","line":131,"updated":"2018-03-20 06:35:11.000000000","message":"It\u0027s a shame we have to pass the policy when we are asking each dfmanager (each represents a policy) for a list of locations.","commit_id":"7f5362d8248bd2917580774cfc09f92cb6eb81ce"},{"author":{"_account_id":25251,"name":"Alexandre Lécuyer","email":"alexandre.lecuyer@corp.ovh.com","username":"alecuyer"},"change_message_id":"849436cd07ca62099a9264f5c910a06b9f1a6470","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            loc_generators.append("},{"line_number":129,"context_line":"                self.diskfile_router[policy]"},{"line_number":130,"context_line":"                    .object_audit_location_generator("},{"line_number":131,"context_line":"                        policy, device_dirs\u003ddevice_dirs,"},{"line_number":132,"context_line":"                        auditor_type\u003dself.auditor_type))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        all_locs \u003d chain(*loc_generators)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_cabe8fd3","line":131,"in_reply_to":"df7087c5_928ea0ce","updated":"2018-03-20 15:01:35.000000000","message":"Yes, we do have one instance of dfmanager per policy. in dfrouter:\nself.policy_to_manager[int(policy)] \u003d manager_cls(*args, **kwargs)\n\nHowever, these instances do not hold the policy index. All functions in *dfmanager that need a policy get it as an argument: get_diskfile, get_hashes...\n\nI am not sure how to change this.","commit_id":"7f5362d8248bd2917580774cfc09f92cb6eb81ce"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2c00581477de46720d44e637369488ae4b5ba228","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                        policy, device_dirs\u003ddevice_dirs,"},{"line_number":132,"context_line":"                        auditor_type\u003dself.auditor_type))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        all_locs \u003d chain(*loc_generators)"},{"line_number":135,"context_line":"        for location in all_locs:"},{"line_number":136,"context_line":"            loop_time \u003d time.time()"},{"line_number":137,"context_line":"            self.failsafe_object_audit(location)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_32bd5468","line":134,"updated":"2018-03-20 06:35:11.000000000","message":"does doing a simple chain here end up just doing all one policy\u0027s objects then the next etc? If so do we want to shuffle them up a bit more to spread iops? Like we do with the round_robin_datadir in the db_replicators?\nMaybe something like: http://paste.openstack.org/show/705605/\n\nTho that ^^ is a complete hack and hasn\u0027t actually been tested.. what would be better would be to refactor the db_replicators round_robin_datadir implementation or at least the small snippet part I stole in the paste and make it usable everywhere :)","commit_id":"7f5362d8248bd2917580774cfc09f92cb6eb81ce"},{"author":{"_account_id":25251,"name":"Alexandre Lécuyer","email":"alexandre.lecuyer@corp.ovh.com","username":"alecuyer"},"change_message_id":"849436cd07ca62099a9264f5c910a06b9f1a6470","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                        policy, device_dirs\u003ddevice_dirs,"},{"line_number":132,"context_line":"                        auditor_type\u003dself.auditor_type))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        all_locs \u003d chain(*loc_generators)"},{"line_number":135,"context_line":"        for location in all_locs:"},{"line_number":136,"context_line":"            loop_time \u003d time.time()"},{"line_number":137,"context_line":"            self.failsafe_object_audit(location)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_8a865713","line":134,"in_reply_to":"df7087c5_32bd5468","updated":"2018-03-20 15:01:35.000000000","message":"Yes, it would process one policy\u0027s objects, then the next.\nI will add the round_robin_iter function in utils, and use that. (as well as in db_replicator)","commit_id":"7f5362d8248bd2917580774cfc09f92cb6eb81ce"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"24dda4c7f0df6f5681ad909cb6dc79f060f9cf0d","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                        policy, device_dirs\u003ddevice_dirs,"},{"line_number":132,"context_line":"                        auditor_type\u003dself.auditor_type))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        all_locs \u003d chain(*loc_generators)"},{"line_number":135,"context_line":"        for location in all_locs:"},{"line_number":136,"context_line":"            loop_time \u003d time.time()"},{"line_number":137,"context_line":"            self.failsafe_object_audit(location)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_b5e86016","line":134,"in_reply_to":"df7087c5_8a865713","updated":"2018-03-20 15:23:23.000000000","message":"I don\u0027t know that I\u0027m so worried about it... previous behavior was to do the same, and depending on the value of device_dirs, we\u0027ll be limited to a single spindle anyway (see line 390).","commit_id":"7f5362d8248bd2917580774cfc09f92cb6eb81ce"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1116ca3b757ab58771b91f65687599880e84d833","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        # find a directory that doesn\u0027t correspond to any known policy. This"},{"line_number":128,"context_line":"        # will require a sizable refactor, but currently all diskfile managers"},{"line_number":129,"context_line":"        # can find all diskfile locations regardless of policy -- so for now"},{"line_number":130,"context_line":"        # just use Policy-0\u0027s manager."},{"line_number":131,"context_line":"        all_locs \u003d (self.diskfile_router[POLICIES[0]]"},{"line_number":132,"context_line":"                    .object_audit_location_generator("},{"line_number":133,"context_line":"                        device_dirs\u003ddevice_dirs,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_e0d5af1c","side":"PARENT","line":130,"updated":"2018-03-20 18:55:48.000000000","message":"See this \"TODO\" in all RED - that\u0027s because this patch is AWESOME","commit_id":"9f4910f6b938aa1679571d4787bbdcfa5b5f3a19"}],"swift/obj/diskfile.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"09e8a243a2bda4fbddf2be9fd7e9b6a17bfc6a02","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        # loop through object dirs for all policies"},{"line_number":491,"context_line":"        device_dir \u003d os.path.join(devices, device)"},{"line_number":492,"context_line":"        try:"},{"line_number":493,"context_line":"            dirs \u003d os.listdir(device_dir)"},{"line_number":494,"context_line":"        except OSError as e:"},{"line_number":495,"context_line":"            if logger:"},{"line_number":496,"context_line":"                logger.debug("}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_70ba5f6e","side":"PARENT","line":493,"range":{"start_line":493,"start_character":12,"end_line":493,"end_character":41},"updated":"2018-03-14 18:15:17.000000000","message":"Losing this is the one bit that makes me a little nervous -- will anyone ever notice the bad objects* directories now?","commit_id":"de38b727b475876b4a3e4dcf7dca21de8454722e"},{"author":{"_account_id":25251,"name":"Alexandre Lécuyer","email":"alexandre.lecuyer@corp.ovh.com","username":"alecuyer"},"change_message_id":"623cf64ec9d1c8ec0bcf2b1b7bd65640da6ef5ee","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        # loop through object dirs for all policies"},{"line_number":491,"context_line":"        device_dir \u003d os.path.join(devices, device)"},{"line_number":492,"context_line":"        try:"},{"line_number":493,"context_line":"            dirs \u003d os.listdir(device_dir)"},{"line_number":494,"context_line":"        except OSError as e:"},{"line_number":495,"context_line":"            if logger:"},{"line_number":496,"context_line":"                logger.debug("}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_fe2dc2fd","side":"PARENT","line":493,"range":{"start_line":493,"start_character":12,"end_line":493,"end_character":41},"in_reply_to":"df7087c5_70ba5f6e","updated":"2018-03-15 16:06:04.000000000","message":"Right, because datadir is now an arg, we won\u0027t notice any \"extra\" directory.\n\nDo you think I should keep a listdir() + split_policy_string() here as an \"opportunistic\" check?","commit_id":"de38b727b475876b4a3e4dcf7dca21de8454722e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"09e8a243a2bda4fbddf2be9fd7e9b6a17bfc6a02","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                    \u0027mounted\u0027 if mount_check else \u0027a dir\u0027)"},{"line_number":491,"context_line":"            continue"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        try:"},{"line_number":494,"context_line":"            base, policy \u003d split_policy_string(datadir)"},{"line_number":495,"context_line":"        except PolicyError as e:"},{"line_number":496,"context_line":"            if logger:"},{"line_number":497,"context_line":"                logger.warning(_(\u0027Directory %(directory)r does not map \u0027"},{"line_number":498,"context_line":"                                 \u0027to a valid policy (%(error)s)\u0027) % {"},{"line_number":499,"context_line":"                    \u0027directory\u0027: datadir, \u0027error\u0027: e})"},{"line_number":500,"context_line":"            continue"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        datadir_path \u003d os.path.join(devices, device, datadir)"},{"line_number":503,"context_line":"        if not os.path.exists(datadir_path):"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_30e5c709","line":500,"range":{"start_line":493,"start_character":8,"end_line":500,"end_character":20},"updated":"2018-03-14 18:15:17.000000000","message":"nit: Now that datadir comes in as an arg, this could all move ahead of the listdir and turn into an early exit.\n\nActually, the more I think about it -- this should never get tripped any more, right? The only callers now start with a policy and use that to get the datadir... so split_policy_string should always succeed. Or am I missing something?","commit_id":"e9a3fde4bb4b5f9c4ed9010ce5c4ab2a6df93656"},{"author":{"_account_id":25251,"name":"Alexandre Lécuyer","email":"alexandre.lecuyer@corp.ovh.com","username":"alecuyer"},"change_message_id":"623cf64ec9d1c8ec0bcf2b1b7bd65640da6ef5ee","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                    \u0027mounted\u0027 if mount_check else \u0027a dir\u0027)"},{"line_number":491,"context_line":"            continue"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        try:"},{"line_number":494,"context_line":"            base, policy \u003d split_policy_string(datadir)"},{"line_number":495,"context_line":"        except PolicyError as e:"},{"line_number":496,"context_line":"            if logger:"},{"line_number":497,"context_line":"                logger.warning(_(\u0027Directory %(directory)r does not map \u0027"},{"line_number":498,"context_line":"                                 \u0027to a valid policy (%(error)s)\u0027) % {"},{"line_number":499,"context_line":"                    \u0027directory\u0027: datadir, \u0027error\u0027: e})"},{"line_number":500,"context_line":"            continue"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        datadir_path \u003d os.path.join(devices, device, datadir)"},{"line_number":503,"context_line":"        if not os.path.exists(datadir_path):"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_618b5367","line":500,"range":{"start_line":493,"start_character":8,"end_line":500,"end_character":20},"in_reply_to":"df7087c5_30e5c709","updated":"2018-03-15 16:06:04.000000000","message":"That\u0027s right, existing callers only call the function with a correct datadir (built from a policy).\n\nI can remove that check and call split_policy_string at the beginning. If I do that, I should also remove corresponding checks in test_diskfile.","commit_id":"e9a3fde4bb4b5f9c4ed9010ce5c4ab2a6df93656"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"09e8a243a2bda4fbddf2be9fd7e9b6a17bfc6a02","unresolved":false,"context_lines":[{"line_number":583,"context_line":""},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"def clear_auditor_status(devices, datadir, auditor_type\u003d\"ALL\"):"},{"line_number":586,"context_line":"        device_dirs \u003d listdir(devices)"},{"line_number":587,"context_line":"        for device in device_dirs:"},{"line_number":588,"context_line":"            datadir_path \u003d os.path.join(devices, device, datadir)"},{"line_number":589,"context_line":"            auditor_status \u003d os.path.join("}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_10d1a323","line":586,"updated":"2018-03-14 18:15:17.000000000","message":"nit: dedent","commit_id":"e9a3fde4bb4b5f9c4ed9010ce5c4ab2a6df93656"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1116ca3b757ab58771b91f65687599880e84d833","unresolved":false,"context_lines":[{"line_number":1325,"context_line":""},{"line_number":1326,"context_line":"    def clear_auditor_status(self, policy, auditor_type\u003d\"ALL\"):"},{"line_number":1327,"context_line":"        datadir \u003d get_data_dir(policy)"},{"line_number":1328,"context_line":"        clear_auditor_status(self.devices, datadir, auditor_type)"},{"line_number":1329,"context_line":""},{"line_number":1330,"context_line":"    def object_audit_location_generator(self, policy, device_dirs\u003dNone,"},{"line_number":1331,"context_line":"                                        auditor_type\u003d\"ALL\"):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_40e6db18","line":1328,"updated":"2018-03-20 18:55:48.000000000","message":"I seems correct to me that this interface belongs on the manager\n\nIt would be better if we had some tests in DiskFile that explicitly exercised this interface on multiple policies.","commit_id":"77a1954be879681d8adf4cae5e2cf30704da34f0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1116ca3b757ab58771b91f65687599880e84d833","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"        \"\"\""},{"line_number":1333,"context_line":"        Yield an AuditLocation for all objects stored under device_dirs."},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"        :param policy: the StoragePolicy instance"},{"line_number":1336,"context_line":"        :param device_dirs: directory of target device"},{"line_number":1337,"context_line":"        :param auditor_type: either ALL or ZBF"},{"line_number":1338,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_c0bbcbe2","line":1335,"updated":"2018-03-20 18:55:48.000000000","message":"yes","commit_id":"77a1954be879681d8adf4cae5e2cf30704da34f0"}],"test/unit/obj/test_auditor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1116ca3b757ab58771b91f65687599880e84d833","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.objects_p2 \u003d os.path.join(self.devices, \u0027sda\u0027,"},{"line_number":91,"context_line":"                                       get_data_dir(POLICIES[2]))"},{"line_number":92,"context_line":"        self.objects_2_p2 \u003d os.path.join(self.devices, \u0027sdb\u0027,"},{"line_number":93,"context_line":"                                         get_data_dir(POLICIES[2]))"},{"line_number":94,"context_line":"        os.mkdir(self.objects_p2)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        self.parts \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_a086d712","line":93,"updated":"2018-03-20 18:55:48.000000000","message":"it\u0027s pretty encouraging to me that this class sets up multiple policies and didn\u0027t really have to change very much..","commit_id":"77a1954be879681d8adf4cae5e2cf30704da34f0"}],"test/unit/obj/test_diskfile.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"09e8a243a2bda4fbddf2be9fd7e9b6a17bfc6a02","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            logger \u003d debug_logger()"},{"line_number":407,"context_line":"            loc_generators \u003d []"},{"line_number":408,"context_line":"            datadirs \u003d [\"objects\", \"objects-1\", \"objects-2\", \"objects-99\","},{"line_number":409,"context_line":"                        \"objects-\", \"objects-fud\", \"objects-+1\"]"},{"line_number":410,"context_line":"            for datadir in datadirs:"},{"line_number":411,"context_line":"                loc_generators.append("},{"line_number":412,"context_line":"                    diskfile.object_audit_location_generator("}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_506abbec","line":409,"range":{"start_line":409,"start_character":24,"end_line":409,"end_character":63},"updated":"2018-03-14 18:15:17.000000000","message":"Now that we\u0027re looping over policies and deriving datadirs, I don\u0027t think these names should ever come up in practice...","commit_id":"e9a3fde4bb4b5f9c4ed9010ce5c4ab2a6df93656"},{"author":{"_account_id":25251,"name":"Alexandre Lécuyer","email":"alexandre.lecuyer@corp.ovh.com","username":"alecuyer"},"change_message_id":"623cf64ec9d1c8ec0bcf2b1b7bd65640da6ef5ee","unresolved":false,"context_lines":[{"line_number":375,"context_line":"                                     \"fcd938702024c25fef6c32fef05298eb\"))"},{"line_number":376,"context_line":"            os.makedirs(os.path.join(tmpdir, \"sdp\", \"objects-1\", \"9970\", \"ca5\","},{"line_number":377,"context_line":"                                     \"4a943bc72c2e647c4675923d58cf4ca5\"))"},{"line_number":378,"context_line":"            os.makedirs(os.path.join(tmpdir, \"sdq\", \"objects-2\", \"9971\", \"8eb\","},{"line_number":379,"context_line":"                                     \"fcd938702024c25fef6c32fef05298eb\"))"},{"line_number":380,"context_line":"            os.makedirs(os.path.join(tmpdir, \"sdq\", \"objects-99\", \"9972\","},{"line_number":381,"context_line":"                                     \"8eb\","},{"line_number":382,"context_line":"                                     \"fcd938702024c25fef6c32fef05298eb\"))"},{"line_number":383,"context_line":"            # the bad"},{"line_number":384,"context_line":"            os.makedirs(os.path.join(tmpdir, \"sdq\", \"objects-\", \"1135\","},{"line_number":385,"context_line":"                                     \"6c3\","},{"line_number":386,"context_line":"                                     \"fcd938702024c25fef6c32fef05298eb\"))"},{"line_number":387,"context_line":"            os.makedirs(os.path.join(tmpdir, \"sdq\", \"objects-fud\", \"foo\"))"},{"line_number":388,"context_line":"            os.makedirs(os.path.join(tmpdir, \"sdq\", \"objects-+1\", \"foo\"))"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"            self._make_file(os.path.join(tmpdir, \"sdp\", \"objects\", \"1519\","},{"line_number":391,"context_line":"                                         \"fed\"))"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_61283396","side":"PARENT","line":388,"range":{"start_line":378,"start_character":0,"end_line":388,"end_character":73},"updated":"2018-03-15 16:06:04.000000000","message":"Removing these, as all callers will construct datadir from a valid policy. We cannot have:\n- dirs not mapping to a policy (objects-2, objects-99)\n- invalid dirs (objects-, objects-fud, objects-+1).\n\nIf you think that\u0027s wrong I can put the check back in object_audit_location_generator() around split_policy_string, and restore the tests.","commit_id":"de38b727b475876b4a3e4dcf7dca21de8454722e"},{"author":{"_account_id":25251,"name":"Alexandre Lécuyer","email":"alexandre.lecuyer@corp.ovh.com","username":"alecuyer"},"change_message_id":"623cf64ec9d1c8ec0bcf2b1b7bd65640da6ef5ee","unresolved":false,"context_lines":[{"line_number":522,"context_line":"                \u0027Skipping garbage as it is not a dir\u0027,"},{"line_number":523,"context_line":"            ], debug_lines)"},{"line_number":524,"context_line":"            logger.clear()"},{"line_number":525,"context_line":"            with mock_check_drive(isdir\u003dTrue):"},{"line_number":526,"context_line":"                locations \u003d ["},{"line_number":527,"context_line":"                    (loc.path, loc.device, loc.partition, loc.policy)"},{"line_number":528,"context_line":"                    for loc in diskfile.object_audit_location_generator("},{"line_number":529,"context_line":"                        devices\u003dtmpdir, mount_check\u003dFalse, logger\u003dlogger)]"},{"line_number":530,"context_line":"            debug_lines \u003d logger.get_lines_for_level(\u0027debug\u0027)"},{"line_number":531,"context_line":"            self.assertEqual(["},{"line_number":532,"context_line":"                \u0027Skipping %s: Not a directory\u0027 % os.path.join("},{"line_number":533,"context_line":"                    tmpdir, \"garbage\"),"},{"line_number":534,"context_line":"            ], debug_lines)"},{"line_number":535,"context_line":"            logger.clear()"},{"line_number":536,"context_line":"            with mock_check_drive() as mocks:"},{"line_number":537,"context_line":"                mocks[\u0027ismount\u0027].side_effect \u003d lambda path: ("},{"line_number":538,"context_line":"                    False if path.endswith(\u0027garbage\u0027) else True)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_fc2aaa7c","side":"PARENT","line":535,"range":{"start_line":525,"start_character":0,"end_line":535,"end_character":26},"updated":"2018-03-15 16:06:04.000000000","message":"we\u0027re not doing a listdir() on the device_dir anymore, but constructing the path from the datadir that was passed as an argument","commit_id":"de38b727b475876b4a3e4dcf7dca21de8454722e"}]}
