ApplicationImpl::ApplicationImpl(VirtualClock& clock, Config const& cfg) : mVirtualClock(clock) , mConfig(cfg) , mWorkerIOService(std::thread::hardware_concurrency()) , mWork(make_unique<asio::io_service::work>(mWorkerIOService)) , mWorkerThreads() , mStopSignals(clock.getIOService(), SIGINT) , mStopping(false) , mStoppingTimer(*this) , mMetrics(make_unique<medida::MetricsRegistry>()) , mAppStateCurrent(mMetrics->NewCounter({"app", "state", "current"})) , mAppStateChanges(mMetrics->NewTimer({"app", "state", "changes"})) , mLastStateChange(clock.now()) { #ifdef SIGQUIT mStopSignals.add(SIGQUIT); #endif #ifdef SIGTERM mStopSignals.add(SIGTERM); #endif std::srand(static_cast<uint32>(clock.now().time_since_epoch().count())); mNetworkID = sha256(mConfig.NETWORK_PASSPHRASE); unsigned t = std::thread::hardware_concurrency(); LOG(DEBUG) << "Application constructing " << "(worker threads: " << t << ")"; mStopSignals.async_wait([this](asio::error_code const& ec, int sig) { if (!ec) { LOG(INFO) << "got signal " << sig << ", shutting down"; this->gracefulStop(); } }); // These must be constructed _after_ because they frequently call back // into App.getFoo() to get information / start up. mDatabase = make_unique<Database>(*this); mPersistentState = make_unique<PersistentState>(*this); mTmpDirManager = make_unique<TmpDirManager>(cfg.TMP_DIR_PATH); mOverlayManager = OverlayManager::create(*this); mLedgerManager = LedgerManager::create(*this); mHerder = Herder::create(*this); mBucketManager = BucketManager::create(*this); mHistoryManager = HistoryManager::create(*this); mProcessManager = ProcessManager::create(*this); mCommandHandler = make_unique<CommandHandler>(*this); mWorkManager = WorkManager::create(*this); while (t--) { mWorkerThreads.emplace_back([this, t]() { this->runWorkerThread(t); }); } LOG(DEBUG) << "Application constructed"; }
ApplicationImpl::ApplicationImpl(VirtualClock& clock, Config const& cfg) : mState(Application::State::BOOTING_STATE) , mVirtualClock(clock) , mConfig(cfg) , mWorkerIOService(std::thread::hardware_concurrency()) , mWork(make_unique<asio::io_service::work>(mWorkerIOService)) , mWorkerThreads() , mStopSignals(clock.getIOService(), SIGINT) { #ifdef SIGQUIT mStopSignals.add(SIGQUIT); #endif #ifdef SIGTERM mStopSignals.add(SIGTERM); #endif unsigned t = std::thread::hardware_concurrency(); LOG(INFO) << "Application constructing " << "(worker threads: " << t << ")"; mStopSignals.async_wait([this](asio::error_code const& ec, int sig) { LOG(INFO) << "got signal " << sig << ", shutting down"; this->gracefulStop(); }); // These must be constructed _after_ because they frequently call back // into App.getFoo() to get information / start up. mMetrics = make_unique<medida::MetricsRegistry>(); mDatabase = make_unique<Database>(*this); mPersistentState = make_unique<PersistentState>(*this); if (mPersistentState->getState(PersistentState::kForceSCPOnNextLaunch) == "true") { mConfig.START_NEW_NETWORK = true; } // Initialize the db as early as possible, namely as soon as metrics, // database and persistentState are instantiated. if (mConfig.REBUILD_DB || mConfig.DATABASE == "sqlite3://:memory:") { mDatabase->initialize(); } mTmpDirManager = make_unique<TmpDirManager>(cfg.TMP_DIR_PATH); mOverlayManager = OverlayManager::create(*this); mLedgerManager = LedgerManager::create(*this); mHerder = Herder::create(*this); mBucketManager = BucketManager::create(*this); mHistoryManager = HistoryManager::create(*this); mProcessManager = ProcessManager::create(*this); mCommandHandler = make_unique<CommandHandler>(*this); while (t--) { mWorkerThreads.emplace_back([this, t]() { this->runWorkerThread(t); }); } LOG(INFO) << "Application constructed"; }