From 4a7814a4a36556f1af4850e8cd57d39bc9e35afe Mon Sep 17 00:00:00 2001 From: Philip O'Toole Date: Fri, 1 Dec 2023 08:49:31 -0500 Subject: [PATCH 1/2] Use top-level timeout check for nodes/ --- http/nodes.go | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/http/nodes.go b/http/nodes.go index f41e2e0b..874402b2 100644 --- a/http/nodes.go +++ b/http/nodes.go @@ -39,16 +39,32 @@ func NewNodeFromServer(s *store.Server) *Node { // occurs, the Error field will be populated. func (n *Node) Test(ga GetAddresser, leaderAddr string, timeout time.Duration) { start := time.Now() - apiAddr, err := ga.GetNodeAPIAddr(n.Addr, timeout) - if err != nil { - n.Error = err.Error() - n.Reachable = false + n.Time = time.Since(start).Seconds() + + timer := time.NewTimer(timeout) + defer timer.Stop() + done := make(chan struct{}) + + go func() { + defer close(done) + apiAddr, err := ga.GetNodeAPIAddr(n.Addr, timeout) + if err != nil { + n.Error = err.Error() + n.Reachable = false + return + } + n.APIAddr = apiAddr + n.Reachable = true + n.Leader = n.Addr == leaderAddr + }() + + select { + case <-timer.C: + n.Error = "timeout" + return + case <-done: return } - n.Time = time.Since(start).Seconds() - n.APIAddr = apiAddr - n.Reachable = true - n.Leader = n.Addr == leaderAddr } type Nodes []*Node From 07cb0fb22a716cef73bc4373a00ca23573e96536 Mon Sep 17 00:00:00 2001 From: Philip O'Toole Date: Fri, 1 Dec 2023 08:54:39 -0500 Subject: [PATCH 2/2] CHANGELOG --- CHANGELOG.md | 1 + http/nodes.go | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30f54fba..f681965c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ When officially released 8.0 will support (mostly) seamless upgrades from the 7. - [PR #1420](https://github.com/rqlite/rqlite/pull/1420), [PR #1431](https://github.com/rqlite/rqlite/pull/1431): Nodes join a cluster using the Raft address, not the HTTP API. - [PR #1426](https://github.com/rqlite/rqlite/pull/1426): 'go mod' updates, including moving to Raft 1.6. - [PR #1430](https://github.com/rqlite/rqlite/pull/1430): Check that any supplied Join addresses are not HTTP servers. +- [PR #1437](https://github.com/rqlite/rqlite/pull/1437): Actually timeout if needed during `nodes/` access. Fixes [issue #1435](https://github.com/rqlite/rqlite/issues/1435). Thanks @dwco-z ## 7.21.4 (July 8th 2023) ### Implementation changes and bug fixes diff --git a/http/nodes.go b/http/nodes.go index 874402b2..838415c8 100644 --- a/http/nodes.go +++ b/http/nodes.go @@ -44,7 +44,6 @@ func (n *Node) Test(ga GetAddresser, leaderAddr string, timeout time.Duration) { timer := time.NewTimer(timeout) defer timer.Stop() done := make(chan struct{}) - go func() { defer close(done) apiAddr, err := ga.GetNodeAPIAddr(n.Addr, timeout)