Public bug reported: If two clients attempt to update the same user, they are susceptible to a race condition in the update_user method of the sql driver:
I ran into this by using multiple (16) clients to run a script that updates the password for a user: #!/bin/bash set -xo function cleanup { for key in $( set | awk '{FS="="} /^OS_/ {print $1}' ); do unset $key ; done exit } trap cleanup SIGINT USERNAME=test-user while true do PASSWORD=$(uuidgen) openstack --os-cloud openstack user set --password $PASSWORD $USERNAME if [ $? -ne 0 ]; then echo -e "\e[31mFAIL" cleanup fi done Depending on the number of processes and threads, you will see an HTTP 500 with the following error either in keystone's log or http error logs: [Tue Jun 30 16:29:45.241150 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/keystone/identity/core.py", line 1182, in update_user [Tue Jun 30 16:29:45.241152 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] ref = self._update_user_with_federated_objects(user, driver, entity_id) [Tue Jun 30 16:29:45.241157 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/keystone/identity/core.py", line 1136, in _update_user_with_federated_objects [Tue Jun 30 16:29:45.241159 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] user = driver.update_user(entity_id, user) [Tue Jun 30 16:29:45.241163 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/keystone/common/sql/core.py", line 518, in wrapper [Tue Jun 30 16:29:45.241166 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] return method(*args, **kwargs) [Tue Jun 30 16:29:45.241170 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/keystone/identity/backends/sql.py", line 239, in update_user [Tue Jun 30 16:29:45.241172 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] user_ref.to_dict(include_extra_dict=True)) [Tue Jun 30 16:29:45.241176 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/contextlib.py", line 88, in __exit__ [Tue Jun 30 16:29:45.241179 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] next(self.gen) [Tue Jun 30 16:29:45.241183 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 1064, in _transaction_scope [Tue Jun 30 16:29:45.241185 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] yield resource [Tue Jun 30 16:29:45.241189 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/contextlib.py", line 88, in __exit__ [Tue Jun 30 16:29:45.241192 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] next(self.gen) [Tue Jun 30 16:29:45.241195 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 666, in _session [Tue Jun 30 16:29:45.241198 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self.session.rollback() [Tue Jun 30 16:29:45.241202 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_utils/excutils.py", line 220, in __exit__ [Tue Jun 30 16:29:45.241204 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self.force_reraise() [Tue Jun 30 16:29:45.241208 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_utils/excutils.py", line 196, in force_reraise [Tue Jun 30 16:29:45.241212 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] six.reraise(self.type_, self.value, self.tb) [Tue Jun 30 16:29:45.241216 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/six.py", line 703, in reraise [Tue Jun 30 16:29:45.241219 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] raise value [Tue Jun 30 16:29:45.241223 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 663, in _session [Tue Jun 30 16:29:45.241225 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self._end_session_transaction(self.session) [Tue Jun 30 16:29:45.241229 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 691, in _end_session_transaction [Tue Jun 30 16:29:45.241232 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] session.commit() [Tue Jun 30 16:29:45.241236 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 1026, in commit [Tue Jun 30 16:29:45.241238 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self.transaction.commit() [Tue Jun 30 16:29:45.241242 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 493, in commit [Tue Jun 30 16:29:45.241245 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self._prepare_impl() [Tue Jun 30 16:29:45.241248 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 472, in _prepare_impl [Tue Jun 30 16:29:45.241251 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self.session.flush() [Tue Jun 30 16:29:45.241255 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 2451, in flush [Tue Jun 30 16:29:45.241257 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self._flush(objects) [Tue Jun 30 16:29:45.241261 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 2589, in _flush [Tue Jun 30 16:29:45.241264 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] transaction.rollback(_capture_exception=True) [Tue Jun 30 16:29:45.241267 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__ [Tue Jun 30 16:29:45.241270 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] compat.reraise(exc_type, exc_value, exc_tb) [Tue Jun 30 16:29:45.241274 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/util/compat.py", line 129, in reraise [Tue Jun 30 16:29:45.241276 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] raise value [Tue Jun 30 16:29:45.241280 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 2549, in _flush [Tue Jun 30 16:29:45.241283 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] flush_context.execute() [Tue Jun 30 16:29:45.241286 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute [Tue Jun 30 16:29:45.241289 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] rec.execute(self) [Tue Jun 30 16:29:45.241293 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute [Tue Jun 30 16:29:45.241295 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] uow, [Tue Jun 30 16:29:45.241299 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 236, in save_obj [Tue Jun 30 16:29:45.241303 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] update, [Tue Jun 30 16:29:45.241307 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1011, in _emit_update_statements [Tue Jun 30 16:29:45.241310 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] % (table.description, len(records), rows) [Tue Jun 30 16:29:45.241325 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] sqlalchemy.orm.exc.StaleDataError: UPDATE statement on table 'password' expected to update 1 row(s); 0 were matched. [0] http://paste.openstack.org/show/795389/ ** Affects: keystone Importance: Undecided Status: New -- You received this bug notification because you are a member of Yahoo! Engineering Team, which is subscribed to OpenStack Identity (keystone). https://bugs.launchpad.net/bugs/1885753 Title: Stale data causes keystone to raise an HTTP 500 during update updates Status in OpenStack Identity (keystone): New Bug description: If two clients attempt to update the same user, they are susceptible to a race condition in the update_user method of the sql driver: I ran into this by using multiple (16) clients to run a script that updates the password for a user: #!/bin/bash set -xo function cleanup { for key in $( set | awk '{FS="="} /^OS_/ {print $1}' ); do unset $key ; done exit } trap cleanup SIGINT USERNAME=test-user while true do PASSWORD=$(uuidgen) openstack --os-cloud openstack user set --password $PASSWORD $USERNAME if [ $? -ne 0 ]; then echo -e "\e[31mFAIL" cleanup fi done Depending on the number of processes and threads, you will see an HTTP 500 with the following error either in keystone's log or http error logs: [Tue Jun 30 16:29:45.241150 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/keystone/identity/core.py", line 1182, in update_user [Tue Jun 30 16:29:45.241152 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] ref = self._update_user_with_federated_objects(user, driver, entity_id) [Tue Jun 30 16:29:45.241157 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/keystone/identity/core.py", line 1136, in _update_user_with_federated_objects [Tue Jun 30 16:29:45.241159 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] user = driver.update_user(entity_id, user) [Tue Jun 30 16:29:45.241163 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/keystone/common/sql/core.py", line 518, in wrapper [Tue Jun 30 16:29:45.241166 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] return method(*args, **kwargs) [Tue Jun 30 16:29:45.241170 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/keystone/identity/backends/sql.py", line 239, in update_user [Tue Jun 30 16:29:45.241172 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] user_ref.to_dict(include_extra_dict=True)) [Tue Jun 30 16:29:45.241176 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/contextlib.py", line 88, in __exit__ [Tue Jun 30 16:29:45.241179 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] next(self.gen) [Tue Jun 30 16:29:45.241183 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 1064, in _transaction_scope [Tue Jun 30 16:29:45.241185 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] yield resource [Tue Jun 30 16:29:45.241189 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/contextlib.py", line 88, in __exit__ [Tue Jun 30 16:29:45.241192 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] next(self.gen) [Tue Jun 30 16:29:45.241195 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 666, in _session [Tue Jun 30 16:29:45.241198 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self.session.rollback() [Tue Jun 30 16:29:45.241202 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_utils/excutils.py", line 220, in __exit__ [Tue Jun 30 16:29:45.241204 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self.force_reraise() [Tue Jun 30 16:29:45.241208 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_utils/excutils.py", line 196, in force_reraise [Tue Jun 30 16:29:45.241212 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] six.reraise(self.type_, self.value, self.tb) [Tue Jun 30 16:29:45.241216 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/six.py", line 703, in reraise [Tue Jun 30 16:29:45.241219 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] raise value [Tue Jun 30 16:29:45.241223 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 663, in _session [Tue Jun 30 16:29:45.241225 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self._end_session_transaction(self.session) [Tue Jun 30 16:29:45.241229 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib/python3.6/site-packages/oslo_db/sqlalchemy/enginefacade.py", line 691, in _end_session_transaction [Tue Jun 30 16:29:45.241232 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] session.commit() [Tue Jun 30 16:29:45.241236 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 1026, in commit [Tue Jun 30 16:29:45.241238 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self.transaction.commit() [Tue Jun 30 16:29:45.241242 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 493, in commit [Tue Jun 30 16:29:45.241245 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self._prepare_impl() [Tue Jun 30 16:29:45.241248 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 472, in _prepare_impl [Tue Jun 30 16:29:45.241251 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self.session.flush() [Tue Jun 30 16:29:45.241255 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 2451, in flush [Tue Jun 30 16:29:45.241257 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] self._flush(objects) [Tue Jun 30 16:29:45.241261 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 2589, in _flush [Tue Jun 30 16:29:45.241264 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] transaction.rollback(_capture_exception=True) [Tue Jun 30 16:29:45.241267 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__ [Tue Jun 30 16:29:45.241270 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] compat.reraise(exc_type, exc_value, exc_tb) [Tue Jun 30 16:29:45.241274 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/util/compat.py", line 129, in reraise [Tue Jun 30 16:29:45.241276 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] raise value [Tue Jun 30 16:29:45.241280 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 2549, in _flush [Tue Jun 30 16:29:45.241283 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] flush_context.execute() [Tue Jun 30 16:29:45.241286 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute [Tue Jun 30 16:29:45.241289 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] rec.execute(self) [Tue Jun 30 16:29:45.241293 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute [Tue Jun 30 16:29:45.241295 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] uow, [Tue Jun 30 16:29:45.241299 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 236, in save_obj [Tue Jun 30 16:29:45.241303 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] update, [Tue Jun 30 16:29:45.241307 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1011, in _emit_update_statements [Tue Jun 30 16:29:45.241310 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] % (table.description, len(records), rows) [Tue Jun 30 16:29:45.241325 2020] [wsgi:error] [pid 33] [remote 192.168.24.11:56242] sqlalchemy.orm.exc.StaleDataError: UPDATE statement on table 'password' expected to update 1 row(s); 0 were matched. [0] http://paste.openstack.org/show/795389/ To manage notifications about this bug go to: https://bugs.launchpad.net/keystone/+bug/1885753/+subscriptions -- Mailing list: https://launchpad.net/~yahoo-eng-team Post to : yahoo-eng-team@lists.launchpad.net Unsubscribe : https://launchpad.net/~yahoo-eng-team More help : https://help.launchpad.net/ListHelp