github.com/matrixorigin/matrixone@v0.7.0/pkg/logservice/store_metadata_test.go (about) 1 // Copyright 2021 - 2022 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package logservice 16 17 import ( 18 "testing" 19 "time" 20 21 "github.com/lni/dragonboat/v4" 22 "github.com/lni/vfs" 23 "github.com/stretchr/testify/assert" 24 "github.com/stretchr/testify/require" 25 26 "github.com/matrixorigin/matrixone/pkg/common/runtime" 27 "github.com/matrixorigin/matrixone/pkg/pb/metadata" 28 ) 29 30 func TestHasMetadataRec(t *testing.T) { 31 cfg := getStoreTestConfig() 32 defer vfs.ReportLeakedFD(cfg.FS, t) 33 cfg.Fill() 34 s := store{cfg: cfg} 35 s.addMetadata(10, 1) 36 has, err := hasMetadataRec(s.cfg.DataDir, logMetadataFilename, 10, 1, s.cfg.FS) 37 require.NoError(t, err) 38 assert.True(t, has) 39 has, err = hasMetadataRec(s.cfg.DataDir, logMetadataFilename, 1, 1, s.cfg.FS) 40 require.NoError(t, err) 41 assert.False(t, has) 42 } 43 44 func TestAddMetadata(t *testing.T) { 45 cfg := getStoreTestConfig() 46 defer vfs.ReportLeakedFD(cfg.FS, t) 47 cfg.Fill() 48 s := store{cfg: cfg} 49 require.NoError(t, mkdirAll(s.cfg.DataDir, cfg.FS)) 50 s.addMetadata(10, 1) 51 ss := store{cfg: s.cfg} 52 ss.mu.metadata = metadata.LogStore{} 53 assert.NoError(t, ss.loadMetadata()) 54 require.Equal(t, 1, len(ss.mu.metadata.Shards)) 55 assert.Equal(t, uint64(10), ss.mu.metadata.Shards[0].ShardID) 56 assert.Equal(t, uint64(1), ss.mu.metadata.Shards[0].ReplicaID) 57 } 58 59 func TestAddMetadataRejectDupl(t *testing.T) { 60 cfg := getStoreTestConfig() 61 defer vfs.ReportLeakedFD(cfg.FS, t) 62 cfg.Fill() 63 s := store{cfg: cfg, runtime: runtime.DefaultRuntime()} 64 require.NoError(t, mkdirAll(s.cfg.DataDir, cfg.FS)) 65 s.addMetadata(10, 1) 66 s.addMetadata(10, 1) 67 s.addMetadata(10, 1) 68 require.Equal(t, 1, len(s.mu.metadata.Shards)) 69 } 70 71 func TestRemoveMetadata(t *testing.T) { 72 cfg := getStoreTestConfig() 73 defer vfs.ReportLeakedFD(cfg.FS, t) 74 cfg.Fill() 75 s := store{cfg: cfg, runtime: runtime.DefaultRuntime()} 76 require.NoError(t, mkdirAll(s.cfg.DataDir, cfg.FS)) 77 s.addMetadata(10, 1) 78 s.addMetadata(20, 2) 79 s.removeMetadata(10, 1) 80 ss := store{cfg: s.cfg, runtime: runtime.DefaultRuntime()} 81 ss.mu.metadata = metadata.LogStore{} 82 assert.NoError(t, ss.loadMetadata()) 83 require.Equal(t, 1, len(ss.mu.metadata.Shards)) 84 assert.Equal(t, uint64(20), ss.mu.metadata.Shards[0].ShardID) 85 assert.Equal(t, uint64(2), ss.mu.metadata.Shards[0].ReplicaID) 86 } 87 88 func TestStartReplicas(t *testing.T) { 89 cfg := getStoreTestConfig() 90 defer vfs.ReportLeakedFD(cfg.FS, t) 91 cfg.Fill() 92 require.NoError(t, mkdirAll(cfg.DataDir, cfg.FS)) 93 func() { 94 store, err := getTestStore(cfg, false, nil) 95 require.NoError(t, err) 96 members := make(map[uint64]dragonboat.Target) 97 members[1] = store.id() 98 defer func() { 99 require.NoError(t, store.close()) 100 }() 101 require.NoError(t, store.startReplica(10, 1, members, false)) 102 require.NoError(t, store.startReplica(20, 1, members, false)) 103 }() 104 105 store, err := getTestStore(cfg, false, nil) 106 require.NoError(t, err) 107 defer func() { 108 require.NoError(t, store.close()) 109 }() 110 require.NoError(t, store.loadMetadata()) 111 require.NoError(t, store.startReplicas()) 112 done := false 113 for i := 0; i < 1000; i++ { 114 hb := store.getHeartbeatMessage() 115 if len(hb.Replicas) != 2 { 116 time.Sleep(10 * time.Millisecond) 117 continue 118 } 119 done = true 120 } 121 if !done { 122 t.Fatalf("failed to start all replicas") 123 } 124 }