25-forkable-destruction-order.patch 1.4 KB

123456789101112131415161718192021222324252627282930313233343536
  1. --- a/src/core/lib/event_engine/forkable.cc (index)
  2. +++ b/src/core/lib/event_engine/forkable.cc (working tree)
  3. @@ -78,8 +78,13 @@ void ManageForkable(Forkable* forkable) {
  4. void StopManagingForkable(Forkable* forkable) {
  5. grpc_core::MutexLock lock(g_mu.get());
  6. auto iter = std::find(g_forkables->begin(), g_forkables->end(), forkable);
  7. - GPR_ASSERT(iter != g_forkables->end());
  8. - g_forkables->erase(iter);
  9. + // We've faced with the issue that destructor for TimerManager object is called
  10. + // between PrepareFork and PostforkParent.
  11. + // In result in PostforkParent we try to access not valid object via forkable ptr.
  12. + // https://github.com/grpc/grpc/issues/33516
  13. + if (iter != g_forkables->end()) {
  14. + g_forkables->erase(iter);
  15. + }
  16. }
  17. } // namespace experimental
  18. --- a/src/core/lib/event_engine/posix_engine/timer_manager.cc (index)
  19. +++ b/src/core/lib/event_engine/posix_engine/timer_manager.cc (working tree)
  20. @@ -144,7 +144,14 @@ void TimerManager::Shutdown() {
  21. }
  22. }
  23. -TimerManager::~TimerManager() { Shutdown(); }
  24. +TimerManager::~TimerManager() {
  25. + // We've faced with the issue that destructor for TimerManager object is called
  26. + // between PrepareFork and PostforkParent. see forkable.cc
  27. + // Let's remove object from g_forcable list here
  28. + // https://github.com/grpc/grpc/issues/33516
  29. + StopManagingForkable(this);
  30. + Shutdown();
  31. +}
  32. void TimerManager::Host::Kick() { timer_manager_->Kick(); }