Merge branch 'tls-background-eio-thread' into tls-permission-errors

This commit is contained in:
Alex Miller 2020-04-20 20:51:05 -07:00
commit 20fe068863
10 changed files with 42 additions and 3 deletions

View File

@ -996,6 +996,8 @@ void setupNetwork(uint64_t transportId, bool useMetrics) {
TLS::DisableOpenSSLAtExitHandler(); TLS::DisableOpenSSLAtExitHandler();
g_network = newNet2(tlsConfig, false, useMetrics || networkOptions.traceDirectory.present()); g_network = newNet2(tlsConfig, false, useMetrics || networkOptions.traceDirectory.present());
g_network->addStopCallback( Net2FileSystem::stop );
g_network->addStopCallback( TLS::DestroyOpenSSLGlobalState );
FlowTransport::createInstance(true, transportId); FlowTransport::createInstance(true, transportId);
Net2FileSystem::newFileSystem(); Net2FileSystem::newFileSystem();
} }
@ -1020,7 +1022,6 @@ void stopNetwork() {
g_network->stop(); g_network->stop();
closeTraceFile(); closeTraceFile();
TLS::DestroyOpenSSLGlobalState();
} }
Reference<ProxyInfo> DatabaseContext::getMasterProxies(bool useProvisionalProxies) { Reference<ProxyInfo> DatabaseContext::getMasterProxies(bool useProvisionalProxies) {

View File

@ -52,6 +52,10 @@ public:
} }
} }
static void stop() {
eio_set_max_parallel(0);
}
static bool should_poll() { return want_poll; } static bool should_poll() { return want_poll; }
static bool lock_fd( int fd ) { static bool lock_fd( int fd ) {

View File

@ -39,6 +39,8 @@ class AsyncFileWinASIO : public IAsyncFile, public ReferenceCounted<AsyncFileWin
public: public:
static void init() {} static void init() {}
static void stop() {}
static bool should_poll() { return false; } static bool should_poll() { return false; }
// FIXME: This implementation isn't actually asynchronous - it just does operations synchronously! // FIXME: This implementation isn't actually asynchronous - it just does operations synchronously!

View File

@ -194,6 +194,7 @@ struct YieldMockNetwork : INetwork, ReferenceCounted<YieldMockNetwork> {
virtual double now() { return baseNetwork->now(); } virtual double now() { return baseNetwork->now(); }
virtual double timer() { return baseNetwork->timer(); } virtual double timer() { return baseNetwork->timer(); }
virtual void stop() { return baseNetwork->stop(); } virtual void stop() { return baseNetwork->stop(); }
virtual void addStopCallback( std::function<void()> fn ) { ASSERT(false); return; }
virtual bool isSimulated() const { return baseNetwork->isSimulated(); } virtual bool isSimulated() const { return baseNetwork->isSimulated(); }
virtual void onMainThread(Promise<Void>&& signal, TaskPriority taskID) { return baseNetwork->onMainThread(std::move(signal), taskID); } virtual void onMainThread(Promise<Void>&& signal, TaskPriority taskID) { return baseNetwork->onMainThread(std::move(signal), taskID); }
bool isOnMainThread() const override { return baseNetwork->isOnMainThread(); } bool isOnMainThread() const override { return baseNetwork->isOnMainThread(); }

View File

@ -114,3 +114,7 @@ Net2FileSystem::Net2FileSystem(double ioTimeout, std::string fileSystemPath)
} }
#endif #endif
} }
void Net2FileSystem::stop() {
Net2AsyncFile::stop();
}

View File

@ -36,6 +36,7 @@ public:
virtual Future< std::time_t > lastWriteTime( std::string filename ); virtual Future< std::time_t > lastWriteTime( std::string filename );
//void init(); //void init();
static void stop();
Net2FileSystem(double ioTimeout=0.0, std::string fileSystemPath = ""); Net2FileSystem(double ioTimeout=0.0, std::string fileSystemPath = "");

View File

