Skip to content

Commit 18f11eb

Browse files
authored
[#598]: fix: status/rediness check when activity workers are turned off
2 parents cf9cf78 + d7f31f7 commit 18f11eb

File tree

5 files changed

+162
-112
lines changed

5 files changed

+162
-112
lines changed

go.work.sum

+2-1
Original file line numberDiff line numberDiff line change
@@ -3208,7 +3208,6 @@ go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08
32083208
go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI=
32093209
go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI=
32103210
go.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=
3211-
go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
32123211
go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
32133212
go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
32143213
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
@@ -3301,6 +3300,8 @@ golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7
33013300
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
33023301
golang.org/x/crypto v0.30.0 h1:RwoQn3GkWiMkzlX562cLB7OxWvjH1L8xutO2WoJcRoY=
33033302
golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
3303+
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
3304+
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
33043305
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
33053306
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
33063307
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=

status.go

+14-1
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,22 @@ package rrtemporal
33
import (
44
"net/http"
55

6-
"github.com/roadrunner-server/api/v4/plugins/v1/status"
76
"github.com/roadrunner-server/pool/fsm"
7+
8+
"github.com/roadrunner-server/api/v4/plugins/v1/status"
89
)
910

1011
// Status return status of the particular plugin
1112
func (p *Plugin) Status() (*status.Status, error) {
1213
p.mu.RLock()
1314
defer p.mu.RUnlock()
1415

16+
if p.config.DisableActivityWorkers && len(p.wfP.Workers()) > 0 && p.wfP.Workers()[0].State().IsActive() {
17+
return &status.Status{
18+
Code: http.StatusOK,
19+
}, nil
20+
}
21+
1522
workers := p.actP.Workers()
1623

1724
for i := 0; i < len(workers); i++ {
@@ -32,6 +39,12 @@ func (p *Plugin) Ready() (*status.Status, error) {
3239
p.mu.RLock()
3340
defer p.mu.RUnlock()
3441

42+
if p.config.DisableActivityWorkers && len(p.wfP.Workers()) > 0 && p.wfP.Workers()[0].State().Compare(fsm.StateReady) {
43+
return &status.Status{
44+
Code: http.StatusOK,
45+
}, nil
46+
}
47+
3548
workers := p.actP.Workers()
3649

3750
for i := 0; i < len(workers); i++ {

tests/general/general_test.go

+33
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ package tests
22

33
import (
44
"context"
5+
"io"
56
"net"
7+
"net/http"
68
"net/rpc"
79
"sync"
810
"testing"
911
"time"
1012

13+
"github.com/stretchr/testify/require"
14+
1115
goridgeRpc "github.com/roadrunner-server/goridge/v3/pkg/rpc"
1216
"github.com/roadrunner-server/pool/state/process"
1317

@@ -64,6 +68,35 @@ func Test_DisabledActivityWorkers(t *testing.T) {
6468

6569
assertWorkers(t, 1)
6670

71+
time.Sleep(time.Second)
72+
73+
clientStatus := &http.Client{
74+
Timeout: time.Second * 10,
75+
}
76+
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://127.0.0.1:35544/health?plugin=temporal", nil)
77+
require.NoError(t, err)
78+
79+
resp, err := clientStatus.Do(req)
80+
require.NoError(t, err)
81+
require.NotNil(t, resp)
82+
83+
body, _ := io.ReadAll(resp.Body)
84+
assert.Equal(t, "[{\"plugin_name\":\"temporal\",\"error_message\":\"\",\"status_code\":200}]", string(body))
85+
assert.Equal(t, http.StatusOK, resp.StatusCode)
86+
_ = resp.Body.Close()
87+
88+
req, err = http.NewRequestWithContext(context.Background(), http.MethodGet, "http://127.0.0.1:35544/ready?plugin=temporal", nil)
89+
require.NoError(t, err)
90+
91+
resp, err = clientStatus.Do(req)
92+
require.NoError(t, err)
93+
require.NotNil(t, resp)
94+
95+
body, _ = io.ReadAll(resp.Body)
96+
assert.Equal(t, "[{\"plugin_name\":\"temporal\",\"error_message\":\"\",\"status_code\":200}]", string(body))
97+
assert.Equal(t, http.StatusOK, resp.StatusCode)
98+
_ = resp.Body.Close()
99+
67100
w, err := s.Client.ExecuteWorkflow(
68101
context.Background(),
69102
client.StartWorkflowOptions{

tests/general/plugin_status_test.go

+110-110
Original file line numberDiff line numberDiff line change
@@ -1,117 +1,117 @@
11
package tests
22

33
import (
4-
"context"
5-
"io"
6-
"log/slog"
7-
"net/http"
8-
"os"
9-
"os/signal"
10-
"sync"
11-
"syscall"
12-
"testing"
13-
"time"
14-
15-
"github.com/roadrunner-server/config/v5"
16-
"github.com/roadrunner-server/endure/v2"
17-
"github.com/roadrunner-server/logger/v5"
18-
"github.com/roadrunner-server/server/v5"
19-
"github.com/roadrunner-server/status/v5"
20-
"github.com/stretchr/testify/require"
21-
rrtemporal "github.com/temporalio/roadrunner-temporal/v5"
22-
23-
"github.com/stretchr/testify/assert"
4+
"context"
5+
"io"
6+
"log/slog"
7+
"net/http"
8+
"os"
9+
"os/signal"
10+
"sync"
11+
"syscall"
12+
"testing"
13+
"time"
14+
15+
"github.com/roadrunner-server/config/v5"
16+
"github.com/roadrunner-server/endure/v2"
17+
"github.com/roadrunner-server/logger/v5"
18+
"github.com/roadrunner-server/server/v5"
19+
"github.com/roadrunner-server/status/v5"
20+
"github.com/stretchr/testify/require"
21+
rrtemporal "github.com/temporalio/roadrunner-temporal/v5"
22+
23+
"github.com/stretchr/testify/assert"
2424
)
2525

2626
func TestTemporalCheckStatus(t *testing.T) {
27-
cont := endure.New(slog.LevelDebug)
28-
29-
cfg := &config.Plugin{
30-
Version: "2023.3.0",
31-
Path: "../configs/.rr-status.yaml",
32-
}
33-
34-
err := cont.RegisterAll(
35-
cfg,
36-
&status.Plugin{},
37-
&logger.Plugin{},
38-
&rrtemporal.Plugin{},
39-
&server.Plugin{},
40-
)
41-
assert.NoError(t, err)
42-
43-
err = cont.Init()
44-
if err != nil {
45-
t.Fatal(err)
46-
}
47-
48-
ch, err := cont.Serve()
49-
assert.NoError(t, err)
50-
51-
sig := make(chan os.Signal, 1)
52-
signal.Notify(sig, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
53-
54-
wg := &sync.WaitGroup{}
55-
wg.Add(1)
56-
57-
stopCh := make(chan struct{}, 1)
58-
59-
go func() {
60-
defer wg.Done()
61-
for {
62-
select {
63-
case e := <-ch:
64-
assert.Fail(t, "error", e.Error.Error())
65-
err = cont.Stop()
66-
if err != nil {
67-
assert.FailNow(t, "error", err.Error())
68-
}
69-
case <-sig:
70-
err = cont.Stop()
71-
if err != nil {
72-
assert.FailNow(t, "error", err.Error())
73-
}
74-
return
75-
case <-stopCh:
76-
err = cont.Stop()
77-
if err != nil {
78-
assert.FailNow(t, "error", err.Error())
79-
}
80-
return
81-
}
82-
}
83-
}()
84-
85-
time.Sleep(time.Second)
86-
87-
client := &http.Client{
88-
Timeout: time.Second * 10,
89-
}
90-
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://127.0.0.1:35544/health?plugin=temporal", nil)
91-
require.NoError(t, err)
92-
93-
resp, err := client.Do(req)
94-
require.NoError(t, err)
95-
require.NotNil(t, resp)
96-
97-
body, _ := io.ReadAll(resp.Body)
98-
assert.Equal(t, "[{\"plugin_name\":\"temporal\",\"error_message\":\"\",\"status_code\":200}]", string(body))
99-
assert.Equal(t, http.StatusOK, resp.StatusCode)
100-
_ = resp.Body.Close()
101-
102-
req, err = http.NewRequestWithContext(context.Background(), http.MethodGet, "http://127.0.0.1:35544/ready?plugin=temporal", nil)
103-
require.NoError(t, err)
104-
105-
resp, err = client.Do(req)
106-
require.NoError(t, err)
107-
require.NotNil(t, resp)
108-
109-
body, _ = io.ReadAll(resp.Body)
110-
assert.Equal(t, "[{\"plugin_name\":\"temporal\",\"error_message\":\"\",\"status_code\":200}]", string(body))
111-
assert.Equal(t, http.StatusOK, resp.StatusCode)
112-
_ = resp.Body.Close()
113-
114-
stopCh <- struct{}{}
115-
116-
wg.Wait()
27+
cont := endure.New(slog.LevelDebug)
28+
29+
cfg := &config.Plugin{
30+
Version: "2023.3.0",
31+
Path: "../configs/.rr-status.yaml",
32+
}
33+
34+
err := cont.RegisterAll(
35+
cfg,
36+
&status.Plugin{},
37+
&logger.Plugin{},
38+
&rrtemporal.Plugin{},
39+
&server.Plugin{},
40+
)
41+
assert.NoError(t, err)
42+
43+
err = cont.Init()
44+
if err != nil {
45+
t.Fatal(err)
46+
}
47+
48+
ch, err := cont.Serve()
49+
assert.NoError(t, err)
50+
51+
sig := make(chan os.Signal, 1)
52+
signal.Notify(sig, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
53+
54+
wg := &sync.WaitGroup{}
55+
wg.Add(1)
56+
57+
stopCh := make(chan struct{}, 1)
58+
59+
go func() {
60+
defer wg.Done()
61+
for {
62+
select {
63+
case e := <-ch:
64+
assert.Fail(t, "error", e.Error.Error())
65+
err = cont.Stop()
66+
if err != nil {
67+
assert.FailNow(t, "error", err.Error())
68+
}
69+
case <-sig:
70+
err = cont.Stop()
71+
if err != nil {
72+
assert.FailNow(t, "error", err.Error())
73+
}
74+
return
75+
case <-stopCh:
76+
err = cont.Stop()
77+
if err != nil {
78+
assert.FailNow(t, "error", err.Error())
79+
}
80+
return
81+
}
82+
}
83+
}()
84+
85+
time.Sleep(time.Second)
86+
87+
client := &http.Client{
88+
Timeout: time.Second * 10,
89+
}
90+
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://127.0.0.1:35544/health?plugin=temporal", nil)
91+
require.NoError(t, err)
92+
93+
resp, err := client.Do(req)
94+
require.NoError(t, err)
95+
require.NotNil(t, resp)
96+
97+
body, _ := io.ReadAll(resp.Body)
98+
assert.Equal(t, "[{\"plugin_name\":\"temporal\",\"error_message\":\"\",\"status_code\":200}]", string(body))
99+
assert.Equal(t, http.StatusOK, resp.StatusCode)
100+
_ = resp.Body.Close()
101+
102+
req, err = http.NewRequestWithContext(context.Background(), http.MethodGet, "http://127.0.0.1:35544/ready?plugin=temporal", nil)
103+
require.NoError(t, err)
104+
105+
resp, err = client.Do(req)
106+
require.NoError(t, err)
107+
require.NotNil(t, resp)
108+
109+
body, _ = io.ReadAll(resp.Body)
110+
assert.Equal(t, "[{\"plugin_name\":\"temporal\",\"error_message\":\"\",\"status_code\":200}]", string(body))
111+
assert.Equal(t, http.StatusOK, resp.StatusCode)
112+
_ = resp.Body.Close()
113+
114+
stopCh <- struct{}{}
115+
116+
wg.Wait()
117117
}

tests/helpers/helpers.go

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"testing"
1212
"time"
1313

14+
"github.com/roadrunner-server/status/v5"
15+
1416
configImpl "github.com/roadrunner-server/config/v5"
1517
"github.com/roadrunner-server/endure/v2"
1618
"github.com/roadrunner-server/informer/v5"
@@ -111,6 +113,7 @@ func NewTestServer(t *testing.T, stopCh chan struct{}, wg *sync.WaitGroup, confi
111113
&informer.Plugin{},
112114
&server.Plugin{},
113115
&rpc.Plugin{},
116+
&status.Plugin{},
114117
)
115118

116119
assert.NoError(t, err)

0 commit comments

Comments
 (0)