Skip to content

Commit a5bc933

Browse files
authored
sqlreplay, api: add privilege argument to the cancel traffic api (#741)
1 parent b680fa3 commit a5bc933

File tree

6 files changed

+36
-16
lines changed

6 files changed

+36
-16
lines changed

pkg/server/api/traffic.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/gin-gonic/gin"
1313
"github.com/pingcap/tiproxy/pkg/sqlreplay/capture"
14+
"github.com/pingcap/tiproxy/pkg/sqlreplay/manager"
1415
"github.com/pingcap/tiproxy/pkg/sqlreplay/replay"
1516
"go.uber.org/zap"
1617
)
@@ -115,7 +116,17 @@ func (h *Server) TrafficCancel(c *gin.Context) {
115116
return
116117
}
117118

118-
result := h.mgr.ReplayJobMgr.Stop()
119+
cfg := manager.CancelConfig{}
120+
cfg.Type = manager.Capture | manager.Replay
121+
if tp := c.PostForm("type"); tp != "" {
122+
switch strings.ToLower(tp) {
123+
case "capture":
124+
cfg.Type = manager.Capture
125+
case "replay":
126+
cfg.Type = manager.Replay
127+
}
128+
}
129+
result := h.mgr.ReplayJobMgr.Stop(cfg)
119130
c.String(http.StatusOK, result)
120131
}
121132

pkg/server/api/traffic_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ func (m *mockReplayJobManager) StartReplay(replayCfg replay.ReplayConfig) error
201201
return nil
202202
}
203203

204-
func (m *mockReplayJobManager) Stop() string {
204+
func (m *mockReplayJobManager) Stop(manager.CancelConfig) string {
205205
m.curJob = ""
206206
return "stopped"
207207
}

pkg/sqlreplay/manager/job.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ import (
1313
"github.com/siddontang/go/hack"
1414
)
1515

16-
type jobType int
16+
type JobType int
1717

1818
const (
19-
Capture jobType = iota
19+
Capture JobType = 1 << iota
2020
Replay
2121
)
2222

2323
type Job interface {
24-
Type() jobType
24+
Type() JobType
2525
String() string
2626
MarshalJSON() ([]byte, error)
2727
SetProgress(progress float64, endTime time.Time, done bool, err error)
@@ -89,7 +89,7 @@ type captureJob struct {
8989
cfg capture.CaptureConfig
9090
}
9191

92-
func (job *captureJob) Type() jobType {
92+
func (job *captureJob) Type() JobType {
9393
return Capture
9494
}
9595

@@ -116,7 +116,7 @@ type replayJob struct {
116116
cfg replay.ReplayConfig
117117
}
118118

119-
func (job *replayJob) Type() jobType {
119+
func (job *replayJob) Type() JobType {
120120
return Replay
121121
}
122122

pkg/sqlreplay/manager/job_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
func TestIsRunning(t *testing.T) {
1717
tests := []struct {
1818
job Job
19-
tp jobType
19+
tp JobType
2020
running bool
2121
}{
2222
{

pkg/sqlreplay/manager/manager.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ const (
2121
maxJobHistoryCount = 10
2222
)
2323

24+
type CancelConfig struct {
25+
Type JobType
26+
}
27+
2428
type CertManager interface {
2529
SQLTLS() *tls.Config
2630
}
@@ -29,7 +33,7 @@ type JobManager interface {
2933
StartCapture(capture.CaptureConfig) error
3034
StartReplay(replay.ReplayConfig) error
3135
GetCapture() capture.Capture
32-
Stop() string
36+
Stop(CancelConfig) string
3337
Jobs() string
3438
Close()
3539
}
@@ -158,11 +162,14 @@ func (jm *jobManager) Jobs() string {
158162
return hack.String(b)
159163
}
160164

161-
func (jm *jobManager) Stop() string {
165+
func (jm *jobManager) Stop(cfg CancelConfig) string {
162166
job := jm.runningJob()
163167
if job == nil {
164168
return "no job running"
165169
}
170+
if job.Type()&cfg.Type == 0 {
171+
return "no privilege to stop the job"
172+
}
166173
switch job.Type() {
167174
case Capture:
168175
jm.capture.Stop(errors.Errorf("manually stopped"))

pkg/sqlreplay/manager/manager_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,26 @@ func TestStartAndStop(t *testing.T) {
2222
cpt, rep := &mockCapture{}, &mockReplay{}
2323
mgr.capture, mgr.replay = cpt, rep
2424

25-
require.Contains(t, mgr.Stop(), "no job running")
25+
require.Contains(t, mgr.Stop(CancelConfig{Type: Capture | Replay}), "no job running")
2626
require.NotNil(t, mgr.GetCapture())
2727

2828
require.NoError(t, mgr.StartCapture(capture.CaptureConfig{}))
2929
require.Error(t, mgr.StartCapture(capture.CaptureConfig{}))
3030
require.Error(t, mgr.StartReplay(replay.ReplayConfig{}))
3131
require.Len(t, mgr.jobHistory, 1)
3232
require.NotEmpty(t, mgr.Jobs())
33-
require.Contains(t, mgr.Stop(), "stopped")
34-
require.Contains(t, mgr.Stop(), "no job running")
33+
require.Contains(t, mgr.Stop(CancelConfig{Type: Replay}), "no privilege to stop the job")
34+
require.Contains(t, mgr.Stop(CancelConfig{Type: Capture}), "stopped")
35+
require.Contains(t, mgr.Stop(CancelConfig{Type: Capture}), "no job running")
3536
require.Len(t, mgr.jobHistory, 1)
3637

3738
require.NoError(t, mgr.StartReplay(replay.ReplayConfig{}))
3839
require.Error(t, mgr.StartCapture(capture.CaptureConfig{}))
3940
require.Error(t, mgr.StartReplay(replay.ReplayConfig{}))
4041
require.Len(t, mgr.jobHistory, 2)
41-
require.Contains(t, mgr.Stop(), "stopped")
42-
require.Contains(t, mgr.Stop(), "no job running")
42+
require.Contains(t, mgr.Stop(CancelConfig{Type: Capture}), "no privilege to stop the job")
43+
require.Contains(t, mgr.Stop(CancelConfig{Type: Replay}), "stopped")
44+
require.Contains(t, mgr.Stop(CancelConfig{Type: Replay}), "no job running")
4345
require.Len(t, mgr.jobHistory, 2)
4446

4547
// Test that Jobs() also update progress.
@@ -144,7 +146,7 @@ func TestHistoryLen(t *testing.T) {
144146

145147
for i := 0; i < maxJobHistoryCount+1; i++ {
146148
require.NoError(t, mgr.StartCapture(capture.CaptureConfig{}))
147-
require.Contains(t, mgr.Stop(), "stopped")
149+
require.Contains(t, mgr.Stop(CancelConfig{Type: Capture}), "stopped")
148150
expectedLen := i + 1
149151
if expectedLen > maxJobHistoryCount {
150152
expectedLen = maxJobHistoryCount

0 commit comments

Comments
 (0)