Handle event_base_new failure when out of file descriptors.
authorZejun Wu <watashi@fb.com>
Tue, 6 May 2014 00:08:36 +0000 (17:08 -0700)
committerDave Watson <davejwatson@fb.com>
Tue, 20 May 2014 19:53:57 +0000 (12:53 -0700)
Summary:
Both event_base_new and event_init return nullptr when out of file descriptors.
Using null event_base will result in segfault.

Test Plan: (ulimit -n 50000 && _build/opt/sigma/service/sigma_server --instance_name=si_sigma_push --min_scribe_log_level=0 --allow_status_port_fallback=true --minloglevel=1 --v=0 --feature_objects_limit=1000000 --hbase_default_timeout_ms=250 --max_total_connections_per_region_server=10 --max_retained_connections_per_region_server=10 --tao_default_timeout_ms=5000 --enable_writes_scribe_si_floop=false --enable_writes_all=false --arena_size_limit=268435456 --run_fxl=true)

Reviewed By: davejwatson@fb.com

FB internal diff: D1311855

folly/io/async/EventBase.cpp

index 932a63ac5e75abe7bf104a43e18d0b2477db0850..130ba5fbc2b21be360ddb7b598434cf6548618a8 100644 (file)
@@ -144,6 +144,10 @@ EventBase::EventBase()
   , startWork_(0)
   , observer_(nullptr)
   , observerSampleCount_(0) {
   , startWork_(0)
   , observer_(nullptr)
   , observerSampleCount_(0) {
+  if (UNLIKELY(evb_ == nullptr)) {
+    LOG(ERROR) << "EventBase(): Failed to init event base.";
+    folly::throwSystemError("error in EventBase::EventBase()");
+  }
   VLOG(5) << "EventBase(): Created.";
   initNotificationQueue();
   RequestContext::getStaticContext();
   VLOG(5) << "EventBase(): Created.";
   initNotificationQueue();
   RequestContext::getStaticContext();
@@ -165,6 +169,10 @@ EventBase::EventBase(event_base* evb)
   , startWork_(0)
   , observer_(nullptr)
   , observerSampleCount_(0) {
   , startWork_(0)
   , observer_(nullptr)
   , observerSampleCount_(0) {
+  if (UNLIKELY(evb_ == nullptr)) {
+    LOG(ERROR) << "EventBase(): Pass nullptr as event base.";
+    throw std::invalid_argument("EventBase(): event base cannot be nullptr");
+  }
   initNotificationQueue();
   RequestContext::getStaticContext();
 }
   initNotificationQueue();
   RequestContext::getStaticContext();
 }