From f11a9ee41870954bca12f1621a04c43cb0c77865 Mon Sep 17 00:00:00 2001 From: Coldwings Date: Tue, 23 Dec 2025 17:01:01 +0800 Subject: [PATCH 1/3] Fix on domain resolver --- net/utils.cpp | 57 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/net/utils.cpp b/net/utils.cpp index ddbd4561..50ccb0b5 100644 --- a/net/utils.cpp +++ b/net/utils.cpp @@ -266,36 +266,59 @@ class DefaultResolver : public Resolver { struct IPAddrList : public intrusive_list, spinlock { ~IPAddrList() { delete_all(); } }; + struct ResolveCtx { + std::string host; + Delegate filter; + spinlock lock; + IPAddrList *addrs; + photon::semaphore sem; + }; IPAddr do_resolve(std::string_view host, Delegate filter) { auto ctr = [&]() -> IPAddrList* { auto addrs = new IPAddrList(); - photon::semaphore sem; - std::thread([&]() { - auto now = std::chrono::steady_clock::now(); + std::shared_ptr ctx = std::make_shared(); + ctx->addrs = addrs; + ctx->host = std::string(host); + ctx->filter = filter; + std::thread([ctx]() { IPAddrList ret; auto cb = [&](IPAddr addr) -> int { - if (filter && !filter.fire(addr)) + SCOPED_LOCK(ctx->lock); + if (ctx->filter && !ctx->filter.fire(addr)) return 0; ret.push_back(new IPAddrNode(addr)); return 0; }; - _gethostbyname(host, cb); - auto time_elapsed = std::chrono::duration_cast( - std::chrono::steady_clock::now() - now).count(); - if ((uint64_t)time_elapsed <= resolve_timeout_) { - addrs->push_back(std::move(ret)); - sem.signal(1); - } else { - LOG_ERROR("resolve timeout"); - while(!ret.empty()) - delete ret.pop_front(); + _gethostbyname(ctx->host, cb); + { + SCOPED_LOCK(ctx->lock); + if (ctx->addrs) { + ctx->addrs->push_back(std::move(ret)); + ctx->sem.signal(1); + } else { + LOG_ERROR("resolve timeout"); + while(!ret.empty()) + delete ret.pop_front(); + } } }).detach(); - sem.wait(1, resolve_timeout_); + ctx->sem.wait(1, resolve_timeout_); + { + SCOPED_LOCK(ctx->lock); + ctx->addrs = nullptr; + ctx->filter = {}; + } + if (addrs->empty()) { + delete addrs; + return nullptr; + } return addrs; }; - auto ips = dnscache_.borrow(host, ctr); - if (ips->empty()) LOG_ERRNO_RETURN(0, IPAddr(), "Domain resolution for '`' failed", host); + auto ips = dnscache_.borrow(host, ctr, 1UL * 1000); + if (!ips || ips->empty()) { + ips.recycle(true); + LOG_ERRNO_RETURN(0, IPAddr(), "Domain resolution for '`' failed", host); + } SCOPED_LOCK(*ips); auto ret = ips->front(); ips->node = ret->next(); // access in round robin order From ba6d32bb067d45e8066df4749dfd8809810cff80 Mon Sep 17 00:00:00 2001 From: Coldwings Date: Fri, 26 Dec 2025 12:35:26 +0800 Subject: [PATCH 2/3] Simplify do_resolver --- net/utils.cpp | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/net/utils.cpp b/net/utils.cpp index 50ccb0b5..3419d2e8 100644 --- a/net/utils.cpp +++ b/net/utils.cpp @@ -275,44 +275,31 @@ class DefaultResolver : public Resolver { }; IPAddr do_resolve(std::string_view host, Delegate filter) { auto ctr = [&]() -> IPAddrList* { - auto addrs = new IPAddrList(); - std::shared_ptr ctx = std::make_shared(); - ctx->addrs = addrs; + std::unique_ptr addrs(new IPAddrList()); + auto ctx = std::make_shared(); + ctx->addrs = addrs.get(); ctx->host = std::string(host); ctx->filter = filter; std::thread([ctx]() { - IPAddrList ret; auto cb = [&](IPAddr addr) -> int { SCOPED_LOCK(ctx->lock); - if (ctx->filter && !ctx->filter.fire(addr)) - return 0; - ret.push_back(new IPAddrNode(addr)); + if (ctx->filter && !ctx->filter.fire(addr)) return 0; + if (ctx->addrs) { + ctx->addrs->push_back(new IPAddrNode(addr)); + } return 0; }; _gethostbyname(ctx->host, cb); - { - SCOPED_LOCK(ctx->lock); - if (ctx->addrs) { - ctx->addrs->push_back(std::move(ret)); - ctx->sem.signal(1); - } else { - LOG_ERROR("resolve timeout"); - while(!ret.empty()) - delete ret.pop_front(); - } - } + ctx->sem.signal(1); }).detach(); ctx->sem.wait(1, resolve_timeout_); - { - SCOPED_LOCK(ctx->lock); - ctx->addrs = nullptr; - ctx->filter = {}; - } + SCOPED_LOCK(ctx->lock); + ctx->addrs = nullptr; + ctx->filter = {}; if (addrs->empty()) { - delete addrs; return nullptr; } - return addrs; + return addrs.release(); }; auto ips = dnscache_.borrow(host, ctr, 1UL * 1000); if (!ips || ips->empty()) { From a3534d3471428da9efe5a451487e8df4f9655596 Mon Sep 17 00:00:00 2001 From: Coldwings Date: Thu, 19 Mar 2026 16:18:54 +0800 Subject: [PATCH 3/3] FIX on SleepQueue --- thread/thread.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/thread/thread.cpp b/thread/thread.cpp index a3254d6e..72b06389 100644 --- a/thread/thread.cpp +++ b/thread/thread.cpp @@ -384,6 +384,10 @@ namespace photon thread* pop_front() { auto ret = q[0]; + if (q.size() == 1) { + q.pop_back(); + return ret; + } q[0] = q.back(); q[0]->idx = 0; q.pop_back(); @@ -402,6 +406,11 @@ namespace photon } auto id = obj->idx; + if (q.size() == 1) { + assert(id == 0); + q.pop_back(); + return 0; + } q[obj->idx] = q.back(); q[id]->idx = id; q.pop_back(); @@ -419,6 +428,7 @@ namespace photon // compare m_nodes[idx] with parent node. bool up(int idx) { + assert(!q.empty()); auto tmp = q[idx]; bool ret = false; while (idx != 0){ @@ -438,6 +448,7 @@ namespace photon // compare m_nodes[idx] with child node. bool down(int idx) { + assert(!q.empty()); auto tmp = q[idx]; size_t cmpIdx = (idx << 1) + 1; bool ret = false;