Reviewed: https://review.openstack.org/529519 Committed: https://git.openstack.org/cgit/openstack/nova/commit/?id=4dd1406289825554aa48522454de473dff103c0d Submitter: Zuul Branch: master
commit 4dd1406289825554aa48522454de473dff103c0d Author: Yikun Jiang <yikunk...@gmail.com> Date: Thu Dec 21 16:11:37 2017 +0800 [placement] Fix resource provider delete Due to foreign key constraints for the resource_provider.root_provider_id in mysql and the way of column filling it is impossible to delete newly created RP now. Patch sets root_provider_id to NULL before deletion if root_provider_id == id. Closes-Bug: #1739571 Co-Authored-by: Andrey Volkov <avol...@mirantis.com> Change-Id: I256c901fdc02b1f764ea9f8d1a1a708e82cc369a ** Changed in: nova Status: In Progress => Fix Released -- You received this bug notification because you are a member of Yahoo! Engineering Team, which is subscribed to OpenStack Compute (nova). https://bugs.launchpad.net/bugs/1739571 Title: Can't delete root resource provider because of the self foreign key Status in OpenStack Compute (nova): Fix Released Bug description: Description =========== Current, we can't delete the root resource provider record because it has a foreign key reference it id on itself, we will get back DBReferenceError, the reason is "Cannot delete or update a parent row: a foreign key constraint fails". NOTE: it is a essential case(just create and delete), but it doesn't be triggered in test case because SQLLite allow us to delete it, but we found this error in MYSQL database. Steps to reproduce ================== 1. First create a resource provider without parent uuid. curl -X POST http://10.76.6.31/placement/resource_providers -H "X-Auth-Token: $TOKEN" -H "OpenStack-API-Version: placement 1.15" -H "Accept: application/json" -H "Content-Type: application/json" -d '{"name": "rp1", "uuid": "7d2590ae-9999-4080-9306-058b4c915e32"}' We fill the id as it default the root_provider_uuid, code as below: https://github.com/openstack/nova/blob/76dfdfc1ad8c0e5376bd997e45f65bec9ff53d12/nova/objects/resource_provider.py#L802-L809 2. Ensure it has been created. curl -X GET http://10.76.6.31/placement/resource_providers/7d2590ae-9999-4080-9306-058b4c915e32 -H "X-Auth-Token: $TOKEN" -H "OpenStack-API-Version: placement 1.15" -H "Accept: application/json" 3. Try delete it curl -X DELETE http://10.76.6.31/placement/resource_providers/7d2590ae-9999-4080-9306-058b4c915e32 -H "X-Auth-Token: $TOKEN" -H "OpenStack-API-Version: placement 1.15" -H "Accept: application/json" yea, we can't delete it, and get back 500 ERROR: {"computeFault": {"message": "The server has either erred or is incapable of performing the requested operation.", "code": 500}} Logs & Traceback ============== 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack [req-9975de8b-6784-4555-981c-fb57314535bc admin admin] Caught error: (pymysql.err.IntegrityError) (1451, u'Cannot delete or update a parent row: a foreign key constraint fails (`nova_api`.`resource_providers`, CONSTRAINT `resource_providers_ibfk_1` FOREIGN KEY (`root_provider_id`) REFERENCES `resource_providers` (`id`))') [SQL: u'DELETE FROM resource_providers WHERE resource_providers.id = %(id_1)s'] [parameters: {u'id_1': 3}]: DBReferenceError: (pymysql.err.IntegrityError) (1451, u'Cannot delete or update a parent row: a foreign key constraint fails (`nova_api`.`resource_providers`, CONSTRAINT `resource_providers_ibfk_1` FOREIGN KEY (`root_provider_id`) REFERENCES `resource_providers` (`id`))') [SQL: u'DELETE FROM resource_providers WHERE resource_providers.id = %(id_1)s'] [parameters: {u'id_1': 3}] 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack Traceback (most recent call last): 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/opt/stack/nova/nova/api/openstack/__init__.py", line 82, in __call__ 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack return req.get_response(self.application) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1327, in send 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack application, catch_exc_info=False) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1291, in call_application 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack app_iter = application(self.environ, start_response) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 131, in __call__ 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack resp = self.call_func(req, *args, **self.kwargs) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 196, in call_func 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack return self.func(req, *args, **kwargs) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/opt/stack/nova/nova/api/openstack/placement/microversion.py", line 117, in __call__ 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack response = req.get_response(self.application) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1327, in send 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack application, catch_exc_info=False) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1291, in call_application 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack app_iter = application(self.environ, start_response) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/opt/stack/nova/nova/api/openstack/placement/handler.py", line 220, in __call__ 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack return dispatch(environ, start_response, self._map) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/opt/stack/nova/nova/api/openstack/placement/handler.py", line 147, in dispatch 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack return handler(environ, start_response) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 131, in __call__ 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack resp = self.call_func(req, *args, **self.kwargs) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/opt/stack/nova/nova/api/openstack/placement/wsgi_wrapper.py", line 29, in call_func 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack super(PlacementWsgify, self).call_func(req, *args, **kwargs) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 196, in call_func 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack return self.func(req, *args, **kwargs) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/opt/stack/nova/nova/api/openstack/placement/handlers/resource_provider.py", line 208, in delete_resource_provider 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack resource_provider.destroy() 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/opt/stack/nova/nova/objects/resource_provider.py", line 688, in destroy 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack self._delete(self._context, self.id) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 984, in wrapper 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack return fn(*args, **kwargs) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/opt/stack/nova/nova/objects/resource_provider.py", line 845, in _delete 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack delete(synchronize_session=False) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 3212, in delete 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack delete_op.exec_() 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 1179, in exec_ 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack self._do_exec() 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 1363, in _do_exec 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack mapper=self.mapper) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 1154, in execute 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack bind, close_with_result=True).execute(clause, params or {}) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 945, in execute 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack return meth(self, multiparams, params) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py", line 263, in _execute_on_connection 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack return connection._execute_clauseelement(self, multiparams, params) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1053, in _execute_clauseelement 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack compiled_sql, distilled_params 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1189, in _execute_context 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack context) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1398, in _handle_dbapi_exception 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack util.raise_from_cause(newraise, exc_info) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack reraise(type(exception), exception, tb=exc_tb, cause=cause) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack context) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 470, in do_execute 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack cursor.execute(statement, parameters) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 166, in execute 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack result = self._query(query) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 322, in _query 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack conn.query(q) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 856, in query 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack self._affected_rows = self._read_query_result(unbuffered=unbuffered) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 1057, in _read_query_result 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack result.read() 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 1340, in read 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack first_packet = self.connection._read_packet() 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 1014, in _read_packet 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack packet.check_error() 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 393, in check_error 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack err.raise_mysql_exception(self._data) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/err.py", line 107, in raise_mysql_exception 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack raise errorclass(errno, errval) 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack DBReferenceError: (pymysql.err.IntegrityError) (1451, u'Cannot delete or update a parent row: a foreign key constraint fails (`nova_api`.`resource_providers`, CONSTRAINT `resource_providers_ibfk_1` FOREIGN KEY (`root_provider_id`) REFERENCES `resource_providers` (`id`))') [SQL: u'DELETE FROM resource_providers WHERE resource_providers.id = %(id_1)s'] [parameters: {u'id_1': 3}] 2017-12-21 01:14:12.019 23740 ERROR nova.api.openstack 2017-12-21 01:14:12.030 23740 INFO nova.api.openstack [req-9975de8b-6784-4555-981c-fb57314535bc admin admin] http://10.76.6.31/placement/resource_providers/7d2590ae-fb85-4080-9306-058b4c915e31 returned with HTTP 500 2017-12-21 01:14:12.110 23740 DEBUG nova.api.openstack.wsgi [req-9975de8b-6784-4555-981c-fb57314535bc admin admin] Returning 500 to user: The server has either erred or is incapable of performing the requested operation. __call__ /opt/stack/nova/nova/api/openstack/wsgi.py:1029 2017-12-21 01:14:12.112 23740 INFO nova.api.openstack.placement.requestlog [req-9975de8b-6784-4555-981c-fb57314535bc admin admin] 10.8.4.18 "DELETE /placement/resource_providers/7d2590ae-fb85-4080-9306-058b4c915e31" status: 500 len: 128 microversion: 1.15 [pid: 23740|app: 0|req: 248/496] 10.8.4.18 () {74 vars in 1688 bytes} [Thu Dec 21 01:14:11 2017] DELETE /placement/resource_providers/7d2590ae-fb85-4080-9306-058b4c915e31 => generated 128 bytes in 220 msecs (HTTP/1.1 500) 4 headers in 191 bytes (1 switches on core 0) To manage notifications about this bug go to: https://bugs.launchpad.net/nova/+bug/1739571/+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