diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2015-11-11 22:31:00 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2015-11-11 22:31:00 +0900 |
| commit | af98861aff50737f87d9c251ee9a68280bba3e64 (patch) | |
| tree | efcac3dff10dde209b83ded6ef798f83a90fc684 /src/DownloadEngine.cc | |
| parent | 269520ee69e2306eaf792ccff916ba5486d2bb5f (diff) | |
Evict timed out pooled socket periodically
Previously we only scanned pool socket to check they are timed out
when we pooled another socket. This means that pooled socket is not
closed long time (stays in CLOSE-WAIT state) if we don't pool any more
socket. In this commit, we now check pooled socket periodically (30
seconds) to avoid the sockets hanging in CLOSE-WAIT state long time.
See GH-477
Diffstat (limited to 'src/DownloadEngine.cc')
| -rw-r--r-- | src/DownloadEngine.cc | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/DownloadEngine.cc b/src/DownloadEngine.cc index 522c1b2e..3bc7b18e 100644 --- a/src/DownloadEngine.cc +++ b/src/DownloadEngine.cc @@ -311,22 +311,25 @@ void DownloadEngine::poolSocket(const std::string& key, A2_LOG_INFO(fmt("Pool socket for %s", key.c_str())); std::multimap<std::string, SocketPoolEntry>::value_type p(key, entry); socketPool_.insert(p); +} - if(lastSocketPoolScan_.difference(global::wallclock()) < 1_min) { +void DownloadEngine::evictSocketPool() +{ + if (socketPool_.empty()) { return; } + std::multimap<std::string, SocketPoolEntry> newPool; A2_LOG_DEBUG("Scaning SocketPool and erasing timed out entry."); - lastSocketPoolScan_ = global::wallclock(); - for(auto & elem : socketPool_) { - if(!elem.second.isTimeout()) { + for (auto& elem : socketPool_) { + if (!elem.second.isTimeout()) { newPool.insert(elem); } } A2_LOG_DEBUG(fmt("%lu entries removed.", - static_cast<unsigned long> - (socketPool_.size()-newPool.size()))); - socketPool_ = newPool; + static_cast<unsigned long> + (socketPool_.size() - newPool.size()))); + socketPool_ = std::move(newPool); } namespace { |
