)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d09f8d296b8dcda6f29301bde9e948cae2eeb0a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Added cache for id mapping manager"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When using a identity driver without providing uuid, and using default"},{"line_number":10,"context_line":"sql id maping driver, if there are lots of users, then it may take"},{"line_number":11,"context_line":"minutes to list users. Adding cache to the id mapping manager can"},{"line_number":12,"context_line":"improve the performance."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1aa78d24_c74a3d27","line":10,"updated":"2016-07-08 15:38:27.000000000","message":"mapping*","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"afaee2c21a2478cdb97c35fa51a6c6385f3ca415","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Added cache for id mapping manager"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When using a identity driver without providing uuid, and using default"},{"line_number":10,"context_line":"sql id maping driver, if there are lots of users, then it may take"},{"line_number":11,"context_line":"minutes to list users. Adding cache to the id mapping manager can"},{"line_number":12,"context_line":"improve the performance."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1aa78d24_b71a917a","line":10,"in_reply_to":"1aa78d24_c74a3d27","updated":"2016-07-11 04:53:14.000000000","message":"fixed.","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"}],"keystone/identity/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7a2520a30620630a9bee8accda99965dac26e986","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        return (driver is not self.driver or not driver.generates_uuids() or"},{"line_number":578,"context_line":"                not driver.is_domain_aware())"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"    @MEMOIZE"},{"line_number":581,"context_line":"    def _set_domain_id_and_mapping_for_single_ref(self, ref, domain_id,"},{"line_number":582,"context_line":"                                                  driver, entity_type, conf):"},{"line_number":583,"context_line":"        LOG.debug(\u0027Local ID: %s\u0027, ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_967bd0bd","line":580,"updated":"2016-06-13 16:09:14.000000000","message":"What if the entity is updated? Shouldn\u0027t this be invalidated?","commit_id":"ee10836e4c864ec215d0f975ec9a09cd1619d372"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d05f5a68be1415dd4896748eaa18b4fb30e8f541","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        return (driver is not self.driver or not driver.generates_uuids() or"},{"line_number":578,"context_line":"                not driver.is_domain_aware())"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"    @MEMOIZE"},{"line_number":581,"context_line":"    def _set_domain_id_and_mapping_for_single_ref(self, ref, domain_id,"},{"line_number":582,"context_line":"                                                  driver, entity_type, conf):"},{"line_number":583,"context_line":"        LOG.debug(\u0027Local ID: %s\u0027, ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_d8d3be36","line":580,"in_reply_to":"7aa08908_967bd0bd","updated":"2016-06-13 19:20:33.000000000","message":"The cache key here won\u0027t cache across processes. You should only memoize a function that accepts data arguments. I think driver and conf are a no go here.","commit_id":"ee10836e4c864ec215d0f975ec9a09cd1619d372"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d8a33c76e5230a3033d90337c5338ce5989cb361","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"        # or from backend driver."},{"line_number":1320,"context_line":"        local_entity \u003d self.driver.get_id_mapping(public_id)"},{"line_number":1321,"context_line":"        self.driver.delete_id_mapping(public_id)"},{"line_number":1322,"context_line":"        if local_entity:"},{"line_number":1323,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1324,"context_line":"                                           local_entity[\u0027local_id\u0027],"},{"line_number":1325,"context_line":"                                           local_entity[\u0027entity_type\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_cf00c169","line":1322,"updated":"2016-07-01 13:38:49.000000000","message":"Don\u0027t check for this. Just delete it to avoid a race condition.","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"2a89de5d4a2643807a1adf44c77e1cab39b0312d","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"        # or from backend driver."},{"line_number":1320,"context_line":"        local_entity \u003d self.driver.get_id_mapping(public_id)"},{"line_number":1321,"context_line":"        self.driver.delete_id_mapping(public_id)"},{"line_number":1322,"context_line":"        if local_entity:"},{"line_number":1323,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1324,"context_line":"                                           local_entity[\u0027local_id\u0027],"},{"line_number":1325,"context_line":"                                           local_entity[\u0027entity_type\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_50d665f1","line":1322,"in_reply_to":"1aa78d24_09effcb0","updated":"2016-07-07 06:12:16.000000000","message":"Done","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b3fe8bea8a262a5964115e5b42c62e649429c3dc","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"        # or from backend driver."},{"line_number":1320,"context_line":"        local_entity \u003d self.driver.get_id_mapping(public_id)"},{"line_number":1321,"context_line":"        self.driver.delete_id_mapping(public_id)"},{"line_number":1322,"context_line":"        if local_entity:"},{"line_number":1323,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1324,"context_line":"                                           local_entity[\u0027local_id\u0027],"},{"line_number":1325,"context_line":"                                           local_entity[\u0027entity_type\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_09effcb0","line":1322,"in_reply_to":"1aa78d24_7c6fae92","updated":"2016-07-05 15:30:47.000000000","message":"I see no reason to do a get here. Why not just invalidate the cache? A cache request is cheaper than a database request anyway.","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"16c52dcc265ac13f5de880d7c4343136b6244ea1","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"        # or from backend driver."},{"line_number":1320,"context_line":"        local_entity \u003d self.driver.get_id_mapping(public_id)"},{"line_number":1321,"context_line":"        self.driver.delete_id_mapping(public_id)"},{"line_number":1322,"context_line":"        if local_entity:"},{"line_number":1323,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1324,"context_line":"                                           local_entity[\u0027local_id\u0027],"},{"line_number":1325,"context_line":"                                           local_entity[\u0027entity_type\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_7c6fae92","line":1322,"in_reply_to":"3aaa91ec_cf00c169","updated":"2016-07-04 02:33:31.000000000","message":"For this, there is a condition, that, the local_entity is None, if the public_id is not exist in the cache. So we need to check whether the local_entity is empty here.\n\n\nFor the race condition, as the cache invalidate operation calls the delete of the cache, and the delete is idempotent (can be called multiple times, or on a non-existent key, safely).\nplease refer to: https://github.com/thruflo/dogpile.cache/blob/master/dogpile/cache/region.py#L814\n\n\nSo it safely to invalidate the local_entity even if it\u0027s invalidated before.","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d8a33c76e5230a3033d90337c5338ce5989cb361","unresolved":false,"context_lines":[{"line_number":1325,"context_line":"                                           local_entity[\u0027entity_type\u0027])"},{"line_number":1326,"context_line":""},{"line_number":1327,"context_line":"        # Delete the key of entity from cache"},{"line_number":1328,"context_line":"        local_entity \u003d self.get_id_mapping.get(self, public_id)"},{"line_number":1329,"context_line":"        if local_entity:"},{"line_number":1330,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1331,"context_line":"                                           local_entity[\u0027local_id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_af28d5ef","line":1328,"updated":"2016-07-01 13:38:49.000000000","message":"Same here","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d8a33c76e5230a3033d90337c5338ce5989cb361","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"                                           local_entity[\u0027entity_type\u0027])"},{"line_number":1333,"context_line":"        self.get_id_mapping.invalidate(self, public_id)"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"    def purge_mappings(self, purge_filter):"},{"line_number":1336,"context_line":"        self.driver.purge_mappings(purge_filter)"},{"line_number":1337,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":1338,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_0f72c9e3","line":1335,"updated":"2016-07-01 13:38:49.000000000","message":"So you want to delete everything from this regions even if there is a purge filter? I\u0027m not sure how you can account for the filter and only invalidate part of the region, but I\u0027m curious about the impact.","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"2a89de5d4a2643807a1adf44c77e1cab39b0312d","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"                                           local_entity[\u0027entity_type\u0027])"},{"line_number":1333,"context_line":"        self.get_id_mapping.invalidate(self, public_id)"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"    def purge_mappings(self, purge_filter):"},{"line_number":1336,"context_line":"        self.driver.purge_mappings(purge_filter)"},{"line_number":1337,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":1338,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_70dba11b","line":1335,"in_reply_to":"1aa78d24_89100caa","updated":"2016-07-07 06:12:16.000000000","message":"Done","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b3fe8bea8a262a5964115e5b42c62e649429c3dc","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"                                           local_entity[\u0027entity_type\u0027])"},{"line_number":1333,"context_line":"        self.get_id_mapping.invalidate(self, public_id)"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"    def purge_mappings(self, purge_filter):"},{"line_number":1336,"context_line":"        self.driver.purge_mappings(purge_filter)"},{"line_number":1337,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":1338,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_89100caa","line":1335,"in_reply_to":"1aa78d24_dcc4e241","updated":"2016-07-05 15:30:47.000000000","message":"If you are doing this on purpose you need to explain why in a NOTE comment. Otherwise it looks like a bug.","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"16c52dcc265ac13f5de880d7c4343136b6244ea1","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"                                           local_entity[\u0027entity_type\u0027])"},{"line_number":1333,"context_line":"        self.get_id_mapping.invalidate(self, public_id)"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"    def purge_mappings(self, purge_filter):"},{"line_number":1336,"context_line":"        self.driver.purge_mappings(purge_filter)"},{"line_number":1337,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":1338,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_dcc4e241","line":1335,"in_reply_to":"3aaa91ec_0f72c9e3","updated":"2016-07-04 02:33:31.000000000","message":"Currently the purge is only used by the client, which can purge the mapping base on domain_id/public_id/local_id/type, or a combination of the above ids.\n\n\nplease refer to: \nhttps://github.com/openstack/keystone/blob/master/keystone/cmd/cli.py#L572\n\n\nif we invalidate part of the region based on the filter, it will be become a little complex for the code to implemented.\n\n\nAs it will be very rare condition for user to purge mapping using client. and invalidate all cache, just like become to the situation like no cache used or restart keystone, and after some operation about the id mappings, it will be cache again.\n\n\nSo comparing to the complexity of the implementation based on the purge filter, I think it\u0027s acceptable to invalidate all cache.","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d09f8d296b8dcda6f29301bde9e948cae2eeb0a","unresolved":false,"context_lines":[{"line_number":1320,"context_line":"        if local_entity:"},{"line_number":1321,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1322,"context_line":"                                           local_entity[\u0027local_id\u0027],"},{"line_number":1323,"context_line":"                                           local_entity[\u0027entity_type\u0027])"},{"line_number":1324,"context_line":"        self.get_id_mapping.invalidate(self, public_id)"},{"line_number":1325,"context_line":""},{"line_number":1326,"context_line":"    def purge_mappings(self, purge_filter):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_8798356c","line":1323,"updated":"2016-07-08 15:38:27.000000000","message":"These arguments can\u0027t be passed as kwargs can they? \n\n    self._get_public_id.invalidate(self, domain_id\u003dlocal_entity[\u0027domain_id\u0027], ...)","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"afaee2c21a2478cdb97c35fa51a6c6385f3ca415","unresolved":false,"context_lines":[{"line_number":1320,"context_line":"        if local_entity:"},{"line_number":1321,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1322,"context_line":"                                           local_entity[\u0027local_id\u0027],"},{"line_number":1323,"context_line":"                                           local_entity[\u0027entity_type\u0027])"},{"line_number":1324,"context_line":"        self.get_id_mapping.invalidate(self, public_id)"},{"line_number":1325,"context_line":""},{"line_number":1326,"context_line":"    def purge_mappings(self, purge_filter):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_97c4b540","line":1323,"in_reply_to":"1aa78d24_8798356c","updated":"2016-07-11 04:53:14.000000000","message":"it seems that the dogpile.cache doesn\u0027t accept kwargs:\nhttps://github.com/thruflo/dogpile.cache/blob/master/dogpile/cache/util.py#L79","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"077fa45418faa3f478467caa07c90b3e5871b0f9","unresolved":false,"context_lines":[{"line_number":1320,"context_line":"        if local_entity:"},{"line_number":1321,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1322,"context_line":"                                           local_entity[\u0027local_id\u0027],"},{"line_number":1323,"context_line":"                                           local_entity[\u0027entity_type\u0027])"},{"line_number":1324,"context_line":"        self.get_id_mapping.invalidate(self, public_id)"},{"line_number":1325,"context_line":""},{"line_number":1326,"context_line":"    def purge_mappings(self, purge_filter):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_36d3233a","line":1323,"in_reply_to":"1aa78d24_97c4b540","updated":"2016-07-11 15:51:18.000000000","message":"Ah ha - that\u0027s right.","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d09f8d296b8dcda6f29301bde9e948cae2eeb0a","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"    def purge_mappings(self, purge_filter):"},{"line_number":1327,"context_line":"        # Purge mapping is rarely used and only used by the command client,"},{"line_number":1328,"context_line":"        # it\u0027s quite complex to invalidate part of the cache based on the purge"},{"line_number":1329,"context_line":"        # filters, so here invalidate the whole cache when purging mappings."},{"line_number":1330,"context_line":"        self.driver.purge_mappings(purge_filter)"},{"line_number":1331,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":1332,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_87aaf583","line":1329,"updated":"2016-07-08 15:38:27.000000000","message":"How often do we expect people to purge mappings? This seems like an infrequent operation.","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"582969bac2b650c96ea622c539b724758fbfb57f","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"    def purge_mappings(self, purge_filter):"},{"line_number":1327,"context_line":"        # Purge mapping is rarely used and only used by the command client,"},{"line_number":1328,"context_line":"        # it\u0027s quite complex to invalidate part of the cache based on the purge"},{"line_number":1329,"context_line":"        # filters, so here invalidate the whole cache when purging mappings."},{"line_number":1330,"context_line":"        self.driver.purge_mappings(purge_filter)"},{"line_number":1331,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":1332,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_473271a8","line":1329,"in_reply_to":"1aa78d24_57b08d8b","updated":"2016-07-11 20:33:34.000000000","message":"Why is it a dangerous operation? We guarantee to be able to recreate the same mapping....is there something about you changes that makes this more dangerous?","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"afaee2c21a2478cdb97c35fa51a6c6385f3ca415","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"    def purge_mappings(self, purge_filter):"},{"line_number":1327,"context_line":"        # Purge mapping is rarely used and only used by the command client,"},{"line_number":1328,"context_line":"        # it\u0027s quite complex to invalidate part of the cache based on the purge"},{"line_number":1329,"context_line":"        # filters, so here invalidate the whole cache when purging mappings."},{"line_number":1330,"context_line":"        self.driver.purge_mappings(purge_filter)"},{"line_number":1331,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":1332,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_57b08d8b","line":1329,"in_reply_to":"1aa78d24_87aaf583","updated":"2016-07-11 04:53:14.000000000","message":"Yes, it\u0027s an infrequent operation. It\u0027s quite a dangerous operation. As my understanding, only when some identity doesn\u0027t use anymore, then the purge operation is used to avoid delete them one by one, such as if there are some domain is not used any more, you can purge the mapping based on the domain_id.","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d09f8d296b8dcda6f29301bde9e948cae2eeb0a","unresolved":false,"context_lines":[{"line_number":1328,"context_line":"        # it\u0027s quite complex to invalidate part of the cache based on the purge"},{"line_number":1329,"context_line":"        # filters, so here invalidate the whole cache when purging mappings."},{"line_number":1330,"context_line":"        self.driver.purge_mappings(purge_filter)"},{"line_number":1331,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":1332,"context_line":""},{"line_number":1333,"context_line":""},{"line_number":1334,"context_line":"@versionutils.deprecated("}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_672a692e","line":1331,"updated":"2016-07-08 15:38:27.000000000","message":"Can\u0027t this be done with: \n\n    self.get_id_mapping.invalidate(self, public_id)\n\nOr don\u0027t we do it that way because we don\u0027t have the public_id available?","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"afaee2c21a2478cdb97c35fa51a6c6385f3ca415","unresolved":false,"context_lines":[{"line_number":1328,"context_line":"        # it\u0027s quite complex to invalidate part of the cache based on the purge"},{"line_number":1329,"context_line":"        # filters, so here invalidate the whole cache when purging mappings."},{"line_number":1330,"context_line":"        self.driver.purge_mappings(purge_filter)"},{"line_number":1331,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":1332,"context_line":""},{"line_number":1333,"context_line":""},{"line_number":1334,"context_line":"@versionutils.deprecated("}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_d7491d90","line":1331,"in_reply_to":"1aa78d24_672a692e","updated":"2016-07-11 04:53:14.000000000","message":"Here the public_id is not available, because the purge filter can be one of \"domain_id/public_id/local_id/identity type\", or a combination of them.\nSo it\u0027s very hard to retrieve the public id based on the purge_filters.","commit_id":"b474a95eafbbdb540e58c03545bb3e1b197709d1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0157ee930a639a35742a496f28ad58dec4ab3a4d","unresolved":false,"context_lines":[{"line_number":1289,"context_line":"        super(MappingManager, self).__init__(CONF.identity_mapping.driver)"},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    @MEMOIZE_ID_MAPPING"},{"line_number":1292,"context_line":"    def _get_public_id(self, domain_id\u003dNone, local_id\u003dNone, entity_type\u003dNone):"},{"line_number":1293,"context_line":"        return self.driver.get_public_id({\u0027domain_id\u0027: domain_id,"},{"line_number":1294,"context_line":"                                          \u0027local_id\u0027: local_id,"},{"line_number":1295,"context_line":"                                          \u0027entity_type\u0027: entity_type})"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_ff18f51f","line":1292,"range":{"start_line":1292,"start_character":24,"end_line":1292,"end_character":78},"updated":"2016-07-13 03:39:45.000000000","message":"These should not be kwargs but be positional since they are expected to always be present. This also poses less issues with the keymangler (convert args/object/etc to memcache key) being generally unhappy about the use of kwargs.","commit_id":"6d39f2f6682b424f1a640485589da00700b883ba"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"21c5d122e4e95f2b654673cd56f933289a6df32b","unresolved":false,"context_lines":[{"line_number":1289,"context_line":"        super(MappingManager, self).__init__(CONF.identity_mapping.driver)"},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    @MEMOIZE_ID_MAPPING"},{"line_number":1292,"context_line":"    def _get_public_id(self, domain_id\u003dNone, local_id\u003dNone, entity_type\u003dNone):"},{"line_number":1293,"context_line":"        return self.driver.get_public_id({\u0027domain_id\u0027: domain_id,"},{"line_number":1294,"context_line":"                                          \u0027local_id\u0027: local_id,"},{"line_number":1295,"context_line":"                                          \u0027entity_type\u0027: entity_type})"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_6bc5305a","line":1292,"range":{"start_line":1292,"start_character":24,"end_line":1292,"end_character":78},"in_reply_to":"1aa78d24_76225d53","updated":"2016-07-18 05:29:20.000000000","message":"fixed","commit_id":"6d39f2f6682b424f1a640485589da00700b883ba"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ec4bc51bd2af761463e72264977bb95e2afb7bb8","unresolved":false,"context_lines":[{"line_number":1289,"context_line":"        super(MappingManager, self).__init__(CONF.identity_mapping.driver)"},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    @MEMOIZE_ID_MAPPING"},{"line_number":1292,"context_line":"    def _get_public_id(self, domain_id\u003dNone, local_id\u003dNone, entity_type\u003dNone):"},{"line_number":1293,"context_line":"        return self.driver.get_public_id({\u0027domain_id\u0027: domain_id,"},{"line_number":1294,"context_line":"                                          \u0027local_id\u0027: local_id,"},{"line_number":1295,"context_line":"                                          \u0027entity_type\u0027: entity_type})"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_76225d53","line":1292,"range":{"start_line":1292,"start_character":24,"end_line":1292,"end_character":78},"in_reply_to":"1aa78d24_ff18f51f","updated":"2016-07-13 12:09:30.000000000","message":"++","commit_id":"6d39f2f6682b424f1a640485589da00700b883ba"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ec4bc51bd2af761463e72264977bb95e2afb7bb8","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"    def delete_id_mapping(self, public_id):"},{"line_number":1317,"context_line":"        self.driver.delete_id_mapping(public_id)"},{"line_number":1318,"context_line":"        # Delete the key of entity from cache"},{"line_number":1319,"context_line":"        local_entity \u003d self.get_id_mapping.get(self, public_id)"},{"line_number":1320,"context_line":"        if local_entity:"},{"line_number":1321,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1322,"context_line":"                                           local_entity[\u0027local_id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_d664f149","line":1319,"updated":"2016-07-13 12:09:30.000000000","message":"Will this work correctly if you\u0027ve already deleted it from the backend? It seems to me that this will only work when the cache for get_id_mapping has a value, but when it doesn\u0027t there still may be a cached value in _get_public_id that need invalidated.","commit_id":"6d39f2f6682b424f1a640485589da00700b883ba"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"21c5d122e4e95f2b654673cd56f933289a6df32b","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"    def delete_id_mapping(self, public_id):"},{"line_number":1317,"context_line":"        self.driver.delete_id_mapping(public_id)"},{"line_number":1318,"context_line":"        # Delete the key of entity from cache"},{"line_number":1319,"context_line":"        local_entity \u003d self.get_id_mapping.get(self, public_id)"},{"line_number":1320,"context_line":"        if local_entity:"},{"line_number":1321,"context_line":"            self._get_public_id.invalidate(self, local_entity[\u0027domain_id\u0027],"},{"line_number":1322,"context_line":"                                           local_entity[\u0027local_id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_cba09ca8","line":1319,"in_reply_to":"1aa78d24_d664f149","updated":"2016-07-18 05:29:20.000000000","message":"fixed","commit_id":"6d39f2f6682b424f1a640485589da00700b883ba"}],"keystone/identity/mapping_backends/sql.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"80b55420a7eee01ba2ed0f53572413e2193968ab","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone.identity.mapping_backends import mapping as identity_mapping"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def _key_generate_to_str(s):"},{"line_number":28,"context_line":"    try:"},{"line_number":29,"context_line":"        if six.PY2 and isinstance(s, dict):"},{"line_number":30,"context_line":"            return str({k: v.encode(\u0027utf-8\u0027) for k, v in s.items()})"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_9aab8a75","line":27,"updated":"2016-06-15 12:24:47.000000000","message":"You should not be doing all of this yourself. Use our existing cache code as a base.","commit_id":"80614f64f69888dc6a4353f77ca578193131c5c5"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"50bacaaab4a5c60c1f20563bc5a67693ae41852d","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone.identity.mapping_backends import mapping as identity_mapping"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def _key_generate_to_str(s):"},{"line_number":28,"context_line":"    try:"},{"line_number":29,"context_line":"        if six.PY2 and isinstance(s, dict):"},{"line_number":30,"context_line":"            return str({k: v.encode(\u0027utf-8\u0027) for k, v in s.items()})"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a9d85d2_a47466fd","line":27,"in_reply_to":"7aa08908_9aab8a75","updated":"2016-06-20 08:37:48.000000000","message":"Done","commit_id":"80614f64f69888dc6a4353f77ca578193131c5c5"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"6a62b9b903b180e5730c2775149170b3a2fdddbe","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone.identity.mapping_backends import mapping as identity_mapping"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def _key_generate_to_str(s):"},{"line_number":28,"context_line":"    try:"},{"line_number":29,"context_line":"        if six.PY2 and isinstance(s, dict):"},{"line_number":30,"context_line":"            return str({k: v.encode(\u0027utf-8\u0027) for k, v in s.items()})"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_d6710de0","line":27,"in_reply_to":"7aa08908_9aab8a75","updated":"2016-06-17 00:00:04.000000000","message":"I add this functions, is because when setting cache items, the domain_id/local_id/entity_type in entity dict are ASCII, but when I usepublic_id to get the entity from database when delete_id_mapping, the string domain_id/local_id/entity_type in entity dict are Unicode, so if I don\u0027t add this function \"_key_generate_to_str\" to cache region, in the circumstance above, two different key will be generated.\n\nCould you give me some advice about this problem?","commit_id":"80614f64f69888dc6a4353f77ca578193131c5c5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"80b55420a7eee01ba2ed0f53572413e2193968ab","unresolved":false,"context_lines":[{"line_number":27,"context_line":"def _key_generate_to_str(s):"},{"line_number":28,"context_line":"    try:"},{"line_number":29,"context_line":"        if six.PY2 and isinstance(s, dict):"},{"line_number":30,"context_line":"            return str({k: v.encode(\u0027utf-8\u0027) for k, v in s.items()})"},{"line_number":31,"context_line":"        return str(s)"},{"line_number":32,"context_line":"    except UnicodeEncodeError:"},{"line_number":33,"context_line":"        return s.encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_5a24820d","line":30,"updated":"2016-06-15 12:24:47.000000000","message":"Also, dict keys are not guaranteed in order. A better approach to have a consistent cache key is to just use .items() and make an ordered tuple.","commit_id":"80614f64f69888dc6a4353f77ca578193131c5c5"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"50bacaaab4a5c60c1f20563bc5a67693ae41852d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"def _key_generate_to_str(s):"},{"line_number":28,"context_line":"    try:"},{"line_number":29,"context_line":"        if six.PY2 and isinstance(s, dict):"},{"line_number":30,"context_line":"            return str({k: v.encode(\u0027utf-8\u0027) for k, v in s.items()})"},{"line_number":31,"context_line":"        return str(s)"},{"line_number":32,"context_line":"    except UnicodeEncodeError:"},{"line_number":33,"context_line":"        return s.encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a9d85d2_0460da34","line":30,"in_reply_to":"7aa08908_5a24820d","updated":"2016-06-20 08:37:48.000000000","message":"For this changes, I meant to fix a string encoding problem that when string stored in a database, then get it out, the string encode format may changed.\n\nWith the latest code, I just wipe out all cache, it may not be the solution with best performance, but it\u0027s the simplest way to avoid the encoding problem.\n\nDone","commit_id":"80614f64f69888dc6a4353f77ca578193131c5c5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"80b55420a7eee01ba2ed0f53572413e2193968ab","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            except sql.NotFound:"},{"line_number":92,"context_line":"                return None"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def get_id_mapping(self, public_id):"},{"line_number":95,"context_line":"        with sql.session_for_read() as session:"},{"line_number":96,"context_line":"            mapping_ref \u003d session.query(IDMapping).get(public_id)"},{"line_number":97,"context_line":"            if mapping_ref:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_fa460e7a","line":94,"updated":"2016-06-15 12:24:47.000000000","message":"Why is this not cached?","commit_id":"80614f64f69888dc6a4353f77ca578193131c5c5"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"50bacaaab4a5c60c1f20563bc5a67693ae41852d","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            except sql.NotFound:"},{"line_number":92,"context_line":"                return None"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def get_id_mapping(self, public_id):"},{"line_number":95,"context_line":"        with sql.session_for_read() as session:"},{"line_number":96,"context_line":"            mapping_ref \u003d session.query(IDMapping).get(public_id)"},{"line_number":97,"context_line":"            if mapping_ref:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a9d85d2_445ae284","line":94,"in_reply_to":"7aa08908_fa460e7a","updated":"2016-06-20 08:37:48.000000000","message":"Done","commit_id":"80614f64f69888dc6a4353f77ca578193131c5c5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"80b55420a7eee01ba2ed0f53572413e2193968ab","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            if \u0027domain_id\u0027 in purge_filter:"},{"line_number":130,"context_line":"                query \u003d query.filter_by(domain_id\u003dpurge_filter[\u0027domain_id\u0027])"},{"line_number":131,"context_line":"            if \u0027public_id\u0027 in purge_filter:"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"                query \u003d query.filter_by(public_id\u003dpurge_filter[\u0027public_id\u0027])"},{"line_number":134,"context_line":"            if \u0027local_id\u0027 in purge_filter:"},{"line_number":135,"context_line":"                query \u003d query.filter_by(local_id\u003dpurge_filter[\u0027local_id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_1ab4ba80","line":132,"updated":"2016-06-15 12:24:47.000000000","message":"unrelated change","commit_id":"80614f64f69888dc6a4353f77ca578193131c5c5"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"50bacaaab4a5c60c1f20563bc5a67693ae41852d","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            if \u0027domain_id\u0027 in purge_filter:"},{"line_number":130,"context_line":"                query \u003d query.filter_by(domain_id\u003dpurge_filter[\u0027domain_id\u0027])"},{"line_number":131,"context_line":"            if \u0027public_id\u0027 in purge_filter:"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"                query \u003d query.filter_by(public_id\u003dpurge_filter[\u0027public_id\u0027])"},{"line_number":134,"context_line":"            if \u0027local_id\u0027 in purge_filter:"},{"line_number":135,"context_line":"                query \u003d query.filter_by(local_id\u003dpurge_filter[\u0027local_id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a9d85d2_245fd673","line":132,"in_reply_to":"7aa08908_1ab4ba80","updated":"2016-06-20 08:37:48.000000000","message":"Done","commit_id":"80614f64f69888dc6a4353f77ca578193131c5c5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"08f33bdc03c29e902323c57b5ca1a9a8980d66cb","unresolved":false,"context_lines":[{"line_number":46,"context_line":"@dependency.requires(\u0027id_generator_api\u0027)"},{"line_number":47,"context_line":"class Mapping(base.MappingDriverV8):"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":50,"context_line":"        super(Mapping, self).__init__(*args, **kwargs)"},{"line_number":51,"context_line":"        cache.configure_cache()"},{"line_number":52,"context_line":"        cache.configure_cache(region\u003dID_MAPPING_REGION)"},{"line_number":53,"context_line":"        cache.apply_invalidation_patch("},{"line_number":54,"context_line":"            region\u003dID_MAPPING_REGION,"},{"line_number":55,"context_line":"            region_name\u003dID_MAPPING_REGION.name)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @MEMOIZE"},{"line_number":58,"context_line":"    def get_public_id(self, local_entity):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_bc12a256","line":55,"range":{"start_line":49,"start_character":1,"end_line":55,"end_character":47},"updated":"2016-06-28 05:30:41.000000000","message":"don\u0027t initialize this here, this is something that should happen in the manager not in the driver itself.","commit_id":"db40ad0edf91a0e773738fa904a2d789dc76f89b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"08f33bdc03c29e902323c57b5ca1a9a8980d66cb","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                # NOTE(morganfainberg): There is nothing to delete and nothing"},{"line_number":104,"context_line":"                # to do."},{"line_number":105,"context_line":"                pass"},{"line_number":106,"context_line":"        ID_MAPPING_REGION.invalidate()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def purge_mappings(self, purge_filter):"},{"line_number":109,"context_line":"        with sql.session_for_write() as session:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_dc304eeb","line":106,"range":{"start_line":106,"start_character":7,"end_line":106,"end_character":38},"updated":"2016-06-28 05:30:41.000000000","message":"are we really invalidating *all* the cache if a single public id is killed? I think we can be a bit more surgical about this.","commit_id":"db40ad0edf91a0e773738fa904a2d789dc76f89b"}],"keystone/tests/unit/test_backend_id_mapping_sql.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d3531d77c4b2f57c40323680b7635d7a35f2076a","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        self.id_mapping_api.delete_id_mapping(public_id1)"},{"line_number":119,"context_line":"        self.id_mapping_api.delete_id_mapping(public_id2)"},{"line_number":120,"context_line":"        self.id_mapping_api.delete_id_mapping(public_id3)"},{"line_number":121,"context_line":"        self.assertIsNone(self.id_mapping_api.get_public_id(local_entity1))"},{"line_number":122,"context_line":"        self.assertIsNone(self.id_mapping_api.get_public_id(local_entity2))"},{"line_number":123,"context_line":"        self.assertIsNone(self.id_mapping_api.get_public_id(local_entity3))"},{"line_number":124,"context_line":"        self.assertThat(mapping_sql.list_id_mappings(),"},{"line_number":125,"context_line":"                        matchers.HasLength(initial_mappings))"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_8b1ba472","line":123,"range":{"start_line":121,"start_character":0,"end_line":123,"end_character":75},"updated":"2016-07-06 14:57:45.000000000","message":"I figured out that this check is required because of cache, but only because this patch is about cache. Could you please add a comment describing why you do it?","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"2a89de5d4a2643807a1adf44c77e1cab39b0312d","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        self.id_mapping_api.delete_id_mapping(public_id1)"},{"line_number":119,"context_line":"        self.id_mapping_api.delete_id_mapping(public_id2)"},{"line_number":120,"context_line":"        self.id_mapping_api.delete_id_mapping(public_id3)"},{"line_number":121,"context_line":"        self.assertIsNone(self.id_mapping_api.get_public_id(local_entity1))"},{"line_number":122,"context_line":"        self.assertIsNone(self.id_mapping_api.get_public_id(local_entity2))"},{"line_number":123,"context_line":"        self.assertIsNone(self.id_mapping_api.get_public_id(local_entity3))"},{"line_number":124,"context_line":"        self.assertThat(mapping_sql.list_id_mappings(),"},{"line_number":125,"context_line":"                        matchers.HasLength(initial_mappings))"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_b007c980","line":123,"range":{"start_line":121,"start_character":0,"end_line":123,"end_character":75},"in_reply_to":"1aa78d24_8b1ba472","updated":"2016-07-07 06:12:16.000000000","message":"Done","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d3531d77c4b2f57c40323680b7635d7a35f2076a","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                        matchers.HasLength(initial_mappings + 1))"},{"line_number":141,"context_line":"        self.assertEqual("},{"line_number":142,"context_line":"            public_id, self.id_mapping_api.get_public_id(local_entity))"},{"line_number":143,"context_line":"        self.id_mapping_api.delete_id_mapping(public_id)"},{"line_number":144,"context_line":"        self.assertIsNone(self.id_mapping_api.get_public_id(local_entity))"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test_delete_public_id_is_silent(self):"},{"line_number":147,"context_line":"        # Test that deleting an invalid public key is silent"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_eb7ea868","line":144,"range":{"start_line":143,"start_character":0,"end_line":144,"end_character":74},"updated":"2016-07-06 14:57:45.000000000","message":"it seems to me that this check has nothing to do with unicode. Maybe it should be moved to another test?","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"2a89de5d4a2643807a1adf44c77e1cab39b0312d","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                        matchers.HasLength(initial_mappings + 1))"},{"line_number":141,"context_line":"        self.assertEqual("},{"line_number":142,"context_line":"            public_id, self.id_mapping_api.get_public_id(local_entity))"},{"line_number":143,"context_line":"        self.id_mapping_api.delete_id_mapping(public_id)"},{"line_number":144,"context_line":"        self.assertIsNone(self.id_mapping_api.get_public_id(local_entity))"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test_delete_public_id_is_silent(self):"},{"line_number":147,"context_line":"        # Test that deleting an invalid public key is silent"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_103e9d27","line":144,"range":{"start_line":143,"start_character":0,"end_line":144,"end_character":74},"in_reply_to":"1aa78d24_eb7ea868","updated":"2016-07-07 06:12:16.000000000","message":"This part is needed for the cache test, because some cache item used the local_id as key, so it should be test.\nAnd I add some comments for it, to make it more clear.","commit_id":"80e56dd7aef1b1ecb2cebe0ca87e8228be541de3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d09f8d296b8dcda6f29301bde9e948cae2eeb0a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        new_public_id \u003d uuid.uuid4().hex"},{"line_number":105,"context_line":"        public_id3 \u003d self.id_mapping_api.create_id_mapping("},{"line_number":106,"context_line":"            {\u0027domain_id\u0027: self.domainB[\u0027id\u0027], \u0027local_id\u0027: local_id2,"},{"line_number":107,"context_line":"             \u0027entity_type\u0027: mapping.EntityType.USER},"},{"line_number":108,"context_line":"            public_id\u003dnew_public_id)"},{"line_number":109,"context_line":"        self.assertEqual(new_public_id, public_id3)"},{"line_number":110,"context_line":"        self.assertThat(mapping_sql.list_id_mappings(),"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_47112daf","side":"PARENT","line":107,"updated":"2016-07-08 15:38:27.000000000","message":"I assume this was pulled out into it\u0027s own variable as a readability thing?","commit_id":"74608779455d34789352c3434c94edc1ac1d0b22"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"afaee2c21a2478cdb97c35fa51a6c6385f3ca415","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        new_public_id \u003d uuid.uuid4().hex"},{"line_number":105,"context_line":"        public_id3 \u003d self.id_mapping_api.create_id_mapping("},{"line_number":106,"context_line":"            {\u0027domain_id\u0027: self.domainB[\u0027id\u0027], \u0027local_id\u0027: local_id2,"},{"line_number":107,"context_line":"             \u0027entity_type\u0027: mapping.EntityType.USER},"},{"line_number":108,"context_line":"            public_id\u003dnew_public_id)"},{"line_number":109,"context_line":"        self.assertEqual(new_public_id, public_id3)"},{"line_number":110,"context_line":"        self.assertThat(mapping_sql.list_id_mappings(),"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_7753093a","side":"PARENT","line":107,"in_reply_to":"1aa78d24_47112daf","updated":"2016-07-11 04:53:14.000000000","message":"no, the local_entity3 is used below for checking cache.","commit_id":"74608779455d34789352c3434c94edc1ac1d0b22"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"86cb2305c450ed35856d872444b200ad023859e6","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # Create another mappings, this time specifying a public ID to use"},{"line_number":104,"context_line":"        new_public_id \u003d uuid.uuid4().hex"},{"line_number":105,"context_line":"        local_entity3 \u003d {\u0027domain_id\u0027: self.domainB[\u0027id\u0027],"},{"line_number":106,"context_line":"                         \u0027local_id\u0027: local_id2,"},{"line_number":107,"context_line":"                         \u0027entity_type\u0027: mapping.EntityType.USER}"},{"line_number":108,"context_line":"        public_id3 \u003d self.id_mapping_api.create_id_mapping("},{"line_number":109,"context_line":"            local_entity3, public_id\u003dnew_public_id)"},{"line_number":110,"context_line":"        self.assertEqual(new_public_id, public_id3)"},{"line_number":111,"context_line":"        self.assertEqual(new_public_id,"},{"line_number":112,"context_line":"                         self.id_mapping_api.get_public_id(local_entity3))"},{"line_number":113,"context_line":"        self.assertThat(mapping_sql.list_id_mappings(),"},{"line_number":114,"context_line":"                        matchers.HasLength(initial_mappings + 3))"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_62a14ef8","line":112,"range":{"start_line":105,"start_character":0,"end_line":112,"end_character":74},"updated":"2016-07-12 04:13:24.000000000","message":"I think the change here wants to assure that cache is updated, right? but arguments (cache key) is not exactly the same as the `local_entity2`, so what\u0027s your purpose here?","commit_id":"6d39f2f6682b424f1a640485589da00700b883ba"},{"author":{"_account_id":21463,"name":"Andrew Liu","email":"andrew.lhj@gmail.com","username":"andrewliu"},"change_message_id":"21c5d122e4e95f2b654673cd56f933289a6df32b","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # Create another mappings, this time specifying a public ID to use"},{"line_number":104,"context_line":"        new_public_id \u003d uuid.uuid4().hex"},{"line_number":105,"context_line":"        local_entity3 \u003d {\u0027domain_id\u0027: self.domainB[\u0027id\u0027],"},{"line_number":106,"context_line":"                         \u0027local_id\u0027: local_id2,"},{"line_number":107,"context_line":"                         \u0027entity_type\u0027: mapping.EntityType.USER}"},{"line_number":108,"context_line":"        public_id3 \u003d self.id_mapping_api.create_id_mapping("},{"line_number":109,"context_line":"            local_entity3, public_id\u003dnew_public_id)"},{"line_number":110,"context_line":"        self.assertEqual(new_public_id, public_id3)"},{"line_number":111,"context_line":"        self.assertEqual(new_public_id,"},{"line_number":112,"context_line":"                         self.id_mapping_api.get_public_id(local_entity3))"},{"line_number":113,"context_line":"        self.assertThat(mapping_sql.list_id_mappings(),"},{"line_number":114,"context_line":"                        matchers.HasLength(initial_mappings + 3))"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_2bcb3874","line":112,"range":{"start_line":105,"start_character":0,"end_line":112,"end_character":74},"in_reply_to":"1aa78d24_62a14ef8","updated":"2016-07-18 05:29:20.000000000","message":"fixed this by move it to a dedicated test case method.","commit_id":"6d39f2f6682b424f1a640485589da00700b883ba"}]}
