github.com/matrixorigin/matrixone@v0.7.0/pkg/dnservice/factory.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 dnservice 16 17 import ( 18 "context" 19 20 "github.com/matrixorigin/matrixone/pkg/common/moerr" 21 "github.com/matrixorigin/matrixone/pkg/common/mpool" 22 "github.com/matrixorigin/matrixone/pkg/defines" 23 "github.com/matrixorigin/matrixone/pkg/fileservice" 24 "github.com/matrixorigin/matrixone/pkg/logservice" 25 "github.com/matrixorigin/matrixone/pkg/pb/metadata" 26 "github.com/matrixorigin/matrixone/pkg/txn/storage" 27 "github.com/matrixorigin/matrixone/pkg/txn/storage/mem" 28 "github.com/matrixorigin/matrixone/pkg/txn/storage/memorystorage" 29 taestorage "github.com/matrixorigin/matrixone/pkg/txn/storage/tae" 30 "github.com/matrixorigin/matrixone/pkg/vm/engine/memoryengine" 31 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/options" 32 "go.uber.org/zap" 33 ) 34 35 var ( 36 supportTxnStorageBackends = map[StorageType]struct{}{ 37 StorageMEMKV: {}, 38 StorageMEM: {}, 39 StorageTAE: {}, 40 } 41 ) 42 43 func (s *store) createTxnStorage(ctx context.Context, shard metadata.DNShard) (storage.TxnStorage, error) { 44 factory := s.createLogServiceClientFactroy(shard) 45 closeLogClientFn := func(logClient logservice.Client) { 46 if err := logClient.Close(); err != nil { 47 s.rt.Logger().Error("close log client failed", 48 zap.Error(err)) 49 } 50 } 51 52 switch s.cfg.Txn.Storage.Backend { 53 case StorageMEM: 54 logClient, err := factory() 55 if err != nil { 56 return nil, err 57 } 58 ts, err := s.newMemTxnStorage(shard, logClient, s.hakeeperClient) 59 if err != nil { 60 closeLogClientFn(logClient) 61 return nil, err 62 } 63 return ts, nil 64 65 case StorageMEMKV: 66 logClient, err := factory() 67 if err != nil { 68 return nil, err 69 } 70 return s.newMemKVStorage(shard, logClient) 71 72 case StorageTAE: 73 ts, err := s.newTAEStorage(shard, factory) 74 if err != nil { 75 return nil, err 76 } 77 return ts, nil 78 default: 79 return nil, moerr.NewInternalError(ctx, "not implment for %s", s.cfg.Txn.Storage.Backend) 80 } 81 } 82 83 func (s *store) createLogServiceClient(shard metadata.DNShard) (logservice.Client, error) { 84 if s.options.logServiceClientFactory != nil { 85 return s.options.logServiceClientFactory(shard) 86 } 87 return s.newLogServiceClient(shard) 88 } 89 90 func (s *store) createLogServiceClientFactroy(shard metadata.DNShard) logservice.ClientFactory { 91 return func() (logservice.Client, error) { 92 return s.createLogServiceClient(shard) 93 } 94 } 95 96 func (s *store) newLogServiceClient(shard metadata.DNShard) (logservice.Client, error) { 97 ctx, cancel := context.WithTimeout(context.Background(), s.cfg.LogService.ConnectTimeout.Duration) 98 defer cancel() 99 return logservice.NewClient(ctx, logservice.ClientConfig{ 100 ReadOnly: false, 101 LogShardID: shard.LogShardID, 102 DNReplicaID: shard.ReplicaID, 103 ServiceAddresses: s.cfg.HAKeeper.ClientConfig.ServiceAddresses, 104 MaxMessageSize: int(s.cfg.RPC.MaxMessageSize), 105 }) 106 } 107 108 func (s *store) newMemTxnStorage( 109 shard metadata.DNShard, 110 logClient logservice.Client, 111 hakeeper logservice.DNHAKeeperClient, 112 ) (storage.TxnStorage, error) { 113 // should it be no fixed or a certain size? 114 mp, err := mpool.NewMPool("mem_txn_storge", 0, mpool.NoFixed) 115 if err != nil { 116 return nil, err 117 } 118 return memorystorage.NewMemoryStorage( 119 mp, 120 s.rt.Clock(), 121 memoryengine.NewHakeeperIDGenerator(hakeeper), 122 ) 123 } 124 125 func (s *store) newMemKVStorage(shard metadata.DNShard, logClient logservice.Client) (storage.TxnStorage, error) { 126 return mem.NewKVTxnStorage(0, logClient, s.rt.Clock()), nil 127 } 128 129 func (s *store) newTAEStorage(shard metadata.DNShard, factory logservice.ClientFactory) (storage.TxnStorage, error) { 130 ckpcfg := &options.CheckpointCfg{ 131 MinCount: s.cfg.Ckp.MinCount, 132 ScanInterval: s.cfg.Ckp.ScanInterval.Duration, 133 FlushInterval: s.cfg.Ckp.FlushInterval.Duration, 134 IncrementalInterval: s.cfg.Ckp.IncrementalInterval.Duration, 135 GlobalMinCount: s.cfg.Ckp.GlobalMinCount, 136 } 137 logtailServerAddr := s.cfg.LogtailServer.ListenAddress 138 logtailServerCfg := &options.LogtailServerCfg{ 139 RpcMaxMessageSize: int64(s.cfg.LogtailServer.RpcMaxMessageSize), 140 RpcPayloadCopyBufferSize: int64(s.cfg.LogtailServer.RpcPayloadCopyBufferSize), 141 RpcEnableChecksum: s.cfg.LogtailServer.RpcEnableChecksum, 142 LogtailCollectInterval: s.cfg.LogtailServer.LogtailCollectInterval.Duration, 143 ResponseSendTimeout: s.cfg.LogtailServer.LogtailResponseSendTimeout.Duration, 144 MaxLogtailFetchFailure: s.cfg.LogtailServer.MaxLogtailFetchFailure, 145 } 146 147 // use s3 as main fs 148 fs, err := fileservice.Get[fileservice.FileService](s.fileService, defines.SharedFileServiceName) 149 if err != nil { 150 return nil, err 151 } 152 153 return taestorage.NewTAEStorage( 154 s.cfg.Txn.Storage.dataDir, 155 shard, 156 factory, 157 fs, 158 s.rt, 159 ckpcfg, 160 logtailServerAddr, 161 logtailServerCfg, 162 options.LogstoreType(s.cfg.Txn.Storage.LogBackend)) 163 }