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  }