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 }