Commit c4893c7
committed
Fix deadlock during NRI plugin registration
During NRI external plugin registration:
* `acceptPluginConnections()` is called
* adaptation lock from `nri/pkg/adaptation` is acquired
* `syncFn` is invoked
* `syncFn` acquires NRI lock in `pkg/nri/nri.go`
During container lifecycle events such as `ContainerStart`
* NRI lock is acquired in pkg/nri.go
* adaptation lock is acquired in `StateChange()` in `nri/pkg/adaptation`
As a result, the locking order during NRI plugin registration is:
* adaptation lock -> NRI lock
While the locking order during container starts is:
* NRI lock -> adaptation lock
Due the fact that the locking order is inverted and not consistent, it
it possible to encounter a deadlock.
To fix the issue, during NRI plugin registration, first acquire the NRI
lock (done via `syncFn` call) and only after acquire the adaptation lock.
This ensures that NRI plugin registration the locking order is adaption
lock -> NRI lock, which is consistent with the locking order during
container lifecycle events.
Fixes containerd/containerd#10085
Signed-off-by: David Porter <[email protected]>1 parent 53d3371 commit c4893c7
1 file changed
Lines changed: 2 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
431 | 431 | | |
432 | 432 | | |
433 | 433 | | |
434 | | - | |
435 | | - | |
436 | 434 | | |
437 | 435 | | |
438 | 436 | | |
439 | 437 | | |
| 438 | + | |
440 | 439 | | |
441 | 440 | | |
| 441 | + | |
442 | 442 | | |
443 | 443 | | |
444 | | - | |
445 | | - | |
446 | 444 | | |
447 | 445 | | |
448 | 446 | | |
| |||
0 commit comments