@ -870,7 +870,15 @@ public:
return emptyConfig; return emptyConfig;
} }
virtual void stop() { isStopped = true; } virtual void stop() {
isStopped = true;
for ( auto& fn : stopCallbacks ) {
fn();
}
}
virtual void addStopCallback( std::function<void()> fn ) {
stopCallbacks.emplace_back(std::move(fn));
}
virtual bool isSimulated() const { return true; } virtual bool isSimulated() const { return true; }
struct SimThreadArgs { struct SimThreadArgs {
@ -1605,6 +1613,7 @@ public:
// Not letting currentProcess be NULL eliminates some annoying special cases // Not letting currentProcess be NULL eliminates some annoying special cases
currentProcess = new ProcessInfo("NoMachine", LocalityData(Optional<Standalone<StringRef>>(), StringRef(), StringRef(), StringRef()), ProcessClass(), {NetworkAddress()}, this, "", ""); currentProcess = new ProcessInfo("NoMachine", LocalityData(Optional<Standalone<StringRef>>(), StringRef(), StringRef(), StringRef()), ProcessClass(), {NetworkAddress()}, this, "", "");
g_network = net2 = newNet2(TLSConfig(), false, true); g_network = net2 = newNet2(TLSConfig(), false, true);
g_network->addStopCallback( Net2FileSystem::stop );
Net2FileSystem::newFileSystem(); Net2FileSystem::newFileSystem();
check_yield(TaskPriority::Zero); check_yield(TaskPriority::Zero);
} }
@ -1703,6 +1712,8 @@ public:
//tasks is guarded by ISimulator::mutex //tasks is guarded by ISimulator::mutex
std::priority_queue<Task, std::vector<Task>> tasks; std::priority_queue<Task, std::vector<Task>> tasks;
std::vector<std::function<void()>> stopCallbacks;
//Sim2Net network; //Sim2Net network;
INetwork *net2; INetwork *net2;

View File

@ -1551,6 +1551,7 @@ int main(int argc, char* argv[]) {
openTraceFile(NetworkAddress(), rollsize, maxLogsSize, logFolder, "trace", logGroup); openTraceFile(NetworkAddress(), rollsize, maxLogsSize, logFolder, "trace", logGroup);
} else { } else {
g_network = newNet2(tlsConfig, useThreadPool, true); g_network = newNet2(tlsConfig, useThreadPool, true);
g_network->addStopCallback( Net2FileSystem::stop );
FlowTransport::createInstance(false, 1); FlowTransport::createInstance(false, 1);
const bool expectsPublicAddress = (role == FDBD || role == NetworkTestServer || role == Restore); const bool expectsPublicAddress = (role == FDBD || role == NetworkTestServer || role == Restore);

View File

@ -142,9 +142,14 @@ public:
if ( thread_network == this ) if ( thread_network == this )
stopImmediately(); stopImmediately();
else else
// SOMEDAY: NULL for deferred error, no analysis of correctness (itp)
onMainThreadVoid( [this] { this->stopImmediately(); }, NULL ); onMainThreadVoid( [this] { this->stopImmediately(); }, NULL );
} }
virtual void addStopCallback( std::function<void()> fn ) {
if ( thread_network == this )
stopCallbacks.emplace_back(std::move(fn));
else
onMainThreadVoid( [this, fn] { this->stopCallbacks.emplace_back(std::move(fn)); }, NULL );
}
virtual bool isSimulated() const { return false; } virtual bool isSimulated() const { return false; }
virtual THREAD_HANDLE startThread( THREAD_FUNC_RETURN (*func) (void*), void *arg); virtual THREAD_HANDLE startThread( THREAD_FUNC_RETURN (*func) (void*), void *arg);
@ -232,6 +237,7 @@ public:
EventMetricHandle<SlowTask> slowTaskMetric; EventMetricHandle<SlowTask> slowTaskMetric;
std::vector<std::string> blobCredentialFiles; std::vector<std::string> blobCredentialFiles;
std::vector<std::function<void()>> stopCallbacks;
}; };
static boost::asio::ip::address tcpAddress(IPAddress const& n) { static boost::asio::ip::address tcpAddress(IPAddress const& n) {
@ -1194,6 +1200,10 @@ void Net2::run() {
TraceEvent("SomewhatSlowRunLoopBottom").detail("Elapsed", nnow - now); // This includes the time spent running tasks TraceEvent("SomewhatSlowRunLoopBottom").detail("Elapsed", nnow - now); // This includes the time spent running tasks
} }
for ( auto& fn : stopCallbacks ) {
fn();
}
#ifdef WIN32 #ifdef WIN32
timeEndPeriod(1); timeEndPeriod(1);
#endif #endif

View File

@ -463,6 +463,10 @@ public:
virtual void stop() = 0; virtual void stop() = 0;
// Terminate the program // Terminate the program
virtual void addStopCallback( std::function<void()> fn ) = 0;
// Calls `fn` when stop() is called.
// addStopCallback can be called more than once, and each added `fn` will be run once.
virtual bool isSimulated() const = 0; virtual bool isSimulated() const = 0;
// Returns true if this network is a local simulation // Returns true if this network is a local simulation