)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"e38194bea8f37ca32451478fdd6621d6b3560db7","unresolved":false,"context_lines":[{"line_number":10,"context_line":"the service. This is accomplished by checking the mtime of"},{"line_number":11,"context_line":"config files every time an API request hits the keystone server."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"A global before_request function with the flask framework,"},{"line_number":14,"context_line":"therefore only APIs that have migrated to flask will trigger it"},{"line_number":15,"context_line":"to fire off."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3f79a3b5_bfa310b0","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":57},"updated":"2018-10-11 10:48:55.000000000","message":"I think this thought is incomplete?","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"}],"keystone/conf/__init__.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6f32d242c61672abf8b470648a7ec460a035a1fa","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"CONF \u003d cfg.CONF"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"conf_modules \u003d ["},{"line_number":57,"context_line":"    application_credential,"},{"line_number":58,"context_line":"    assignment,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_ad64eeb9","side":"PARENT","line":55,"updated":"2018-08-27 16:38:27.000000000","message":"Unrelated whitespace change?","commit_id":"05c6a6584650f312a49ebe1b2917d780b943c380"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6f32d242c61672abf8b470648a7ec460a035a1fa","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    # add oslo.cache related config options"},{"line_number":143,"context_line":"    cache.configure(conf)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    global LAST_LOADED"},{"line_number":146,"context_line":"    LAST_LOADED \u003d datetime.datetime.utcnow()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_edfae6b7","line":145,"range":{"start_line":145,"start_character":11,"end_line":145,"end_character":22},"updated":"2018-08-27 16:38:27.000000000","message":"nit: I wouldn\u0027t mind have the name here be more indicative of the fact that it is used for reloading configuration files.","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"e38194bea8f37ca32451478fdd6621d6b3560db7","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    # add oslo.cache related config options"},{"line_number":143,"context_line":"    cache.configure(conf)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    global LAST_LOADED"},{"line_number":146,"context_line":"    LAST_LOADED \u003d datetime.datetime.utcnow()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_bfaa306a","line":145,"range":{"start_line":145,"start_character":11,"end_line":145,"end_character":22},"in_reply_to":"3f79a3b5_edfae6b7","updated":"2018-10-11 10:48:55.000000000","message":"Does this work when there are multiple threads and processes?","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"e38194bea8f37ca32451478fdd6621d6b3560db7","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def mutate_config():"},{"line_number":193,"context_line":"    global LAST_LOADED"},{"line_number":194,"context_line":"    for file in CONF.default_config_files:"},{"line_number":195,"context_line":"        float_mtime \u003d os.path.getmtime(file)"},{"line_number":196,"context_line":"        dtime_mtime \u003d datetime.datetime.utcfromtimestamp(float_mtime)"},{"line_number":197,"context_line":"        if LAST_LOADED \u003c dtime_mtime:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_5f6d1c65","line":194,"range":{"start_line":194,"start_character":21,"end_line":194,"end_character":41},"updated":"2018-10-11 10:48:55.000000000","message":"Does this work if they are using a non default path? What about multiple config files? Our product uses /etc/keystone/keystone.conf.d/100-keystone.conf etc","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0455fd9b4fcc088ad639350c60d9de77d687699d","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def mutate_config():"},{"line_number":193,"context_line":"    global LAST_LOADED"},{"line_number":194,"context_line":"    for file in CONF.default_config_files:"},{"line_number":195,"context_line":"        float_mtime \u003d os.path.getmtime(file)"},{"line_number":196,"context_line":"        dtime_mtime \u003d datetime.datetime.utcfromtimestamp(float_mtime)"},{"line_number":197,"context_line":"        if LAST_LOADED \u003c dtime_mtime:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_c58b3abe","line":194,"range":{"start_line":194,"start_character":21,"end_line":194,"end_character":41},"in_reply_to":"3f79a3b5_5f6d1c65","updated":"2018-10-16 16:07:48.000000000","message":"We need to hook into the load_config_files mechanisms... see our tests.","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"e38194bea8f37ca32451478fdd6621d6b3560db7","unresolved":false,"context_lines":[{"line_number":192,"context_line":"def mutate_config():"},{"line_number":193,"context_line":"    global LAST_LOADED"},{"line_number":194,"context_line":"    for file in CONF.default_config_files:"},{"line_number":195,"context_line":"        float_mtime \u003d os.path.getmtime(file)"},{"line_number":196,"context_line":"        dtime_mtime \u003d datetime.datetime.utcfromtimestamp(float_mtime)"},{"line_number":197,"context_line":"        if LAST_LOADED \u003c dtime_mtime:"},{"line_number":198,"context_line":"            CONF.mutate_config_files()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_bfdf9009","line":195,"updated":"2018-10-11 10:48:55.000000000","message":"I wonder if this has different performance on different filesystems, or if we should consider the possibility that it could be a network mounted filesystem?","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0455fd9b4fcc088ad639350c60d9de77d687699d","unresolved":false,"context_lines":[{"line_number":192,"context_line":"def mutate_config():"},{"line_number":193,"context_line":"    global LAST_LOADED"},{"line_number":194,"context_line":"    for file in CONF.default_config_files:"},{"line_number":195,"context_line":"        float_mtime \u003d os.path.getmtime(file)"},{"line_number":196,"context_line":"        dtime_mtime \u003d datetime.datetime.utcfromtimestamp(float_mtime)"},{"line_number":197,"context_line":"        if LAST_LOADED \u003c dtime_mtime:"},{"line_number":198,"context_line":"            CONF.mutate_config_files()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_45988a18","line":195,"in_reply_to":"3f79a3b5_bfdf9009","updated":"2018-10-16 16:07:48.000000000","message":"mtime check has very minimal performance differences... now the hard part is that mtime check isn\u0027t guaranteed to work. We could just do like policy and load every time.","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"}],"keystone/server/flask/common.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"9b86b053511a7357a5a04cf43d9f6ab916494a0a","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        assert not self.__before_request_functions_added, msg  # nosec"},{"line_number":395,"context_line":"        # register global before request functions"},{"line_number":396,"context_line":"        # e.g. self.__blueprint.before_request(function)"},{"line_number":397,"context_line":"        self.__blueprint.before_request(keystone.conf.mutate_config)"},{"line_number":398,"context_line":"        self.__blueprint.before_request(_initialize_rbac_enforcement_check)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        # Add passed-in functions"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_04b1c401","line":397,"updated":"2018-07-26 03:11:29.000000000","message":"So every request to Keystone will change the config file changes. Will it impact performance?\n\nHow about skip this check for token issue/validate request?","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0455fd9b4fcc088ad639350c60d9de77d687699d","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        assert not self.__before_request_functions_added, msg  # nosec"},{"line_number":395,"context_line":"        # register global before request functions"},{"line_number":396,"context_line":"        # e.g. self.__blueprint.before_request(function)"},{"line_number":397,"context_line":"        self.__blueprint.before_request(keystone.conf.mutate_config)"},{"line_number":398,"context_line":"        self.__blueprint.before_request(_initialize_rbac_enforcement_check)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        # Add passed-in functions"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_25aa2e19","line":397,"in_reply_to":"3f79a3b5_9fcad443","updated":"2018-10-16 16:07:48.000000000","message":"We already load the policy file on every single request.","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"e38194bea8f37ca32451478fdd6621d6b3560db7","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        assert not self.__before_request_functions_added, msg  # nosec"},{"line_number":395,"context_line":"        # register global before request functions"},{"line_number":396,"context_line":"        # e.g. self.__blueprint.before_request(function)"},{"line_number":397,"context_line":"        self.__blueprint.before_request(keystone.conf.mutate_config)"},{"line_number":398,"context_line":"        self.__blueprint.before_request(_initialize_rbac_enforcement_check)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        # Add passed-in functions"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_9fcad443","line":397,"in_reply_to":"5f7c97a3_04b1c401","updated":"2018-10-11 10:48:55.000000000","message":"I share the same concerns about performance. Maybe we need a parameter to turn it off?","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"}],"keystone/tests/unit/test_config.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6f32d242c61672abf8b470648a7ec460a035a1fa","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            m.assert_not_called()"},{"line_number":110,"context_line":"        self.assertEqual(last_loaded, keystone.conf.LAST_LOADED)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def test_update(self):"},{"line_number":113,"context_line":"        # We regenerate the config file, changing the modified time."},{"line_number":114,"context_line":"        self._generate_config()"},{"line_number":115,"context_line":"        last_loaded \u003d keystone.conf.LAST_LOADED"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_4da8ba8a","line":112,"updated":"2018-08-27 16:38:27.000000000","message":"I wonder if we could add more of a functional test that ensures behavior is actually changed after reloading the files. Making sure the global is updates is important, but it would be nice to test:\n\n  - deploy config with warning level X\n  - call some keystone API\n  - deploy config with warning level Y\n  - call some keystone API\n  - ensure the logging change worked without restarting keystone","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0455fd9b4fcc088ad639350c60d9de77d687699d","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            m.assert_not_called()"},{"line_number":110,"context_line":"        self.assertEqual(last_loaded, keystone.conf.LAST_LOADED)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def test_update(self):"},{"line_number":113,"context_line":"        # We regenerate the config file, changing the modified time."},{"line_number":114,"context_line":"        self._generate_config()"},{"line_number":115,"context_line":"        last_loaded \u003d keystone.conf.LAST_LOADED"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_256f8efa","line":112,"in_reply_to":"3f79a3b5_4da8ba8a","updated":"2018-10-16 16:07:48.000000000","message":"++ we do that in some cases (policy).","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"}],"releasenotes/notes/bp-mutable-config-5d3b25908957dcdd.yaml":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6f32d242c61672abf8b470648a7ec460a035a1fa","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - \u003e"},{"line_number":4,"context_line":"    Implemented support for mutable config. This enables reloading of"},{"line_number":5,"context_line":"    supported configuration options without restarting the service."},{"line_number":6,"context_line":"    Currently only `[DEFAULT] debug` is supported."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"3f79a3b5_4d819afa","line":4,"updated":"2018-08-27 16:38:27.000000000","message":"I think we should add a link to the community goal somewhere in here so that folks can get more context if needed.","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0455fd9b4fcc088ad639350c60d9de77d687699d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - \u003e"},{"line_number":4,"context_line":"    Implemented support for mutable config. This enables reloading of"},{"line_number":5,"context_line":"    supported configuration options without restarting the service."},{"line_number":6,"context_line":"    Currently only `[DEFAULT] debug` is supported."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"3f79a3b5_8549c28e","line":4,"in_reply_to":"3f79a3b5_4d819afa","updated":"2018-10-16 16:07:48.000000000","message":"++","commit_id":"168dc144741ec3635a8d117a7355789ca2ac3a79"}]}
