Skip to content

Commit ad0e87c

Browse files
authored
sqlreplay: do not write traffic files if meta exists (#721)
1 parent 052bed0 commit ad0e87c

File tree

4 files changed

+33
-3
lines changed

4 files changed

+33
-3
lines changed

pkg/sqlreplay/capture/capture.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ func (cfg *CaptureConfig) Validate() error {
7272
if !st.IsDir() {
7373
return errors.New("output should be a directory")
7474
}
75+
err = store.PreCheckMeta(cfg.Output)
7576
} else if os.IsNotExist(err) {
7677
err = os.MkdirAll(cfg.Output, 0755)
7778
}

pkg/sqlreplay/capture/capture_test.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ import (
2121
)
2222

2323
func TestStartAndStop(t *testing.T) {
24+
dir := t.TempDir()
2425
cpt := NewCapture(zap.NewNop())
2526
defer cpt.Close()
2627

2728
packet := append([]byte{pnet.ComQuery.Byte()}, []byte("select 1")...)
2829
cpt.Capture(packet, time.Now(), 100, mockInitSession)
2930
writer := newMockWriter(store.WriterCfg{})
3031
cfg := CaptureConfig{
31-
Output: t.TempDir(),
32+
Output: dir,
3233
Duration: 10 * time.Second,
3334
cmdLogger: writer,
3435
}
@@ -48,25 +49,28 @@ func TestStartAndStop(t *testing.T) {
4849
require.Equal(t, len(data), len(writer.getData()))
4950

5051
// start capture again
52+
removeMeta(dir)
5153
require.NoError(t, cpt.Start(cfg))
5254
cpt.Capture(packet, time.Now(), 100, mockInitSession)
5355
cpt.Stop(nil)
5456
require.Greater(t, len(writer.getData()), len(data))
5557

5658
// duplicated start and stop
59+
removeMeta(dir)
5760
require.NoError(t, cpt.Start(cfg))
5861
require.Error(t, cpt.Start(cfg))
5962
cpt.Stop(nil)
6063
cpt.Stop(nil)
6164
}
6265

6366
func TestConcurrency(t *testing.T) {
67+
dir := t.TempDir()
6468
cpt := NewCapture(zap.NewNop())
6569
defer cpt.Close()
6670

6771
writer := newMockWriter(store.WriterCfg{})
6872
cfg := CaptureConfig{
69-
Output: t.TempDir(),
73+
Output: dir,
7074
Duration: 10 * time.Second,
7175
bufferCap: 12 * 1024,
7276
flushThreshold: 8 * 1024,
@@ -107,6 +111,7 @@ func TestConcurrency(t *testing.T) {
107111
cpt.Stop(nil)
108112
started = false
109113
} else {
114+
removeMeta(dir)
110115
require.NoError(t, cpt.Start(cfg))
111116
started = true
112117
}
@@ -292,14 +297,16 @@ func TestFilterCmds(t *testing.T) {
292297
},
293298
}
294299

300+
dir := t.TempDir()
295301
cfg := CaptureConfig{
296-
Output: t.TempDir(),
302+
Output: dir,
297303
Duration: 10 * time.Second,
298304
}
299305
for i, test := range tests {
300306
cpt := NewCapture(zap.NewNop())
301307
writer := newMockWriter(store.WriterCfg{})
302308
cfg.cmdLogger = writer
309+
removeMeta(dir)
303310
require.NoError(t, cpt.Start(cfg))
304311
cpt.Capture(test.packet, time.Now(), 100, func() (string, error) {
305312
return "init session 100", nil
@@ -322,3 +329,7 @@ func TestFilterCmds(t *testing.T) {
322329
cpt.Close()
323330
}
324331
}
332+
333+
func removeMeta(dir string) {
334+
_ = os.Remove(filepath.Join(dir, "meta"))
335+
}

pkg/sqlreplay/store/meta.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,12 @@ func (m *Meta) Read(path string) error {
5858
}
5959
return nil
6060
}
61+
62+
func PreCheckMeta(path string) error {
63+
filePath := filepath.Join(path, metaFile)
64+
_, err := os.Stat(filePath)
65+
if errors.Is(err, os.ErrNotExist) {
66+
return nil
67+
}
68+
return errors.Errorf("file %s already exists, please remove it before capture", filePath)
69+
}

pkg/sqlreplay/store/meta_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,12 @@ func TestMeta(t *testing.T) {
2929
require.NoError(t, os.Remove(filepath.Join(dir, metaFile)))
3030
require.Error(t, m3.Read(dir))
3131
}
32+
33+
func TestPrecheckMeta(t *testing.T) {
34+
dir := t.TempDir()
35+
require.NoError(t, PreCheckMeta(dir))
36+
f, err := os.Create(filepath.Join(dir, metaFile))
37+
require.NoError(t, err)
38+
require.NoError(t, f.Close())
39+
require.Error(t, PreCheckMeta(dir))
40+
}

0 commit comments

Comments
 (0)