go.temporal.io/server@v1.23.0/common/persistence/client/fault_injection.go (about)

     1  // The MIT License
     2  //
     3  // Copyright (c) 2020 Temporal Technologies Inc.  All rights reserved.
     4  //
     5  // Copyright (c) 2020 Uber Technologies, Inc.
     6  //
     7  // Permission is hereby granted, free of charge, to any person obtaining a copy
     8  // of this software and associated documentation files (the "Software"), to deal
     9  // in the Software without restriction, including without limitation the rights
    10  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    11  // copies of the Software, and to permit persons to whom the Software is
    12  // furnished to do so, subject to the following conditions:
    13  //
    14  // The above copyright notice and this permission notice shall be included in
    15  // all copies or substantial portions of the Software.
    16  //
    17  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    18  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    19  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    20  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    21  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    22  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    23  // THE SOFTWARE.
    24  
    25  package client
    26  
    27  import (
    28  	"context"
    29  	"fmt"
    30  
    31  	commonpb "go.temporal.io/api/common/v1"
    32  	enumspb "go.temporal.io/api/enums/v1"
    33  	"go.temporal.io/api/serviceerror"
    34  
    35  	"go.temporal.io/server/common/config"
    36  	"go.temporal.io/server/common/persistence"
    37  )
    38  
    39  type (
    40  	FaultInjectionDataStoreFactory struct {
    41  		baseFactory    DataStoreFactory
    42  		config         *config.FaultInjection
    43  		ErrorGenerator ErrorGenerator
    44  
    45  		TaskStore      *FaultInjectionTaskStore
    46  		ShardStore     *FaultInjectionShardStore
    47  		MetadataStore  *FaultInjectionMetadataStore
    48  		ExecutionStore *FaultInjectionExecutionStore
    49  		Queue          *FaultInjectionQueue
    50  		QueueV2        *FaultInjectionQueueV2
    51  		ClusterMDStore *FaultInjectionClusterMetadataStore
    52  	}
    53  
    54  	FaultInjectionShardStore struct {
    55  		baseShardStore persistence.ShardStore
    56  		ErrorGenerator ErrorGenerator
    57  	}
    58  
    59  	FaultInjectionTaskStore struct {
    60  		baseTaskStore  persistence.TaskStore
    61  		ErrorGenerator ErrorGenerator
    62  	}
    63  
    64  	FaultInjectionMetadataStore struct {
    65  		baseMetadataStore persistence.MetadataStore
    66  		ErrorGenerator    ErrorGenerator
    67  	}
    68  
    69  	FaultInjectionClusterMetadataStore struct {
    70  		baseCMStore    persistence.ClusterMetadataStore
    71  		ErrorGenerator ErrorGenerator
    72  	}
    73  
    74  	FaultInjectionExecutionStore struct {
    75  		persistence.HistoryBranchUtilImpl
    76  		baseExecutionStore persistence.ExecutionStore
    77  		ErrorGenerator     ErrorGenerator
    78  	}
    79  
    80  	FaultInjectionQueue struct {
    81  		baseQueue      persistence.Queue
    82  		ErrorGenerator ErrorGenerator
    83  	}
    84  
    85  	FaultInjectionQueueV2 struct {
    86  		baseQueue      persistence.QueueV2
    87  		ErrorGenerator ErrorGenerator
    88  	}
    89  )
    90  
    91  // from errors.go ConvertError
    92  var defaultErrors = []FaultWeight{
    93  	{
    94  		errFactory: func(msg string) error {
    95  			return serviceerror.NewUnavailable(fmt.Sprintf("serviceerror.NewUnavailable: %s", msg))
    96  		},
    97  		weight: 1,
    98  	},
    99  	{
   100  		errFactory: func(msg string) error {
   101  			return &persistence.TimeoutError{Msg: fmt.Sprintf("persistence.TimeoutError: %s", msg)}
   102  		},
   103  		weight: 1,
   104  	},
   105  	{
   106  		errFactory: func(msg string) error {
   107  			return serviceerror.NewResourceExhausted(enumspb.RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED,
   108  				fmt.Sprintf("serviceerror.NewResourceExhausted: %s", msg))
   109  		},
   110  		weight: 1,
   111  	},
   112  }
   113  
   114  func newErrorGenerator(rate float64, errorWeights []FaultWeight) ErrorGenerator {
   115  	return NewDefaultErrorGenerator(rate, errorWeights)
   116  }
   117  
   118  func NewFaultInjectionDatastoreFactory(
   119  	config *config.FaultInjection,
   120  	baseFactory DataStoreFactory,
   121  ) *FaultInjectionDataStoreFactory {
   122  	errorGenerator := newErrorGenerator(
   123  		config.Rate,
   124  		[]FaultWeight{
   125  			{
   126  				errFactory: func(data string) error { return fmt.Errorf("FaultInjectionDataStoreFactory: %s", data) },
   127  				weight:     1,
   128  			},
   129  		},
   130  	)
   131  	return &FaultInjectionDataStoreFactory{
   132  		baseFactory:    baseFactory,
   133  		config:         config,
   134  		ErrorGenerator: errorGenerator,
   135  	}
   136  }
   137  
   138  func (d *FaultInjectionDataStoreFactory) Close() {
   139  	d.baseFactory.Close()
   140  }
   141  
   142  func (d *FaultInjectionDataStoreFactory) UpdateRate(rate float64) {
   143  	d.ErrorGenerator.UpdateRate(rate)
   144  	d.TaskStore.UpdateRate(rate)
   145  	d.ShardStore.UpdateRate(rate)
   146  	d.MetadataStore.UpdateRate(rate)
   147  	d.ExecutionStore.UpdateRate(rate)
   148  	d.Queue.UpdateRate(rate)
   149  	d.ClusterMDStore.UpdateRate(rate)
   150  }
   151  
   152  func (d *FaultInjectionDataStoreFactory) NewTaskStore() (persistence.TaskStore, error) {
   153  	if d.TaskStore == nil {
   154  		baseFactory, err := d.baseFactory.NewTaskStore()
   155  		if err != nil {
   156  			return nil, err
   157  		}
   158  		if storeConfig, ok := d.config.Targets.DataStores[config.TaskStoreName]; ok {
   159  			d.TaskStore = &FaultInjectionTaskStore{
   160  				baseTaskStore:  baseFactory,
   161  				ErrorGenerator: NewTargetedDataStoreErrorGenerator(&storeConfig),
   162  			}
   163  		} else {
   164  			d.TaskStore, err = NewFaultInjectionTaskStore(d.ErrorGenerator.Rate(), baseFactory)
   165  			if err != nil {
   166  				return nil, err
   167  			}
   168  		}
   169  	}
   170  	return d.TaskStore, nil
   171  }
   172  
   173  func (d *FaultInjectionDataStoreFactory) NewShardStore() (persistence.ShardStore, error) {
   174  	if d.ShardStore == nil {
   175  		baseFactory, err := d.baseFactory.NewShardStore()
   176  		if err != nil {
   177  			return nil, err
   178  		}
   179  		if storeConfig, ok := d.config.Targets.DataStores[config.ShardStoreName]; ok {
   180  			d.ShardStore = &FaultInjectionShardStore{
   181  				baseShardStore: baseFactory,
   182  				ErrorGenerator: NewTargetedDataStoreErrorGenerator(&storeConfig),
   183  			}
   184  		} else {
   185  			d.ShardStore, err = NewFaultInjectionShardStore(d.ErrorGenerator.Rate(), baseFactory)
   186  			if err != nil {
   187  				return nil, err
   188  			}
   189  		}
   190  	}
   191  	return d.ShardStore, nil
   192  }
   193  func (d *FaultInjectionDataStoreFactory) NewMetadataStore() (persistence.MetadataStore, error) {
   194  	if d.MetadataStore == nil {
   195  		baseStore, err := d.baseFactory.NewMetadataStore()
   196  		if err != nil {
   197  			return nil, err
   198  		}
   199  		if storeConfig, ok := d.config.Targets.DataStores[config.MetadataStoreName]; ok {
   200  			d.MetadataStore = &FaultInjectionMetadataStore{
   201  				baseMetadataStore: baseStore,
   202  				ErrorGenerator:    NewTargetedDataStoreErrorGenerator(&storeConfig),
   203  			}
   204  		} else {
   205  			d.MetadataStore, err = NewFaultInjectionMetadataStore(d.ErrorGenerator.Rate(), baseStore)
   206  			if err != nil {
   207  				return nil, err
   208  			}
   209  		}
   210  	}
   211  	return d.MetadataStore, nil
   212  }
   213  
   214  func (d *FaultInjectionDataStoreFactory) NewExecutionStore() (persistence.ExecutionStore, error) {
   215  	if d.ExecutionStore == nil {
   216  		baseStore, err := d.baseFactory.NewExecutionStore()
   217  		if err != nil {
   218  			return nil, err
   219  		}
   220  		if storeConfig, ok := d.config.Targets.DataStores[config.ExecutionStoreName]; ok {
   221  			d.ExecutionStore = &FaultInjectionExecutionStore{
   222  				baseExecutionStore: baseStore,
   223  				ErrorGenerator:     NewTargetedDataStoreErrorGenerator(&storeConfig),
   224  			}
   225  		} else {
   226  			d.ExecutionStore, err = NewFaultInjectionExecutionStore(d.ErrorGenerator.Rate(), baseStore)
   227  			if err != nil {
   228  				return nil, err
   229  			}
   230  		}
   231  
   232  	}
   233  	return d.ExecutionStore, nil
   234  }
   235  
   236  func (d *FaultInjectionDataStoreFactory) NewQueue(queueType persistence.QueueType) (persistence.Queue, error) {
   237  	if d.Queue == nil {
   238  		baseQueue, err := d.baseFactory.NewQueue(queueType)
   239  		if err != nil {
   240  			return baseQueue, err
   241  		}
   242  		if storeConfig, ok := d.config.Targets.DataStores[config.QueueName]; ok {
   243  			d.Queue = &FaultInjectionQueue{
   244  				baseQueue:      baseQueue,
   245  				ErrorGenerator: NewTargetedDataStoreErrorGenerator(&storeConfig),
   246  			}
   247  		} else {
   248  			d.Queue, err = NewFaultInjectionQueue(d.ErrorGenerator.Rate(), baseQueue)
   249  			if err != nil {
   250  				return nil, err
   251  			}
   252  		}
   253  	}
   254  	return d.Queue, nil
   255  }
   256  
   257  func (d *FaultInjectionDataStoreFactory) NewQueueV2() (persistence.QueueV2, error) {
   258  	if d.QueueV2 == nil {
   259  		baseQueue, err := d.baseFactory.NewQueueV2()
   260  		if err != nil {
   261  			return baseQueue, err
   262  		}
   263  		if storeConfig, ok := d.config.Targets.DataStores[config.QueueV2Name]; ok {
   264  			d.QueueV2 = &FaultInjectionQueueV2{
   265  				baseQueue:      baseQueue,
   266  				ErrorGenerator: NewTargetedDataStoreErrorGenerator(&storeConfig),
   267  			}
   268  		} else {
   269  			d.QueueV2 = NewFaultInjectionQueueV2(d.ErrorGenerator.Rate(), baseQueue)
   270  		}
   271  	}
   272  	return d.QueueV2, nil
   273  }
   274  
   275  func (d *FaultInjectionDataStoreFactory) NewClusterMetadataStore() (persistence.ClusterMetadataStore, error) {
   276  	if d.ClusterMDStore == nil {
   277  		baseStore, err := d.baseFactory.NewClusterMetadataStore()
   278  		if err != nil {
   279  			return nil, err
   280  		}
   281  		if storeConfig, ok := d.config.Targets.DataStores[config.ClusterMDStoreName]; ok {
   282  			d.ClusterMDStore = &FaultInjectionClusterMetadataStore{
   283  				baseCMStore:    baseStore,
   284  				ErrorGenerator: NewTargetedDataStoreErrorGenerator(&storeConfig),
   285  			}
   286  		} else {
   287  			d.ClusterMDStore, err = NewFaultInjectionClusterMetadataStore(d.ErrorGenerator.Rate(), baseStore)
   288  			if err != nil {
   289  				return nil, err
   290  			}
   291  		}
   292  
   293  	}
   294  	return d.ClusterMDStore, nil
   295  }
   296  
   297  func NewFaultInjectionQueue(rate float64, baseQueue persistence.Queue) (*FaultInjectionQueue, error) {
   298  	errorGenerator := newErrorGenerator(rate,
   299  		append(defaultErrors,
   300  			FaultWeight{
   301  				errFactory: func(msg string) error {
   302  					return &persistence.ShardOwnershipLostError{
   303  						ShardID: -1,
   304  						Msg:     fmt.Sprintf("FaultInjectionQueue injected, %s", msg),
   305  					}
   306  				},
   307  				weight: 1,
   308  			},
   309  		),
   310  	)
   311  
   312  	return &FaultInjectionQueue{
   313  		baseQueue:      baseQueue,
   314  		ErrorGenerator: errorGenerator,
   315  	}, nil
   316  }
   317  
   318  func (q *FaultInjectionQueue) Close() {
   319  	q.baseQueue.Close()
   320  }
   321  
   322  func (q *FaultInjectionQueue) Init(
   323  	ctx context.Context,
   324  	blob *commonpb.DataBlob,
   325  ) error {
   326  	// potentially Init can return golang errors from blob.go encode/decode.
   327  	if err := q.ErrorGenerator.Generate(); err != nil {
   328  		return err
   329  	}
   330  	return q.baseQueue.Init(ctx, blob)
   331  }
   332  
   333  func (q *FaultInjectionQueue) EnqueueMessage(
   334  	ctx context.Context,
   335  	blob *commonpb.DataBlob,
   336  ) error {
   337  	if err := q.ErrorGenerator.Generate(); err != nil {
   338  		return err
   339  	}
   340  	return q.baseQueue.EnqueueMessage(ctx, blob)
   341  }
   342  
   343  func (q *FaultInjectionQueue) ReadMessages(
   344  	ctx context.Context,
   345  	lastMessageID int64,
   346  	maxCount int,
   347  ) ([]*persistence.QueueMessage, error) {
   348  	if err := q.ErrorGenerator.Generate(); err != nil {
   349  		return nil, err
   350  	}
   351  	return q.baseQueue.ReadMessages(ctx, lastMessageID, maxCount)
   352  }
   353  
   354  func (q *FaultInjectionQueue) DeleteMessagesBefore(
   355  	ctx context.Context,
   356  	messageID int64,
   357  ) error {
   358  	if err := q.ErrorGenerator.Generate(); err != nil {
   359  		return err
   360  	}
   361  	return q.baseQueue.DeleteMessagesBefore(ctx, messageID)
   362  }
   363  
   364  func (q *FaultInjectionQueue) UpdateAckLevel(
   365  	ctx context.Context,
   366  	metadata *persistence.InternalQueueMetadata,
   367  ) error {
   368  	if err := q.ErrorGenerator.Generate(); err != nil {
   369  		return err
   370  	}
   371  	return q.baseQueue.UpdateAckLevel(ctx, metadata)
   372  }
   373  
   374  func (q *FaultInjectionQueue) GetAckLevels(
   375  	ctx context.Context,
   376  ) (*persistence.InternalQueueMetadata, error) {
   377  	if err := q.ErrorGenerator.Generate(); err != nil {
   378  		return nil, err
   379  	}
   380  	return q.baseQueue.GetAckLevels(ctx)
   381  }
   382  
   383  func (q *FaultInjectionQueue) EnqueueMessageToDLQ(
   384  	ctx context.Context,
   385  	blob *commonpb.DataBlob,
   386  ) (int64, error) {
   387  	if err := q.ErrorGenerator.Generate(); err != nil {
   388  		return 0, err
   389  	}
   390  	return q.baseQueue.EnqueueMessageToDLQ(ctx, blob)
   391  }
   392  
   393  func (q *FaultInjectionQueue) ReadMessagesFromDLQ(
   394  	ctx context.Context,
   395  	firstMessageID int64,
   396  	lastMessageID int64,
   397  	pageSize int,
   398  	pageToken []byte,
   399  ) ([]*persistence.QueueMessage, []byte, error) {
   400  	if err := q.ErrorGenerator.Generate(); err != nil {
   401  		return nil, nil, err
   402  	}
   403  	return q.baseQueue.ReadMessagesFromDLQ(ctx, firstMessageID, lastMessageID, pageSize, pageToken)
   404  }
   405  
   406  func (q *FaultInjectionQueue) DeleteMessageFromDLQ(
   407  	ctx context.Context,
   408  	messageID int64,
   409  ) error {
   410  	if err := q.ErrorGenerator.Generate(); err != nil {
   411  		return err
   412  	}
   413  	return q.baseQueue.DeleteMessageFromDLQ(ctx, messageID)
   414  }
   415  
   416  func (q *FaultInjectionQueue) RangeDeleteMessagesFromDLQ(
   417  	ctx context.Context,
   418  	firstMessageID int64,
   419  	lastMessageID int64,
   420  ) error {
   421  	if err := q.ErrorGenerator.Generate(); err != nil {
   422  		return err
   423  	}
   424  	return q.baseQueue.RangeDeleteMessagesFromDLQ(ctx, firstMessageID, lastMessageID)
   425  }
   426  
   427  func (q *FaultInjectionQueue) UpdateDLQAckLevel(
   428  	ctx context.Context,
   429  	metadata *persistence.InternalQueueMetadata,
   430  ) error {
   431  	if err := q.ErrorGenerator.Generate(); err != nil {
   432  		return err
   433  	}
   434  	return q.baseQueue.UpdateDLQAckLevel(ctx, metadata)
   435  }
   436  
   437  func (q *FaultInjectionQueue) GetDLQAckLevels(
   438  	ctx context.Context,
   439  ) (*persistence.InternalQueueMetadata, error) {
   440  	if err := q.ErrorGenerator.Generate(); err != nil {
   441  		return nil, err
   442  	}
   443  	return q.baseQueue.GetDLQAckLevels(ctx)
   444  }
   445  
   446  func (q *FaultInjectionQueue) UpdateRate(rate float64) {
   447  	q.ErrorGenerator.UpdateRate(rate)
   448  }
   449  
   450  func NewFaultInjectionQueueV2(rate float64, baseQueue persistence.QueueV2) *FaultInjectionQueueV2 {
   451  	errorGenerator := newErrorGenerator(rate, defaultErrors)
   452  
   453  	return &FaultInjectionQueueV2{
   454  		baseQueue:      baseQueue,
   455  		ErrorGenerator: errorGenerator,
   456  	}
   457  }
   458  
   459  func (f *FaultInjectionQueueV2) EnqueueMessage(
   460  	ctx context.Context,
   461  	request *persistence.InternalEnqueueMessageRequest,
   462  ) (*persistence.InternalEnqueueMessageResponse, error) {
   463  	if err := f.ErrorGenerator.Generate(); err != nil {
   464  		return nil, err
   465  	}
   466  	return f.baseQueue.EnqueueMessage(ctx, request)
   467  }
   468  
   469  func (f *FaultInjectionQueueV2) ReadMessages(
   470  	ctx context.Context,
   471  	request *persistence.InternalReadMessagesRequest,
   472  ) (*persistence.InternalReadMessagesResponse, error) {
   473  	if err := f.ErrorGenerator.Generate(); err != nil {
   474  		return nil, err
   475  	}
   476  	return f.baseQueue.ReadMessages(ctx, request)
   477  }
   478  
   479  func (f *FaultInjectionQueueV2) CreateQueue(
   480  	ctx context.Context,
   481  	request *persistence.InternalCreateQueueRequest,
   482  ) (*persistence.InternalCreateQueueResponse, error) {
   483  	if err := f.ErrorGenerator.Generate(); err != nil {
   484  		return nil, err
   485  	}
   486  	return f.baseQueue.CreateQueue(ctx, request)
   487  }
   488  
   489  func (f *FaultInjectionQueueV2) RangeDeleteMessages(
   490  	ctx context.Context,
   491  	request *persistence.InternalRangeDeleteMessagesRequest,
   492  ) (*persistence.InternalRangeDeleteMessagesResponse, error) {
   493  	if err := f.ErrorGenerator.Generate(); err != nil {
   494  		return nil, err
   495  	}
   496  	return f.baseQueue.RangeDeleteMessages(ctx, request)
   497  }
   498  
   499  func (f *FaultInjectionQueueV2) ListQueues(
   500  	ctx context.Context,
   501  	request *persistence.InternalListQueuesRequest,
   502  ) (*persistence.InternalListQueuesResponse, error) {
   503  	if err := f.ErrorGenerator.Generate(); err != nil {
   504  		return nil, err
   505  	}
   506  	return f.baseQueue.ListQueues(ctx, request)
   507  }
   508  
   509  func NewFaultInjectionExecutionStore(
   510  	rate float64,
   511  	executionStore persistence.ExecutionStore,
   512  ) (*FaultInjectionExecutionStore, error) {
   513  	// TODO: inject shard ownership lost ever after
   514  	// queue processor can notify shard upon unloading itself
   515  	// when shard ownership lost error is encountered.
   516  	errorGenerator := newErrorGenerator(
   517  		rate,
   518  		defaultErrors,
   519  	)
   520  	return &FaultInjectionExecutionStore{
   521  		baseExecutionStore: executionStore,
   522  		ErrorGenerator:     errorGenerator,
   523  	}, nil
   524  }
   525  
   526  func (e *FaultInjectionExecutionStore) Close() {
   527  	e.baseExecutionStore.Close()
   528  }
   529  
   530  func (e *FaultInjectionExecutionStore) GetName() string {
   531  	return e.baseExecutionStore.GetName()
   532  }
   533  
   534  func (e *FaultInjectionExecutionStore) GetWorkflowExecution(
   535  	ctx context.Context,
   536  	request *persistence.GetWorkflowExecutionRequest,
   537  ) (*persistence.InternalGetWorkflowExecutionResponse, error) {
   538  	if err := e.ErrorGenerator.Generate(); err != nil {
   539  		return nil, err
   540  	}
   541  	return e.baseExecutionStore.GetWorkflowExecution(ctx, request)
   542  }
   543  
   544  func (e *FaultInjectionExecutionStore) SetWorkflowExecution(
   545  	ctx context.Context,
   546  	request *persistence.InternalSetWorkflowExecutionRequest,
   547  ) error {
   548  	if err := e.ErrorGenerator.Generate(); err != nil {
   549  		return err
   550  	}
   551  	return e.baseExecutionStore.SetWorkflowExecution(ctx, request)
   552  }
   553  
   554  func (e *FaultInjectionExecutionStore) UpdateWorkflowExecution(
   555  	ctx context.Context,
   556  	request *persistence.InternalUpdateWorkflowExecutionRequest,
   557  ) error {
   558  	if err := e.ErrorGenerator.Generate(); err != nil {
   559  		return err
   560  	}
   561  	return e.baseExecutionStore.UpdateWorkflowExecution(ctx, request)
   562  }
   563  
   564  func (e *FaultInjectionExecutionStore) ConflictResolveWorkflowExecution(
   565  	ctx context.Context,
   566  	request *persistence.InternalConflictResolveWorkflowExecutionRequest,
   567  ) error {
   568  	if err := e.ErrorGenerator.Generate(); err != nil {
   569  		return err
   570  	}
   571  	return e.baseExecutionStore.ConflictResolveWorkflowExecution(ctx, request)
   572  }
   573  
   574  func (e *FaultInjectionExecutionStore) CreateWorkflowExecution(
   575  	ctx context.Context,
   576  	request *persistence.InternalCreateWorkflowExecutionRequest,
   577  ) (*persistence.InternalCreateWorkflowExecutionResponse, error) {
   578  	if err := e.ErrorGenerator.Generate(); err != nil {
   579  		return nil, err
   580  	}
   581  	return e.baseExecutionStore.CreateWorkflowExecution(ctx, request)
   582  }
   583  
   584  func (e *FaultInjectionExecutionStore) DeleteWorkflowExecution(
   585  	ctx context.Context,
   586  	request *persistence.DeleteWorkflowExecutionRequest,
   587  ) error {
   588  	if err := e.ErrorGenerator.Generate(); err != nil {
   589  		return err
   590  	}
   591  	return e.baseExecutionStore.DeleteWorkflowExecution(ctx, request)
   592  }
   593  
   594  func (e *FaultInjectionExecutionStore) DeleteCurrentWorkflowExecution(
   595  	ctx context.Context,
   596  	request *persistence.DeleteCurrentWorkflowExecutionRequest,
   597  ) error {
   598  	if err := e.ErrorGenerator.Generate(); err != nil {
   599  		return err
   600  	}
   601  	return e.baseExecutionStore.DeleteCurrentWorkflowExecution(ctx, request)
   602  }
   603  
   604  func (e *FaultInjectionExecutionStore) GetCurrentExecution(
   605  	ctx context.Context,
   606  	request *persistence.GetCurrentExecutionRequest,
   607  ) (*persistence.InternalGetCurrentExecutionResponse, error) {
   608  	if err := e.ErrorGenerator.Generate(); err != nil {
   609  		return nil, err
   610  	}
   611  	return e.baseExecutionStore.GetCurrentExecution(ctx, request)
   612  }
   613  
   614  func (e *FaultInjectionExecutionStore) ListConcreteExecutions(
   615  	ctx context.Context,
   616  	request *persistence.ListConcreteExecutionsRequest,
   617  ) (*persistence.InternalListConcreteExecutionsResponse, error) {
   618  	if err := e.ErrorGenerator.Generate(); err != nil {
   619  		return nil, err
   620  	}
   621  	return e.baseExecutionStore.ListConcreteExecutions(ctx, request)
   622  }
   623  
   624  func (e *FaultInjectionExecutionStore) RegisterHistoryTaskReader(
   625  	ctx context.Context,
   626  	request *persistence.RegisterHistoryTaskReaderRequest,
   627  ) error {
   628  	// hint methods don't actually hint DB, so don't inject any failure
   629  	return e.baseExecutionStore.RegisterHistoryTaskReader(ctx, request)
   630  }
   631  
   632  func (e *FaultInjectionExecutionStore) UnregisterHistoryTaskReader(
   633  	ctx context.Context,
   634  	request *persistence.UnregisterHistoryTaskReaderRequest,
   635  ) {
   636  	// hint methods don't actually hint DB, so don't inject any failure
   637  	e.baseExecutionStore.UnregisterHistoryTaskReader(ctx, request)
   638  }
   639  
   640  func (e *FaultInjectionExecutionStore) UpdateHistoryTaskReaderProgress(
   641  	ctx context.Context,
   642  	request *persistence.UpdateHistoryTaskReaderProgressRequest,
   643  ) {
   644  	// hint methods don't actually hint DB, so don't inject any failure
   645  	e.baseExecutionStore.UpdateHistoryTaskReaderProgress(ctx, request)
   646  }
   647  
   648  func (e *FaultInjectionExecutionStore) AddHistoryTasks(
   649  	ctx context.Context,
   650  	request *persistence.InternalAddHistoryTasksRequest,
   651  ) error {
   652  	if err := e.ErrorGenerator.Generate(); err != nil {
   653  		return err
   654  	}
   655  	return e.baseExecutionStore.AddHistoryTasks(ctx, request)
   656  }
   657  
   658  func (e *FaultInjectionExecutionStore) GetHistoryTasks(
   659  	ctx context.Context,
   660  	request *persistence.GetHistoryTasksRequest,
   661  ) (*persistence.InternalGetHistoryTasksResponse, error) {
   662  	if err := e.ErrorGenerator.Generate(); err != nil {
   663  		return nil, err
   664  	}
   665  	return e.baseExecutionStore.GetHistoryTasks(ctx, request)
   666  }
   667  
   668  func (e *FaultInjectionExecutionStore) CompleteHistoryTask(
   669  	ctx context.Context,
   670  	request *persistence.CompleteHistoryTaskRequest,
   671  ) error {
   672  	if err := e.ErrorGenerator.Generate(); err != nil {
   673  		return err
   674  	}
   675  	return e.baseExecutionStore.CompleteHistoryTask(ctx, request)
   676  }
   677  
   678  func (e *FaultInjectionExecutionStore) RangeCompleteHistoryTasks(
   679  	ctx context.Context,
   680  	request *persistence.RangeCompleteHistoryTasksRequest,
   681  ) error {
   682  	if err := e.ErrorGenerator.Generate(); err != nil {
   683  		return err
   684  	}
   685  	return e.baseExecutionStore.RangeCompleteHistoryTasks(ctx, request)
   686  }
   687  
   688  func (e *FaultInjectionExecutionStore) PutReplicationTaskToDLQ(
   689  	ctx context.Context,
   690  	request *persistence.PutReplicationTaskToDLQRequest,
   691  ) error {
   692  	if err := e.ErrorGenerator.Generate(); err != nil {
   693  		return err
   694  	}
   695  	return e.baseExecutionStore.PutReplicationTaskToDLQ(ctx, request)
   696  }
   697  
   698  func (e *FaultInjectionExecutionStore) GetReplicationTasksFromDLQ(
   699  	ctx context.Context,
   700  	request *persistence.GetReplicationTasksFromDLQRequest,
   701  ) (
   702  	*persistence.InternalGetHistoryTasksResponse,
   703  	error,
   704  ) {
   705  	if err := e.ErrorGenerator.Generate(); err != nil {
   706  		return nil, err
   707  	}
   708  	return e.baseExecutionStore.GetReplicationTasksFromDLQ(ctx, request)
   709  }
   710  
   711  func (e *FaultInjectionExecutionStore) DeleteReplicationTaskFromDLQ(
   712  	ctx context.Context,
   713  	request *persistence.DeleteReplicationTaskFromDLQRequest,
   714  ) error {
   715  	if err := e.ErrorGenerator.Generate(); err != nil {
   716  		return err
   717  	}
   718  	return e.baseExecutionStore.DeleteReplicationTaskFromDLQ(ctx, request)
   719  }
   720  
   721  func (e *FaultInjectionExecutionStore) RangeDeleteReplicationTaskFromDLQ(
   722  	ctx context.Context,
   723  	request *persistence.RangeDeleteReplicationTaskFromDLQRequest,
   724  ) error {
   725  	if err := e.ErrorGenerator.Generate(); err != nil {
   726  		return err
   727  	}
   728  	return e.baseExecutionStore.RangeDeleteReplicationTaskFromDLQ(ctx, request)
   729  }
   730  
   731  func (e *FaultInjectionExecutionStore) IsReplicationDLQEmpty(
   732  	ctx context.Context,
   733  	request *persistence.GetReplicationTasksFromDLQRequest,
   734  ) (bool, error) {
   735  	if err := e.ErrorGenerator.Generate(); err != nil {
   736  		return true, err
   737  	}
   738  	return e.baseExecutionStore.IsReplicationDLQEmpty(ctx, request)
   739  }
   740  
   741  func (e *FaultInjectionExecutionStore) AppendHistoryNodes(
   742  	ctx context.Context,
   743  	request *persistence.InternalAppendHistoryNodesRequest,
   744  ) error {
   745  	if err := e.ErrorGenerator.Generate(); err != nil {
   746  		return err
   747  	}
   748  	return e.baseExecutionStore.AppendHistoryNodes(ctx, request)
   749  }
   750  
   751  func (e *FaultInjectionExecutionStore) DeleteHistoryNodes(
   752  	ctx context.Context,
   753  	request *persistence.InternalDeleteHistoryNodesRequest,
   754  ) error {
   755  	if err := e.ErrorGenerator.Generate(); err != nil {
   756  		return err
   757  	}
   758  	return e.baseExecutionStore.DeleteHistoryNodes(ctx, request)
   759  }
   760  
   761  func (e *FaultInjectionExecutionStore) ReadHistoryBranch(
   762  	ctx context.Context,
   763  	request *persistence.InternalReadHistoryBranchRequest,
   764  ) (*persistence.InternalReadHistoryBranchResponse, error) {
   765  	if err := e.ErrorGenerator.Generate(); err != nil {
   766  		return nil, err
   767  	}
   768  	return e.baseExecutionStore.ReadHistoryBranch(ctx, request)
   769  }
   770  
   771  func (e *FaultInjectionExecutionStore) ForkHistoryBranch(
   772  	ctx context.Context,
   773  	request *persistence.InternalForkHistoryBranchRequest,
   774  ) error {
   775  	if err := e.ErrorGenerator.Generate(); err != nil {
   776  		return err
   777  	}
   778  	return e.baseExecutionStore.ForkHistoryBranch(ctx, request)
   779  }
   780  
   781  func (e *FaultInjectionExecutionStore) DeleteHistoryBranch(
   782  	ctx context.Context,
   783  	request *persistence.InternalDeleteHistoryBranchRequest,
   784  ) error {
   785  	if err := e.ErrorGenerator.Generate(); err != nil {
   786  		return err
   787  	}
   788  	return e.baseExecutionStore.DeleteHistoryBranch(ctx, request)
   789  }
   790  
   791  func (e *FaultInjectionExecutionStore) GetHistoryTree(
   792  	ctx context.Context,
   793  	request *persistence.GetHistoryTreeRequest,
   794  ) (*persistence.InternalGetHistoryTreeResponse, error) {
   795  	if err := e.ErrorGenerator.Generate(); err != nil {
   796  		return nil, err
   797  	}
   798  	return e.baseExecutionStore.GetHistoryTree(ctx, request)
   799  }
   800  
   801  func (e *FaultInjectionExecutionStore) GetAllHistoryTreeBranches(
   802  	ctx context.Context,
   803  	request *persistence.GetAllHistoryTreeBranchesRequest,
   804  ) (*persistence.InternalGetAllHistoryTreeBranchesResponse, error) {
   805  	if err := e.ErrorGenerator.Generate(); err != nil {
   806  		return nil, err
   807  	}
   808  	return e.baseExecutionStore.GetAllHistoryTreeBranches(ctx, request)
   809  }
   810  
   811  func (e *FaultInjectionExecutionStore) UpdateRate(rate float64) {
   812  	e.ErrorGenerator.UpdateRate(rate)
   813  }
   814  
   815  func NewFaultInjectionClusterMetadataStore(
   816  	rate float64,
   817  	baseStore persistence.ClusterMetadataStore,
   818  ) (*FaultInjectionClusterMetadataStore, error) {
   819  	errorGenerator := newErrorGenerator(rate, defaultErrors)
   820  	return &FaultInjectionClusterMetadataStore{
   821  		baseCMStore:    baseStore,
   822  		ErrorGenerator: errorGenerator,
   823  	}, nil
   824  }
   825  
   826  func (c *FaultInjectionClusterMetadataStore) Close() {
   827  	c.baseCMStore.Close()
   828  }
   829  
   830  func (c *FaultInjectionClusterMetadataStore) GetName() string {
   831  	return c.baseCMStore.GetName()
   832  }
   833  
   834  func (c *FaultInjectionClusterMetadataStore) ListClusterMetadata(
   835  	ctx context.Context,
   836  	request *persistence.InternalListClusterMetadataRequest,
   837  ) (*persistence.InternalListClusterMetadataResponse, error) {
   838  	if err := c.ErrorGenerator.Generate(); err != nil {
   839  		return nil, err
   840  	}
   841  	return c.baseCMStore.ListClusterMetadata(ctx, request)
   842  }
   843  
   844  func (c *FaultInjectionClusterMetadataStore) GetClusterMetadata(
   845  	ctx context.Context,
   846  	request *persistence.InternalGetClusterMetadataRequest,
   847  ) (*persistence.InternalGetClusterMetadataResponse, error) {
   848  	if err := c.ErrorGenerator.Generate(); err != nil {
   849  		return nil, err
   850  	}
   851  	return c.baseCMStore.GetClusterMetadata(ctx, request)
   852  }
   853  
   854  func (c *FaultInjectionClusterMetadataStore) SaveClusterMetadata(
   855  	ctx context.Context,
   856  	request *persistence.InternalSaveClusterMetadataRequest,
   857  ) (bool, error) {
   858  	if err := c.ErrorGenerator.Generate(); err != nil {
   859  		return false, err
   860  	}
   861  	return c.baseCMStore.SaveClusterMetadata(ctx, request)
   862  }
   863  
   864  func (c *FaultInjectionClusterMetadataStore) DeleteClusterMetadata(
   865  	ctx context.Context,
   866  	request *persistence.InternalDeleteClusterMetadataRequest,
   867  ) error {
   868  	if err := c.ErrorGenerator.Generate(); err != nil {
   869  		return err
   870  	}
   871  	return c.baseCMStore.DeleteClusterMetadata(ctx, request)
   872  }
   873  
   874  func (c *FaultInjectionClusterMetadataStore) GetClusterMembers(
   875  	ctx context.Context,
   876  	request *persistence.GetClusterMembersRequest,
   877  ) (*persistence.GetClusterMembersResponse, error) {
   878  	if err := c.ErrorGenerator.Generate(); err != nil {
   879  		return nil, err
   880  	}
   881  	return c.baseCMStore.GetClusterMembers(ctx, request)
   882  }
   883  
   884  func (c *FaultInjectionClusterMetadataStore) UpsertClusterMembership(
   885  	ctx context.Context,
   886  	request *persistence.UpsertClusterMembershipRequest,
   887  ) error {
   888  	if err := c.ErrorGenerator.Generate(); err != nil {
   889  		return err
   890  	}
   891  	return c.baseCMStore.UpsertClusterMembership(ctx, request)
   892  }
   893  
   894  func (c *FaultInjectionClusterMetadataStore) PruneClusterMembership(
   895  	ctx context.Context,
   896  	request *persistence.PruneClusterMembershipRequest,
   897  ) error {
   898  	if err := c.ErrorGenerator.Generate(); err != nil {
   899  		return err
   900  	}
   901  	return c.baseCMStore.PruneClusterMembership(ctx, request)
   902  }
   903  
   904  func (c *FaultInjectionClusterMetadataStore) UpdateRate(rate float64) {
   905  	c.ErrorGenerator.UpdateRate(rate)
   906  }
   907  
   908  func NewFaultInjectionMetadataStore(
   909  	rate float64,
   910  	metadataStore persistence.MetadataStore,
   911  ) (*FaultInjectionMetadataStore, error) {
   912  	errorGenerator := newErrorGenerator(rate, defaultErrors)
   913  	return &FaultInjectionMetadataStore{
   914  		baseMetadataStore: metadataStore,
   915  		ErrorGenerator:    errorGenerator,
   916  	}, nil
   917  }
   918  
   919  func (m *FaultInjectionMetadataStore) Close() {
   920  	m.baseMetadataStore.Close()
   921  }
   922  
   923  func (m *FaultInjectionMetadataStore) GetName() string {
   924  	return m.baseMetadataStore.GetName()
   925  }
   926  
   927  func (m *FaultInjectionMetadataStore) CreateNamespace(
   928  	ctx context.Context,
   929  	request *persistence.InternalCreateNamespaceRequest,
   930  ) (*persistence.CreateNamespaceResponse, error) {
   931  	if err := m.ErrorGenerator.Generate(); err != nil {
   932  		return nil, err
   933  	}
   934  	return m.baseMetadataStore.CreateNamespace(ctx, request)
   935  }
   936  
   937  func (m *FaultInjectionMetadataStore) GetNamespace(
   938  	ctx context.Context,
   939  	request *persistence.GetNamespaceRequest,
   940  ) (*persistence.InternalGetNamespaceResponse, error) {
   941  	if err := m.ErrorGenerator.Generate(); err != nil {
   942  		return nil, err
   943  	}
   944  	return m.baseMetadataStore.GetNamespace(ctx, request)
   945  }
   946  
   947  func (m *FaultInjectionMetadataStore) UpdateNamespace(
   948  	ctx context.Context,
   949  	request *persistence.InternalUpdateNamespaceRequest,
   950  ) error {
   951  	if err := m.ErrorGenerator.Generate(); err != nil {
   952  		return err
   953  	}
   954  	return m.baseMetadataStore.UpdateNamespace(ctx, request)
   955  }
   956  
   957  func (m *FaultInjectionMetadataStore) RenameNamespace(
   958  	ctx context.Context,
   959  	request *persistence.InternalRenameNamespaceRequest,
   960  ) error {
   961  	if err := m.ErrorGenerator.Generate(); err != nil {
   962  		return err
   963  	}
   964  	return m.baseMetadataStore.RenameNamespace(ctx, request)
   965  }
   966  
   967  func (m *FaultInjectionMetadataStore) DeleteNamespace(
   968  	ctx context.Context,
   969  	request *persistence.DeleteNamespaceRequest,
   970  ) error {
   971  	if err := m.ErrorGenerator.Generate(); err != nil {
   972  		return err
   973  	}
   974  	return m.baseMetadataStore.DeleteNamespace(ctx, request)
   975  }
   976  
   977  func (m *FaultInjectionMetadataStore) DeleteNamespaceByName(
   978  	ctx context.Context,
   979  	request *persistence.DeleteNamespaceByNameRequest,
   980  ) error {
   981  	if err := m.ErrorGenerator.Generate(); err != nil {
   982  		return err
   983  	}
   984  	return m.baseMetadataStore.DeleteNamespaceByName(ctx, request)
   985  }
   986  
   987  func (m *FaultInjectionMetadataStore) ListNamespaces(
   988  	ctx context.Context,
   989  	request *persistence.InternalListNamespacesRequest,
   990  ) (*persistence.InternalListNamespacesResponse, error) {
   991  	if err := m.ErrorGenerator.Generate(); err != nil {
   992  		return nil, err
   993  	}
   994  	return m.baseMetadataStore.ListNamespaces(ctx, request)
   995  }
   996  
   997  func (m *FaultInjectionMetadataStore) GetMetadata(
   998  	ctx context.Context,
   999  ) (*persistence.GetMetadataResponse, error) {
  1000  	if err := m.ErrorGenerator.Generate(); err != nil {
  1001  		return nil, err
  1002  	}
  1003  	return m.baseMetadataStore.GetMetadata(ctx)
  1004  }
  1005  
  1006  func (m *FaultInjectionMetadataStore) UpdateRate(rate float64) {
  1007  	m.ErrorGenerator.UpdateRate(rate)
  1008  }
  1009  
  1010  func NewFaultInjectionTaskStore(
  1011  	rate float64,
  1012  	baseTaskStore persistence.TaskStore,
  1013  ) (*FaultInjectionTaskStore, error) {
  1014  	errorGenerator := newErrorGenerator(rate, defaultErrors)
  1015  
  1016  	return &FaultInjectionTaskStore{
  1017  		baseTaskStore:  baseTaskStore,
  1018  		ErrorGenerator: errorGenerator,
  1019  	}, nil
  1020  }
  1021  
  1022  func (t *FaultInjectionTaskStore) Close() {
  1023  	t.baseTaskStore.Close()
  1024  }
  1025  
  1026  func (t *FaultInjectionTaskStore) GetName() string {
  1027  	return t.baseTaskStore.GetName()
  1028  }
  1029  
  1030  func (t *FaultInjectionTaskStore) CreateTaskQueue(
  1031  	ctx context.Context,
  1032  	request *persistence.InternalCreateTaskQueueRequest,
  1033  ) error {
  1034  	if err := t.ErrorGenerator.Generate(); err != nil {
  1035  		return err
  1036  	}
  1037  	return t.baseTaskStore.CreateTaskQueue(ctx, request)
  1038  }
  1039  
  1040  func (t *FaultInjectionTaskStore) GetTaskQueue(
  1041  	ctx context.Context,
  1042  	request *persistence.InternalGetTaskQueueRequest,
  1043  ) (*persistence.InternalGetTaskQueueResponse, error) {
  1044  	if err := t.ErrorGenerator.Generate(); err != nil {
  1045  		return nil, err
  1046  	}
  1047  	return t.baseTaskStore.GetTaskQueue(ctx, request)
  1048  }
  1049  
  1050  func (t *FaultInjectionTaskStore) UpdateTaskQueue(
  1051  	ctx context.Context,
  1052  	request *persistence.InternalUpdateTaskQueueRequest,
  1053  ) (*persistence.UpdateTaskQueueResponse, error) {
  1054  	if err := t.ErrorGenerator.Generate(); err != nil {
  1055  		return nil, err
  1056  	}
  1057  	return t.baseTaskStore.UpdateTaskQueue(ctx, request)
  1058  }
  1059  
  1060  func (t *FaultInjectionTaskStore) ListTaskQueue(
  1061  	ctx context.Context,
  1062  	request *persistence.ListTaskQueueRequest,
  1063  ) (*persistence.InternalListTaskQueueResponse, error) {
  1064  	if err := t.ErrorGenerator.Generate(); err != nil {
  1065  		return nil, err
  1066  	}
  1067  	return t.baseTaskStore.ListTaskQueue(ctx, request)
  1068  }
  1069  
  1070  func (t *FaultInjectionTaskStore) DeleteTaskQueue(
  1071  	ctx context.Context,
  1072  	request *persistence.DeleteTaskQueueRequest,
  1073  ) error {
  1074  	if err := t.ErrorGenerator.Generate(); err != nil {
  1075  		return err
  1076  	}
  1077  	return t.baseTaskStore.DeleteTaskQueue(ctx, request)
  1078  }
  1079  
  1080  func (t *FaultInjectionTaskStore) CreateTasks(
  1081  	ctx context.Context,
  1082  	request *persistence.InternalCreateTasksRequest,
  1083  ) (*persistence.CreateTasksResponse, error) {
  1084  	if err := t.ErrorGenerator.Generate(); err != nil {
  1085  		return nil, err
  1086  	}
  1087  	return t.baseTaskStore.CreateTasks(ctx, request)
  1088  }
  1089  
  1090  func (t *FaultInjectionTaskStore) GetTasks(
  1091  	ctx context.Context,
  1092  	request *persistence.GetTasksRequest,
  1093  ) (*persistence.InternalGetTasksResponse, error) {
  1094  	if err := t.ErrorGenerator.Generate(); err != nil {
  1095  		return nil, err
  1096  	}
  1097  	return t.baseTaskStore.GetTasks(ctx, request)
  1098  }
  1099  
  1100  func (t *FaultInjectionTaskStore) CompleteTask(
  1101  	ctx context.Context,
  1102  	request *persistence.CompleteTaskRequest,
  1103  ) error {
  1104  	if err := t.ErrorGenerator.Generate(); err != nil {
  1105  		return err
  1106  	}
  1107  	return t.baseTaskStore.CompleteTask(ctx, request)
  1108  }
  1109  
  1110  func (t *FaultInjectionTaskStore) CompleteTasksLessThan(
  1111  	ctx context.Context,
  1112  	request *persistence.CompleteTasksLessThanRequest,
  1113  ) (int, error) {
  1114  	if err := t.ErrorGenerator.Generate(); err != nil {
  1115  		return 0, err
  1116  	}
  1117  	return t.baseTaskStore.CompleteTasksLessThan(ctx, request)
  1118  }
  1119  
  1120  func (t *FaultInjectionTaskStore) GetTaskQueueUserData(ctx context.Context, request *persistence.GetTaskQueueUserDataRequest) (*persistence.InternalGetTaskQueueUserDataResponse, error) {
  1121  	if err := t.ErrorGenerator.Generate(); err != nil {
  1122  		return nil, err
  1123  	}
  1124  	return t.baseTaskStore.GetTaskQueueUserData(ctx, request)
  1125  }
  1126  
  1127  func (t *FaultInjectionTaskStore) UpdateTaskQueueUserData(ctx context.Context, request *persistence.InternalUpdateTaskQueueUserDataRequest) error {
  1128  	if err := t.ErrorGenerator.Generate(); err != nil {
  1129  		return err
  1130  	}
  1131  	return t.baseTaskStore.UpdateTaskQueueUserData(ctx, request)
  1132  }
  1133  
  1134  func (t *FaultInjectionTaskStore) ListTaskQueueUserDataEntries(ctx context.Context, request *persistence.ListTaskQueueUserDataEntriesRequest) (*persistence.InternalListTaskQueueUserDataEntriesResponse, error) {
  1135  	if err := t.ErrorGenerator.Generate(); err != nil {
  1136  		return nil, err
  1137  	}
  1138  	return t.baseTaskStore.ListTaskQueueUserDataEntries(ctx, request)
  1139  }
  1140  
  1141  func (t *FaultInjectionTaskStore) GetTaskQueuesByBuildId(ctx context.Context, request *persistence.GetTaskQueuesByBuildIdRequest) ([]string, error) {
  1142  	if err := t.ErrorGenerator.Generate(); err != nil {
  1143  		return nil, err
  1144  	}
  1145  	return t.baseTaskStore.GetTaskQueuesByBuildId(ctx, request)
  1146  }
  1147  
  1148  func (t *FaultInjectionTaskStore) CountTaskQueuesByBuildId(ctx context.Context, request *persistence.CountTaskQueuesByBuildIdRequest) (int, error) {
  1149  	if err := t.ErrorGenerator.Generate(); err != nil {
  1150  		return 0, err
  1151  	}
  1152  	return t.baseTaskStore.CountTaskQueuesByBuildId(ctx, request)
  1153  }
  1154  
  1155  func (t *FaultInjectionTaskStore) UpdateRate(rate float64) {
  1156  	t.ErrorGenerator.UpdateRate(rate)
  1157  }
  1158  
  1159  func NewFaultInjectionShardStore(
  1160  	rate float64,
  1161  	baseShardStore persistence.ShardStore,
  1162  ) (*FaultInjectionShardStore, error) {
  1163  	errorWeights := append(
  1164  		defaultErrors,
  1165  		FaultWeight{
  1166  			errFactory: func(msg string) error {
  1167  				return &persistence.ShardOwnershipLostError{
  1168  					ShardID: -1,
  1169  					Msg:     fmt.Sprintf("FaultInjectionShardStore injected, %s", msg),
  1170  				}
  1171  			},
  1172  			weight: 1,
  1173  		},
  1174  	)
  1175  	errorGenerator := newErrorGenerator(rate, errorWeights)
  1176  	return &FaultInjectionShardStore{
  1177  		baseShardStore: baseShardStore,
  1178  		ErrorGenerator: errorGenerator,
  1179  	}, nil
  1180  }
  1181  
  1182  func (s *FaultInjectionShardStore) Close() {
  1183  	s.baseShardStore.Close()
  1184  }
  1185  
  1186  func (s *FaultInjectionShardStore) GetName() string {
  1187  	return s.baseShardStore.GetName()
  1188  }
  1189  
  1190  func (s *FaultInjectionShardStore) GetClusterName() string {
  1191  	return s.baseShardStore.GetClusterName()
  1192  }
  1193  
  1194  func (s *FaultInjectionShardStore) GetOrCreateShard(
  1195  	ctx context.Context,
  1196  	request *persistence.InternalGetOrCreateShardRequest,
  1197  ) (*persistence.InternalGetOrCreateShardResponse, error) {
  1198  	if err := s.ErrorGenerator.Generate(); err != nil {
  1199  		return nil, err
  1200  	}
  1201  	return s.baseShardStore.GetOrCreateShard(ctx, request)
  1202  }
  1203  
  1204  func (s *FaultInjectionShardStore) UpdateShard(
  1205  	ctx context.Context,
  1206  	request *persistence.InternalUpdateShardRequest,
  1207  ) error {
  1208  	if err := s.ErrorGenerator.Generate(); err != nil {
  1209  		return err
  1210  	}
  1211  	return s.baseShardStore.UpdateShard(ctx, request)
  1212  }
  1213  
  1214  func (s *FaultInjectionShardStore) AssertShardOwnership(
  1215  	ctx context.Context,
  1216  	request *persistence.AssertShardOwnershipRequest,
  1217  ) error {
  1218  	if err := s.ErrorGenerator.Generate(); err != nil {
  1219  		return err
  1220  	}
  1221  	return s.baseShardStore.AssertShardOwnership(ctx, request)
  1222  }
  1223  
  1224  func (s *FaultInjectionShardStore) UpdateRate(rate float64) {
  1225  	s.ErrorGenerator.UpdateRate(rate)
  1226  }