@@ -12,16 +12,13 @@ import (
1212 "syscall"
1313 "time"
1414
15- "github.com/go-mysql-org/go-mysql/mysql"
1615 "github.com/pingcap/tiproxy/lib/config"
1716 "github.com/pingcap/tiproxy/lib/util/cmd"
18- "github.com/pingcap/tiproxy/pkg/balance/router"
1917 "github.com/pingcap/tiproxy/pkg/manager/cert"
2018 "github.com/pingcap/tiproxy/pkg/manager/id"
2119 "github.com/pingcap/tiproxy/pkg/manager/logger"
2220 "github.com/pingcap/tiproxy/pkg/manager/memory"
2321 "github.com/pingcap/tiproxy/pkg/proxy/backend"
24- pnet "github.com/pingcap/tiproxy/pkg/proxy/net"
2522 "github.com/pingcap/tiproxy/pkg/server/api"
2623 replaycmd "github.com/pingcap/tiproxy/pkg/sqlreplay/cmd"
2724 mgrrp "github.com/pingcap/tiproxy/pkg/sqlreplay/manager"
@@ -60,6 +57,7 @@ func main() {
6057 replayerCount := rootCmd .PersistentFlags ().Uint64 ("replayer-count" , 1 , "the total number of replayer instances running concurrently. Used only when dynamic-input is enabled." )
6158 replayerIndex := rootCmd .PersistentFlags ().Uint64 ("replayer-index" , 0 , "the index of this replayer instance. Used only when dynamic-input is enabled." )
6259 outputPath := rootCmd .PersistentFlags ().String ("output-path" , "" , "the file path to store replayed sql. Empty indicates do not output replayed sql." )
60+ serviceMode := rootCmd .PersistentFlags ().Bool ("service-mode" , false , "run replayer in service mode" )
6361
6462 rootCmd .RunE = func (cmd * cobra.Command , _ []string ) error {
6563 // set up general managers
@@ -84,9 +82,9 @@ func main() {
8482 memMgr .Start (context .Background ())
8583
8684 // create replay job manager
87- hsHandler := newStaticHandshakeHandler (* addr )
85+ hsHandler := backend . NewStaticHandshakeHandler (* addr )
8886 idMgr := id .NewIDManager ()
89- r := mgrrp .NewJobManager (lg , cfg , & nopCertManager {}, idMgr , hsHandler )
87+ r := mgrrp .NewJobManager (lg , cfg , & nopCertManager {}, idMgr , hsHandler , true )
9088
9189 // start api server
9290 mgrs := api.Managers {
@@ -105,6 +103,7 @@ func main() {
105103
106104 // set up signal handler
107105 ctx , cancel := context .WithCancel (context .Background ())
106+ closeCh := make (chan struct {})
108107 go func () {
109108 sc := make (chan os.Signal , 1 )
110109 signal .Notify (sc ,
@@ -118,34 +117,41 @@ func main() {
118117 r .Stop (mgrrp.CancelConfig {Type : mgrrp .Replay })
119118 case <- ctx .Done ():
120119 }
120+
121+ close (closeCh )
121122 }()
122123
123- // start replay
124- replayCfg := replay.ReplayConfig {
125- Input : * input ,
126- Speed : * speed ,
127- Username : * username ,
128- Password : * password ,
129- Format : * format ,
130- ReadOnly : * readonly ,
131- StartTime : time .Now (),
132- CommandStartTime : * cmdStartTime ,
133- CommandEndTime : * cmdEndTime ,
134- IgnoreErrs : * ignoreErrs ,
135- BufSize : * bufSize ,
136- PSCloseStrategy : replaycmd .PSCloseStrategy (* psCloseStrategy ),
137- DryRun : * dryRun ,
138- CheckPointFilePath : * checkPointFilePath ,
139- DynamicInput : * dynamicInput ,
140- ReplayerCount : * replayerCount ,
141- ReplayerIndex : * replayerIndex ,
142- OutputPath : * outputPath ,
143- }
144- if err := r .StartReplay (replayCfg ); err != nil {
145- cancel ()
146- return err
124+ if * serviceMode {
125+ // In this case, we didn't start any replay job. Just need to wait for the signal to exit.
126+ <- closeCh
127+ } else {
128+ // start replay
129+ replayCfg := replay.ReplayConfig {
130+ Input : * input ,
131+ Speed : * speed ,
132+ Username : * username ,
133+ Password : * password ,
134+ Format : * format ,
135+ ReadOnly : * readonly ,
136+ StartTime : time .Now (),
137+ CommandStartTime : * cmdStartTime ,
138+ CommandEndTime : * cmdEndTime ,
139+ IgnoreErrs : * ignoreErrs ,
140+ BufSize : * bufSize ,
141+ PSCloseStrategy : replaycmd .PSCloseStrategy (* psCloseStrategy ),
142+ DryRun : * dryRun ,
143+ CheckPointFilePath : * checkPointFilePath ,
144+ DynamicInput : * dynamicInput ,
145+ ReplayerCount : * replayerCount ,
146+ ReplayerIndex : * replayerIndex ,
147+ OutputPath : * outputPath ,
148+ }
149+ if err := r .StartReplay (replayCfg ); err != nil {
150+ cancel ()
151+ return err
152+ }
153+ r .Wait ()
147154 }
148- r .Wait ()
149155
150156 cancel ()
151157 r .Close ()
@@ -166,46 +172,6 @@ func (c *nopCertManager) SQLTLS() *tls.Config {
166172 return nil
167173}
168174
169- type staticHandshakeHandler struct {
170- rt router.Router
171- }
172-
173- func newStaticHandshakeHandler (addr string ) * staticHandshakeHandler {
174- return & staticHandshakeHandler {
175- rt : router .NewStaticRouter ([]string {addr }),
176- }
177- }
178-
179- func (handler * staticHandshakeHandler ) HandleHandshakeResp (backend.ConnContext , * pnet.HandshakeResp ) error {
180- return nil
181- }
182-
183- func (handler * staticHandshakeHandler ) HandleHandshakeErr (backend.ConnContext , * mysql.MyError ) bool {
184- return false
185- }
186-
187- func (handler * staticHandshakeHandler ) GetRouter (backend.ConnContext , * pnet.HandshakeResp ) (router.Router , error ) {
188- return handler .rt , nil
189- }
190-
191- func (handler * staticHandshakeHandler ) OnHandshake (backend.ConnContext , string , error , backend.ErrorSource ) {
192- }
193-
194- func (handler * staticHandshakeHandler ) OnTraffic (backend.ConnContext ) {
195- }
196-
197- func (handler * staticHandshakeHandler ) OnConnClose (backend.ConnContext , backend.ErrorSource ) error {
198- return nil
199- }
200-
201- func (handler * staticHandshakeHandler ) GetCapability () pnet.Capability {
202- return backend .SupportedServerCapabilities
203- }
204-
205- func (handler * staticHandshakeHandler ) GetServerVersion () string {
206- return pnet .ServerVersion
207- }
208-
209175var _ api.ConfigManager = (* nopConfigManager )(nil )
210176
211177type nopConfigManager struct {
0 commit comments