@@ -19,12 +19,22 @@ import (
1919
2020 "github.com/fsouza/fake-gcs-server/fakestorage"
2121 backuppb "github.com/pingcap/kvproto/pkg/brpb"
22+ "github.com/pingcap/tidb/br/pkg/storage/recording"
2223 "github.com/pingcap/tidb/pkg/util/intest"
2324 "github.com/stretchr/testify/require"
2425 "golang.org/x/sync/errgroup"
2526)
2627
27- func TestGCS (t * testing.T ) {
28+ func CheckAccessStats (t * testing.T , rec * recording.AccessStats , expectedGets , expectedPuts , expectedRead , expectWrite int ) {
29+ t .Helper ()
30+ require .EqualValues (t , expectedGets , rec .Requests .Get .Load ())
31+ require .EqualValues (t , expectedPuts , rec .Requests .Put .Load ())
32+ require .EqualValues (t , expectedRead , rec .Traffic .Read .Load ())
33+ require .EqualValues (t , expectWrite , rec .Traffic .Write .Load ())
34+ }
35+
36+ func prepareGCSStore (t * testing.T , bucketName string , accessRec * recording.AccessStats ) (* fakestorage.Server , * GCSStorage ) {
37+ t .Helper ()
2838 require .True (t , intest .InTest )
2939 ctx := context .Background ()
3040
@@ -33,7 +43,6 @@ func TestGCS(t *testing.T) {
3343 }
3444 server , err := fakestorage .NewServerWithOptions (opts )
3545 require .NoError (t , err )
36- bucketName := "testbucket"
3746 server .CreateBucketWithOpts (fakestorage.CreateBucketOpts {Name : bucketName })
3847
3948 gcs := & backuppb.GCS {
@@ -47,10 +56,19 @@ func TestGCS(t *testing.T) {
4756 SendCredentials : false ,
4857 CheckPermissions : []Permission {AccessBuckets },
4958 HTTPClient : server .HTTPClient (),
59+ AccessRecording : accessRec ,
5060 })
5161 require .NoError (t , err )
62+ return server , stg
63+ }
64+
65+ func TestGCS (t * testing.T ) {
66+ require .True (t , intest .InTest )
67+ ctx := context .Background ()
68+ bucketName := "testbucket"
69+ server , stg := prepareGCSStore (t , bucketName , nil )
5270
53- err = stg .WriteFile (ctx , "key" , []byte ("data" ))
71+ err : = stg .WriteFile (ctx , "key" , []byte ("data" ))
5472 require .NoError (t , err )
5573
5674 err = stg .WriteFile (ctx , "key1" , []byte ("data1" ))
@@ -629,3 +647,29 @@ func TestDeleteFiles(t *testing.T) {
629647 require .NoError (t , err )
630648 require .NoError (t , stg .DeleteFiles (ctx , []string {filename , "not-exist-file" }))
631649}
650+
651+ func TestGCSAccessRecording (t * testing.T ) {
652+ ctx := context .Background ()
653+ accessRec := & recording.AccessStats {}
654+ _ , store := prepareGCSStore (t , "testbucket" , accessRec )
655+ require .NoError (t , store .WriteFile (ctx , "a.txt" , []byte ("hello" )))
656+ CheckAccessStats (t , accessRec , 0 , 1 , 0 , 5 )
657+ _ , err := store .ReadFile (ctx , "a.txt" )
658+ require .NoError (t , err )
659+ CheckAccessStats (t , accessRec , 1 , 1 , 5 , 5 )
660+ writer , err := store .Create (ctx , "b.txt" , nil )
661+ require .NoError (t , err )
662+ _ , err = writer .Write (ctx , []byte (" world!" ))
663+ require .NoError (t , err )
664+ require .NoError (t , writer .Close (ctx ))
665+ CheckAccessStats (t , accessRec , 1 , 2 , 5 , 12 )
666+ reader , err := store .Open (ctx , "b.txt" , nil )
667+ require .NoError (t , err )
668+ buf := make ([]byte , 20 )
669+ n , err := reader .Read (buf )
670+ require .NoError (t , err )
671+ require .Equal (t , 7 , n )
672+ require .NoError (t , reader .Close ())
673+ // Open will use 2 get, one for get file size.
674+ CheckAccessStats (t , accessRec , 3 , 2 , 12 , 12 )
675+ }
0 commit comments