@@ -6,6 +6,7 @@ package manager
66import (
77 "crypto/tls"
88 "encoding/json"
9+ "sync"
910 "time"
1011
1112 "github.com/pingcap/tiproxy/lib/config"
@@ -46,6 +47,8 @@ type JobManager interface {
4647var _ JobManager = (* jobManager )(nil )
4748
4849type jobManager struct {
50+ mu sync.Mutex
51+
4952 jobHistory []Job
5053 capture capture.Capture
5154 replay replay.Replay
@@ -100,6 +103,9 @@ func (jm *jobManager) runningJob() Job {
100103}
101104
102105func (jm * jobManager ) StartCapture (cfg capture.CaptureConfig ) error {
106+ jm .mu .Lock ()
107+ defer jm .mu .Unlock ()
108+
103109 running := jm .runningJob ()
104110 if running != nil {
105111 return errors .Errorf ("a job is running: %s" , running .String ())
@@ -121,6 +127,9 @@ func (jm *jobManager) StartCapture(cfg capture.CaptureConfig) error {
121127}
122128
123129func (jm * jobManager ) StartReplay (cfg replay.ReplayConfig ) error {
130+ jm .mu .Lock ()
131+ defer jm .mu .Unlock ()
132+
124133 running := jm .runningJob ()
125134 if running != nil {
126135 return errors .Errorf ("a job is running: %s" , running .String ())
@@ -174,6 +183,9 @@ func (jm *jobManager) GetCapture() capture.Capture {
174183}
175184
176185func (jm * jobManager ) Jobs () string {
186+ jm .mu .Lock ()
187+ defer jm .mu .Unlock ()
188+
177189 jm .updateProgress ()
178190 b , err := json .MarshalIndent (jm .jobHistory , "" , " " )
179191 if err != nil {
@@ -182,6 +194,8 @@ func (jm *jobManager) Jobs() string {
182194 return hack .String (b )
183195}
184196
197+ // Wait waits for the running job to finish.
198+ // As `Wait` is a blocking call, it'll not acquire the jobManager lock. For now it's only used in standalone player mode.
185199func (jm * jobManager ) Wait () {
186200 job := jm .runningJob ()
187201 if job == nil {
@@ -196,6 +210,9 @@ func (jm *jobManager) Wait() {
196210}
197211
198212func (jm * jobManager ) Stop (cfg CancelConfig ) string {
213+ jm .mu .Lock ()
214+ defer jm .mu .Unlock ()
215+
199216 job := jm .runningJob ()
200217 if job == nil {
201218 return "no job running"
@@ -214,6 +231,9 @@ func (jm *jobManager) Stop(cfg CancelConfig) string {
214231}
215232
216233func (jm * jobManager ) Close () {
234+ jm .mu .Lock ()
235+ defer jm .mu .Unlock ()
236+
217237 if jm .capture != nil {
218238 jm .capture .Close ()
219239 }
0 commit comments