From 879a247afb1b651c8e8aff9ac19435360ed67d3e Mon Sep 17 00:00:00 2001 From: Nathan Bronson Date: Mon, 4 Dec 2017 16:39:00 -0800 Subject: [PATCH] better error handling in MemoryIdler for inside jails Summary: /proc may be unavailable in restricted environments, which can cause pthread_getattr_np to fail. This diff adds checking to the return code from that function. Reviewed By: yfeldblum Differential Revision: D6473789 fbshipit-source-id: de016d32f29edf8410808dfb491987692f39e768 --- folly/detail/MemoryIdler.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/folly/detail/MemoryIdler.cpp b/folly/detail/MemoryIdler.cpp index 8cf1fb36..8e1467d0 100644 --- a/folly/detail/MemoryIdler.cpp +++ b/folly/detail/MemoryIdler.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -92,13 +93,22 @@ static size_t pageSize() { } static void fetchStackLimits() { + int err; pthread_attr_t attr; - pthread_getattr_np(pthread_self(), &attr); + if ((err = pthread_getattr_np(pthread_self(), &attr))) { + // some restricted environments can't access /proc + static folly::once_flag flag; + folly::call_once(flag, [err]() { + LOG(WARNING) << "pthread_getaddr_np failed errno=" << err; + }); + + tls_stackSize = 1; + return; + } SCOPE_EXIT { pthread_attr_destroy(&attr); }; void* addr; size_t rawSize; - int err; if ((err = pthread_attr_getstack(&attr, &addr, &rawSize))) { // unexpected, but it is better to continue in prod than do nothing FB_LOG_EVERY_MS(ERROR, 10000) << "pthread_attr_getstack error " << err; -- 2.34.1