AppServices: busy-loop service could block node from creating new services
folex opened this issue · 0 comments
folex commented
Offending code: https://github.com/fluencelabs/fluence/blob/master/particle-services/src/app_services.rs#L185-L187
There's an RWLock
on services' HashMap. When a call to a service happens, the code is as follows
let services = self.services.read(); // (1) acquire reader lock (that's the problem)
let service = services.get(id);
let mut service = service.lock(); // (2) lock service's Mutex (that's OK)
service.call(function_name, args); // (3) this could never return
// unlocks happen here
So, if (3)
loops forever, services' HashMap
is reader-locked. That means that other service calls will work fine, but the creation of new services would block on self.services.write()
and never succeed.
Solution
Replace RWLock and Mutex with a queue. That would basically be an Actor for each service.