]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-mgr: hold lock while accessing the request list and submitting request 25048/head
authorJerry Lee <leisurelysw24@gmail.com>
Mon, 12 Nov 2018 06:27:53 +0000 (14:27 +0800)
committerJerry Lee <leisurelysw24@gmail.com>
Mon, 12 Nov 2018 06:27:53 +0000 (14:27 +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>
src/pybind/mgr/restful/module.py

index 5b55da92da5be135bb091b52d28aab9c0c2b2235..009425d22192245ae55c1493e41d125d63b93822 100644 (file)
@@ -368,7 +368,8 @@ class Module(MgrModule):
         if tag == 'seq':
             return
         try:
-            request = next(x for x in self.requests if x.is_running(tag))
+            with self.requests_lock:
+                request = next(x for x in self.requests if x.is_running(tag))
             request.finish(tag)
             if request.is_ready():
                 request.next()
@@ -583,8 +584,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():