You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@brpc.apache.org by "chenBright (via GitHub)" <gi...@apache.org> on 2026/08/21 08:41:06 UTC
[PR] Fix potential bvar deadlock by running describe()/dump() outside the global VarMap lock (brpc)
chenBright opened a new pull request, #3470:
URL: https://github.com/apache/brpc/pull/3470
### What problem does this PR solve?
Issue Number: resolve #2888
Problem Summary:
bvar's global `VarMap` is guarded by a pthread mutex. `Variable::describe_exposed()`
(and `describe_series_exposed()`, `dump_exposed()`, plus the multi-dimension
`MVariableBase` counterparts) used to invoke `var->describe()` while holding that lock.
For `PassiveStatus`, `describe()` runs a user-provided callback; if the callback yields
the bthread (e.g. by acquiring a `bthread::Mutex`), the pthread mutex is never released
and the process deadlocks.
### What is changed and the side effects?
Changed:
Run user callbacks OUTSIDE the global map lock via a small indirection handle:
- New `bvar/detail/exposed_ref.h`: `ExposedRef<T>` (a reference-counted handle
guarding an exposed object). It uses `butil::Mutex` + `butil::ConditionVariable`.
- `describe_exposed()` / `describe_series_exposed()` / `get_exposed()`: under the
map lock they now only `seek` + `acquire()` (ref-count +1, serialized with `hide()`'s
erase); the lock is released, `describe()` is called outside the lock, then `release()`.
- `hide()` now also invalidates the handle and blocks (`hide_and_wait()`) until
all in-flight readers finish, so a Variable cannot be destroyed while a concurrent
`describe()` is still using it. Each `expose()` rebuilds a fresh handle (the old one
is single-use once hidden).
- `MVariableBase::describe_exposed()` / `dump_exposed()` get the same treatment;
`dump()` in particular is moved outside the lock because `Dumper` is a
user-overridable interface that may yield.
- Since callbacks no longer run under the lock, the recursive `VarMap` mutex is no
longer needed and is reverted to a plain mutex (now consistent with `MVarMap`).
Side effects:
- Performance effects:
- Breaking backward compatibility:
---
### Check List:
- Please make sure your changes are compilable.
- When providing us with a new feature, it is best to add related tests.
- Please follow [Contributor Covenant Code of Conduct](https://github.com/apache/brpc/blob/master/CODE_OF_CONDUCT.md).
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@brpc.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@brpc.apache.org
For additional commands, e-mail: dev-help@brpc.apache.org
Re: [PR] Fix potential bvar deadlock by running describe()/dump() outside the global VarMap lock (brpc)
Posted by "chenBright (via GitHub)" <gi...@apache.org>.
chenBright merged PR #3470:
URL: https://github.com/apache/brpc/pull/3470
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@brpc.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@brpc.apache.org
For additional commands, e-mail: dev-help@brpc.apache.org
Re: [PR] Fix potential bvar deadlock by running describe()/dump() outside the global VarMap lock (brpc)
Posted by "wwbmmm (via GitHub)" <gi...@apache.org>.
wwbmmm commented on PR #3470:
URL: https://github.com/apache/brpc/pull/3470#issuecomment-5377848898
LGTM
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@brpc.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@brpc.apache.org
For additional commands, e-mail: dev-help@brpc.apache.org