]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-mgr: hold lock while accessing the request list and submitting request 25113/head
authorJerry Lee <leisurelysw24@gmail.com>
Mon, 12 Nov 2018 06:27:53 +0000 (14:27 +0800)
committerJerry Lee <leisurelysw24@gmail.com>
Thu, 15 Nov 2018 08:59:06 +0000 (16:59 +0800)
The request creation can fire up the notify event early and it can cause
a race condition where the actual request was not yet added to the
self.requests list which makes the submit_request() function waits
forever without accepting new requests.

https://marc.info/?l=ceph-devel&m=154104291714160&w=2

Fixes: https://tracker.ceph.com/issues/36764
Signed-off-by: Jerry Lee <leisurelysw24@gmail.com>
(cherry picked from commit b09aefc2d6af3de8cc3df30258dfdc639c919a9f)

Conflicts:
src/pybind/mgr/restful/module.py

src/pybind/mgr/restful/module.py

index a6c9c638fe247c572d1f8699ee38a10fb93db9a5..6a4b1b6bf440591aa77491d1977846ead8e8cc57 100644 (file)
@@ -365,7 +365,9 @@ class Module(MgrModule):
             if tag == 'seq':
                 return
 
-            request = [x for x in self.requests if x.is_running(tag)]
+            with self.requests_lock:
+                request = [x for x in self.requests if x.is_running(tag)]
+
             if len(request) != 1:
                 self.log.warn("Unknown request '%s'" % str(tag))
                 return
@@ -584,8 +586,8 @@ class Module(MgrModule):
 
 
     def submit_request(self, _request, **kwargs):
-        request = CommandsRequest(_request)
         with self.requests_lock:
+            request = CommandsRequest(_request)
             self.requests.append(request)
         if kwargs.get('wait', 0):
             while not request.is_finished():