fluencelabs/nox

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.