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

     1  // The MIT License
     2  //
     3  // Copyright (c) 2020 Temporal Technologies Inp.  All rights reserved.
     4  //
     5  // Copyright (c) 2020 Uber Technologies, Inp.
     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 persistence
    26  
    27  import (
    28  	"context"
    29  
    30  	commonpb "go.temporal.io/api/common/v1"
    31  
    32  	"go.temporal.io/server/common/backoff"
    33  )
    34  
    35  type (
    36  	shardRetryablePersistenceClient struct {
    37  		persistence ShardManager
    38  		policy      backoff.RetryPolicy
    39  		isRetryable backoff.IsRetryable
    40  	}
    41  
    42  	executionRetryablePersistenceClient struct {
    43  		persistence ExecutionManager
    44  		policy      backoff.RetryPolicy
    45  		isRetryable backoff.IsRetryable
    46  	}
    47  
    48  	taskRetryablePersistenceClient struct {
    49  		persistence TaskManager
    50  		policy      backoff.RetryPolicy
    51  		isRetryable backoff.IsRetryable
    52  	}
    53  
    54  	metadataRetryablePersistenceClient struct {
    55  		persistence MetadataManager
    56  		policy      backoff.RetryPolicy
    57  		isRetryable backoff.IsRetryable
    58  	}
    59  
    60  	clusterMetadataRetryablePersistenceClient struct {
    61  		persistence ClusterMetadataManager
    62  		policy      backoff.RetryPolicy
    63  		isRetryable backoff.IsRetryable
    64  	}
    65  
    66  	queueRetryablePersistenceClient struct {
    67  		persistence Queue
    68  		policy      backoff.RetryPolicy
    69  		isRetryable backoff.IsRetryable
    70  	}
    71  )
    72  
    73  var _ ShardManager = (*shardRetryablePersistenceClient)(nil)
    74  var _ ExecutionManager = (*executionRetryablePersistenceClient)(nil)
    75  var _ TaskManager = (*taskRetryablePersistenceClient)(nil)
    76  var _ MetadataManager = (*metadataRetryablePersistenceClient)(nil)
    77  var _ ClusterMetadataManager = (*clusterMetadataRetryablePersistenceClient)(nil)
    78  var _ Queue = (*queueRetryablePersistenceClient)(nil)
    79  
    80  // NewShardPersistenceRetryableClient creates a client to manage shards
    81  func NewShardPersistenceRetryableClient(
    82  	persistence ShardManager,
    83  	policy backoff.RetryPolicy,
    84  	isRetryable backoff.IsRetryable,
    85  ) ShardManager {
    86  	return &shardRetryablePersistenceClient{
    87  		persistence: persistence,
    88  		policy:      policy,
    89  		isRetryable: isRetryable,
    90  	}
    91  }
    92  
    93  // NewExecutionPersistenceRetryableClient creates a client to manage executions
    94  func NewExecutionPersistenceRetryableClient(
    95  	persistence ExecutionManager,
    96  	policy backoff.RetryPolicy,
    97  	isRetryable backoff.IsRetryable,
    98  ) ExecutionManager {
    99  	return &executionRetryablePersistenceClient{
   100  		persistence: persistence,
   101  		policy:      policy,
   102  		isRetryable: isRetryable,
   103  	}
   104  }
   105  
   106  // NewTaskPersistenceRetryableClient creates a client to manage tasks
   107  func NewTaskPersistenceRetryableClient(
   108  	persistence TaskManager,
   109  	policy backoff.RetryPolicy,
   110  	isRetryable backoff.IsRetryable,
   111  ) TaskManager {
   112  	return &taskRetryablePersistenceClient{
   113  		persistence: persistence,
   114  		policy:      policy,
   115  		isRetryable: isRetryable,
   116  	}
   117  }
   118  
   119  // NewMetadataPersistenceRetryableClient creates a MetadataManager client to manage metadata
   120  func NewMetadataPersistenceRetryableClient(
   121  	persistence MetadataManager,
   122  	policy backoff.RetryPolicy,
   123  	isRetryable backoff.IsRetryable,
   124  ) MetadataManager {
   125  	return &metadataRetryablePersistenceClient{
   126  		persistence: persistence,
   127  		policy:      policy,
   128  		isRetryable: isRetryable,
   129  	}
   130  }
   131  
   132  // NewClusterMetadataPersistenceRetryableClient creates a MetadataManager client to manage metadata
   133  func NewClusterMetadataPersistenceRetryableClient(
   134  	persistence ClusterMetadataManager,
   135  	policy backoff.RetryPolicy,
   136  	isRetryable backoff.IsRetryable,
   137  ) ClusterMetadataManager {
   138  	return &clusterMetadataRetryablePersistenceClient{
   139  		persistence: persistence,
   140  		policy:      policy,
   141  		isRetryable: isRetryable,
   142  	}
   143  }
   144  
   145  // NewQueuePersistenceRetryableClient creates a client to manage queue
   146  func NewQueuePersistenceRetryableClient(
   147  	persistence Queue,
   148  	policy backoff.RetryPolicy,
   149  	isRetryable backoff.IsRetryable,
   150  ) Queue {
   151  	return &queueRetryablePersistenceClient{
   152  		persistence: persistence,
   153  		policy:      policy,
   154  		isRetryable: isRetryable,
   155  	}
   156  }
   157  
   158  func (p *shardRetryablePersistenceClient) GetName() string {
   159  	return p.persistence.GetName()
   160  }
   161  
   162  func (p *shardRetryablePersistenceClient) GetOrCreateShard(
   163  	ctx context.Context,
   164  	request *GetOrCreateShardRequest,
   165  ) (*GetOrCreateShardResponse, error) {
   166  	var response *GetOrCreateShardResponse
   167  	op := func(ctx context.Context) error {
   168  		var err error
   169  		response, err = p.persistence.GetOrCreateShard(ctx, request)
   170  		return err
   171  	}
   172  
   173  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   174  	return response, err
   175  }
   176  
   177  func (p *shardRetryablePersistenceClient) UpdateShard(
   178  	ctx context.Context,
   179  	request *UpdateShardRequest,
   180  ) error {
   181  	op := func(ctx context.Context) error {
   182  		return p.persistence.UpdateShard(ctx, request)
   183  	}
   184  
   185  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   186  }
   187  
   188  func (p *shardRetryablePersistenceClient) AssertShardOwnership(
   189  	ctx context.Context,
   190  	request *AssertShardOwnershipRequest,
   191  ) error {
   192  	op := func(ctx context.Context) error {
   193  		return p.persistence.AssertShardOwnership(ctx, request)
   194  	}
   195  
   196  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   197  }
   198  
   199  func (p *shardRetryablePersistenceClient) Close() {
   200  	p.persistence.Close()
   201  }
   202  
   203  func (p *executionRetryablePersistenceClient) GetName() string {
   204  	return p.persistence.GetName()
   205  }
   206  
   207  func (p *executionRetryablePersistenceClient) GetHistoryBranchUtil() HistoryBranchUtil {
   208  	return p.persistence.GetHistoryBranchUtil()
   209  }
   210  
   211  func (p *executionRetryablePersistenceClient) CreateWorkflowExecution(
   212  	ctx context.Context,
   213  	request *CreateWorkflowExecutionRequest,
   214  ) (*CreateWorkflowExecutionResponse, error) {
   215  	var response *CreateWorkflowExecutionResponse
   216  	op := func(ctx context.Context) error {
   217  		var err error
   218  		response, err = p.persistence.CreateWorkflowExecution(ctx, request)
   219  		return err
   220  	}
   221  
   222  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   223  	return response, err
   224  }
   225  
   226  func (p *executionRetryablePersistenceClient) GetWorkflowExecution(
   227  	ctx context.Context,
   228  	request *GetWorkflowExecutionRequest,
   229  ) (*GetWorkflowExecutionResponse, error) {
   230  	var response *GetWorkflowExecutionResponse
   231  	op := func(ctx context.Context) error {
   232  		var err error
   233  		response, err = p.persistence.GetWorkflowExecution(ctx, request)
   234  		return err
   235  	}
   236  
   237  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   238  	return response, err
   239  }
   240  
   241  func (p *executionRetryablePersistenceClient) SetWorkflowExecution(
   242  	ctx context.Context,
   243  	request *SetWorkflowExecutionRequest,
   244  ) (*SetWorkflowExecutionResponse, error) {
   245  	var response *SetWorkflowExecutionResponse
   246  	op := func(ctx context.Context) error {
   247  		var err error
   248  		response, err = p.persistence.SetWorkflowExecution(ctx, request)
   249  		return err
   250  	}
   251  
   252  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   253  	return response, err
   254  }
   255  
   256  func (p *executionRetryablePersistenceClient) UpdateWorkflowExecution(
   257  	ctx context.Context,
   258  	request *UpdateWorkflowExecutionRequest,
   259  ) (*UpdateWorkflowExecutionResponse, error) {
   260  	var response *UpdateWorkflowExecutionResponse
   261  	op := func(ctx context.Context) error {
   262  		var err error
   263  		response, err = p.persistence.UpdateWorkflowExecution(ctx, request)
   264  		return err
   265  	}
   266  
   267  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   268  	return response, err
   269  }
   270  
   271  func (p *executionRetryablePersistenceClient) ConflictResolveWorkflowExecution(
   272  	ctx context.Context,
   273  	request *ConflictResolveWorkflowExecutionRequest,
   274  ) (*ConflictResolveWorkflowExecutionResponse, error) {
   275  	var response *ConflictResolveWorkflowExecutionResponse
   276  	op := func(ctx context.Context) error {
   277  		var err error
   278  		response, err = p.persistence.ConflictResolveWorkflowExecution(ctx, request)
   279  		return err
   280  	}
   281  
   282  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   283  	return response, err
   284  }
   285  
   286  func (p *executionRetryablePersistenceClient) DeleteWorkflowExecution(
   287  	ctx context.Context,
   288  	request *DeleteWorkflowExecutionRequest,
   289  ) error {
   290  	op := func(ctx context.Context) error {
   291  		return p.persistence.DeleteWorkflowExecution(ctx, request)
   292  	}
   293  
   294  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   295  }
   296  
   297  func (p *executionRetryablePersistenceClient) DeleteCurrentWorkflowExecution(
   298  	ctx context.Context,
   299  	request *DeleteCurrentWorkflowExecutionRequest,
   300  ) error {
   301  	op := func(ctx context.Context) error {
   302  		return p.persistence.DeleteCurrentWorkflowExecution(ctx, request)
   303  	}
   304  
   305  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   306  }
   307  
   308  func (p *executionRetryablePersistenceClient) GetCurrentExecution(
   309  	ctx context.Context,
   310  	request *GetCurrentExecutionRequest,
   311  ) (*GetCurrentExecutionResponse, error) {
   312  	var response *GetCurrentExecutionResponse
   313  	op := func(ctx context.Context) error {
   314  		var err error
   315  		response, err = p.persistence.GetCurrentExecution(ctx, request)
   316  		return err
   317  	}
   318  
   319  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   320  	return response, err
   321  }
   322  
   323  func (p *executionRetryablePersistenceClient) ListConcreteExecutions(
   324  	ctx context.Context,
   325  	request *ListConcreteExecutionsRequest,
   326  ) (*ListConcreteExecutionsResponse, error) {
   327  	var response *ListConcreteExecutionsResponse
   328  	op := func(ctx context.Context) error {
   329  		var err error
   330  		response, err = p.persistence.ListConcreteExecutions(ctx, request)
   331  		return err
   332  	}
   333  
   334  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   335  	return response, err
   336  }
   337  
   338  func (p *executionRetryablePersistenceClient) RegisterHistoryTaskReader(
   339  	ctx context.Context,
   340  	request *RegisterHistoryTaskReaderRequest,
   341  ) error {
   342  	// hint methods don't actually hint DB, retry won't help
   343  	return p.persistence.RegisterHistoryTaskReader(ctx, request)
   344  }
   345  
   346  func (p *executionRetryablePersistenceClient) UnregisterHistoryTaskReader(
   347  	ctx context.Context,
   348  	request *UnregisterHistoryTaskReaderRequest,
   349  ) {
   350  	// hint methods don't actually hint DB, retry won't help
   351  	p.persistence.UnregisterHistoryTaskReader(ctx, request)
   352  }
   353  
   354  func (p *executionRetryablePersistenceClient) UpdateHistoryTaskReaderProgress(
   355  	ctx context.Context,
   356  	request *UpdateHistoryTaskReaderProgressRequest,
   357  ) {
   358  	// hint methods don't actually hint DB, retry won't help
   359  	p.persistence.UpdateHistoryTaskReaderProgress(ctx, request)
   360  }
   361  
   362  func (p *executionRetryablePersistenceClient) AddHistoryTasks(
   363  	ctx context.Context,
   364  	request *AddHistoryTasksRequest,
   365  ) error {
   366  	op := func(ctx context.Context) error {
   367  		return p.persistence.AddHistoryTasks(ctx, request)
   368  	}
   369  
   370  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   371  }
   372  
   373  func (p *executionRetryablePersistenceClient) GetHistoryTasks(
   374  	ctx context.Context,
   375  	request *GetHistoryTasksRequest,
   376  ) (*GetHistoryTasksResponse, error) {
   377  	var response *GetHistoryTasksResponse
   378  	op := func(ctx context.Context) error {
   379  		var err error
   380  		response, err = p.persistence.GetHistoryTasks(ctx, request)
   381  		return err
   382  	}
   383  
   384  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   385  	return response, err
   386  }
   387  
   388  func (p *executionRetryablePersistenceClient) CompleteHistoryTask(
   389  	ctx context.Context,
   390  	request *CompleteHistoryTaskRequest,
   391  ) error {
   392  	op := func(ctx context.Context) error {
   393  		return p.persistence.CompleteHistoryTask(ctx, request)
   394  	}
   395  
   396  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   397  }
   398  
   399  func (p *executionRetryablePersistenceClient) RangeCompleteHistoryTasks(
   400  	ctx context.Context,
   401  	request *RangeCompleteHistoryTasksRequest,
   402  ) error {
   403  	op := func(ctx context.Context) error {
   404  		return p.persistence.RangeCompleteHistoryTasks(ctx, request)
   405  	}
   406  
   407  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   408  }
   409  
   410  func (p *executionRetryablePersistenceClient) PutReplicationTaskToDLQ(
   411  	ctx context.Context,
   412  	request *PutReplicationTaskToDLQRequest,
   413  ) error {
   414  	op := func(ctx context.Context) error {
   415  		return p.persistence.PutReplicationTaskToDLQ(ctx, request)
   416  	}
   417  
   418  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   419  }
   420  
   421  func (p *executionRetryablePersistenceClient) GetReplicationTasksFromDLQ(
   422  	ctx context.Context,
   423  	request *GetReplicationTasksFromDLQRequest,
   424  ) (*GetHistoryTasksResponse, error) {
   425  	var response *GetHistoryTasksResponse
   426  	op := func(ctx context.Context) error {
   427  		var err error
   428  		response, err = p.persistence.GetReplicationTasksFromDLQ(ctx, request)
   429  		return err
   430  	}
   431  
   432  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   433  	return response, err
   434  }
   435  
   436  func (p *executionRetryablePersistenceClient) DeleteReplicationTaskFromDLQ(
   437  	ctx context.Context,
   438  	request *DeleteReplicationTaskFromDLQRequest,
   439  ) error {
   440  	op := func(ctx context.Context) error {
   441  		return p.persistence.DeleteReplicationTaskFromDLQ(ctx, request)
   442  	}
   443  
   444  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   445  }
   446  
   447  func (p *executionRetryablePersistenceClient) RangeDeleteReplicationTaskFromDLQ(
   448  	ctx context.Context,
   449  	request *RangeDeleteReplicationTaskFromDLQRequest,
   450  ) error {
   451  	op := func(ctx context.Context) error {
   452  		return p.persistence.RangeDeleteReplicationTaskFromDLQ(ctx, request)
   453  	}
   454  
   455  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   456  }
   457  
   458  func (p *executionRetryablePersistenceClient) IsReplicationDLQEmpty(
   459  	ctx context.Context,
   460  	request *GetReplicationTasksFromDLQRequest,
   461  ) (bool, error) {
   462  	var isEmpty bool
   463  	op := func(ctx context.Context) error {
   464  		var err error
   465  		isEmpty, err = p.persistence.IsReplicationDLQEmpty(ctx, request)
   466  		return err
   467  	}
   468  
   469  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   470  	return isEmpty, err
   471  }
   472  
   473  // AppendHistoryNodes add a node to history node table
   474  func (p *executionRetryablePersistenceClient) AppendHistoryNodes(
   475  	ctx context.Context,
   476  	request *AppendHistoryNodesRequest,
   477  ) (*AppendHistoryNodesResponse, error) {
   478  	var response *AppendHistoryNodesResponse
   479  	op := func(ctx context.Context) error {
   480  		var err error
   481  		response, err = p.persistence.AppendHistoryNodes(ctx, request)
   482  		return err
   483  	}
   484  
   485  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   486  	return response, err
   487  }
   488  
   489  // AppendRawHistoryNodes add a node to history node table
   490  func (p *executionRetryablePersistenceClient) AppendRawHistoryNodes(
   491  	ctx context.Context,
   492  	request *AppendRawHistoryNodesRequest,
   493  ) (*AppendHistoryNodesResponse, error) {
   494  	var response *AppendHistoryNodesResponse
   495  	op := func(ctx context.Context) error {
   496  		var err error
   497  		response, err = p.persistence.AppendRawHistoryNodes(ctx, request)
   498  		return err
   499  	}
   500  
   501  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   502  	return response, err
   503  }
   504  
   505  // ReadHistoryBranch returns history node data for a branch
   506  func (p *executionRetryablePersistenceClient) ReadHistoryBranch(
   507  	ctx context.Context,
   508  	request *ReadHistoryBranchRequest,
   509  ) (*ReadHistoryBranchResponse, error) {
   510  	var response *ReadHistoryBranchResponse
   511  	op := func(ctx context.Context) error {
   512  		var err error
   513  		response, err = p.persistence.ReadHistoryBranch(ctx, request)
   514  		return err
   515  	}
   516  
   517  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   518  	return response, err
   519  }
   520  
   521  // ReadHistoryBranch returns history node data for a branch
   522  func (p *executionRetryablePersistenceClient) ReadHistoryBranchReverse(
   523  	ctx context.Context,
   524  	request *ReadHistoryBranchReverseRequest,
   525  ) (*ReadHistoryBranchReverseResponse, error) {
   526  	var response *ReadHistoryBranchReverseResponse
   527  	op := func(ctx context.Context) error {
   528  		var err error
   529  		response, err = p.persistence.ReadHistoryBranchReverse(ctx, request)
   530  		return err
   531  	}
   532  
   533  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   534  	return response, err
   535  }
   536  
   537  // ReadHistoryBranchByBatch returns history node data for a branch
   538  func (p *executionRetryablePersistenceClient) ReadHistoryBranchByBatch(
   539  	ctx context.Context,
   540  	request *ReadHistoryBranchRequest,
   541  ) (*ReadHistoryBranchByBatchResponse, error) {
   542  	var response *ReadHistoryBranchByBatchResponse
   543  	op := func(ctx context.Context) error {
   544  		var err error
   545  		response, err = p.persistence.ReadHistoryBranchByBatch(ctx, request)
   546  		return err
   547  	}
   548  
   549  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   550  	return response, err
   551  }
   552  
   553  // ReadHistoryBranchByBatch returns history node data for a branch
   554  func (p *executionRetryablePersistenceClient) ReadRawHistoryBranch(
   555  	ctx context.Context,
   556  	request *ReadHistoryBranchRequest,
   557  ) (*ReadRawHistoryBranchResponse, error) {
   558  	var response *ReadRawHistoryBranchResponse
   559  	op := func(ctx context.Context) error {
   560  		var err error
   561  		response, err = p.persistence.ReadRawHistoryBranch(ctx, request)
   562  		return err
   563  	}
   564  
   565  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   566  	return response, err
   567  }
   568  
   569  // ForkHistoryBranch forks a new branch from a old branch
   570  func (p *executionRetryablePersistenceClient) ForkHistoryBranch(
   571  	ctx context.Context,
   572  	request *ForkHistoryBranchRequest,
   573  ) (*ForkHistoryBranchResponse, error) {
   574  	var response *ForkHistoryBranchResponse
   575  	op := func(ctx context.Context) error {
   576  		var err error
   577  		response, err = p.persistence.ForkHistoryBranch(ctx, request)
   578  		return err
   579  	}
   580  
   581  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   582  	return response, err
   583  }
   584  
   585  // DeleteHistoryBranch removes a branch
   586  func (p *executionRetryablePersistenceClient) DeleteHistoryBranch(
   587  	ctx context.Context,
   588  	request *DeleteHistoryBranchRequest,
   589  ) error {
   590  	op := func(ctx context.Context) error {
   591  		return p.persistence.DeleteHistoryBranch(ctx, request)
   592  	}
   593  
   594  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   595  }
   596  
   597  // TrimHistoryBranch trims a branch
   598  func (p *executionRetryablePersistenceClient) TrimHistoryBranch(
   599  	ctx context.Context,
   600  	request *TrimHistoryBranchRequest,
   601  ) (*TrimHistoryBranchResponse, error) {
   602  	var response *TrimHistoryBranchResponse
   603  	op := func(ctx context.Context) error {
   604  		var err error
   605  		response, err = p.persistence.TrimHistoryBranch(ctx, request)
   606  		return err
   607  	}
   608  
   609  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   610  	return response, err
   611  }
   612  
   613  // GetHistoryTree returns all branch information of a tree
   614  func (p *executionRetryablePersistenceClient) GetHistoryTree(
   615  	ctx context.Context,
   616  	request *GetHistoryTreeRequest,
   617  ) (*GetHistoryTreeResponse, error) {
   618  	var response *GetHistoryTreeResponse
   619  	op := func(ctx context.Context) error {
   620  		var err error
   621  		response, err = p.persistence.GetHistoryTree(ctx, request)
   622  		return err
   623  	}
   624  
   625  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   626  	return response, err
   627  }
   628  
   629  func (p *executionRetryablePersistenceClient) GetAllHistoryTreeBranches(
   630  	ctx context.Context,
   631  	request *GetAllHistoryTreeBranchesRequest,
   632  ) (*GetAllHistoryTreeBranchesResponse, error) {
   633  	var response *GetAllHistoryTreeBranchesResponse
   634  	op := func(ctx context.Context) error {
   635  		var err error
   636  		response, err = p.persistence.GetAllHistoryTreeBranches(ctx, request)
   637  		return err
   638  	}
   639  
   640  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   641  	return response, err
   642  }
   643  
   644  func (p *executionRetryablePersistenceClient) Close() {
   645  	p.persistence.Close()
   646  }
   647  
   648  func (p *taskRetryablePersistenceClient) GetName() string {
   649  	return p.persistence.GetName()
   650  }
   651  
   652  func (p *taskRetryablePersistenceClient) CreateTasks(
   653  	ctx context.Context,
   654  	request *CreateTasksRequest,
   655  ) (*CreateTasksResponse, error) {
   656  	var response *CreateTasksResponse
   657  	op := func(ctx context.Context) error {
   658  		var err error
   659  		response, err = p.persistence.CreateTasks(ctx, request)
   660  		return err
   661  	}
   662  
   663  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   664  	return response, err
   665  }
   666  
   667  func (p *taskRetryablePersistenceClient) GetTasks(
   668  	ctx context.Context,
   669  	request *GetTasksRequest,
   670  ) (*GetTasksResponse, error) {
   671  	var response *GetTasksResponse
   672  	op := func(ctx context.Context) error {
   673  		var err error
   674  		response, err = p.persistence.GetTasks(ctx, request)
   675  		return err
   676  	}
   677  
   678  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   679  	return response, err
   680  }
   681  
   682  func (p *taskRetryablePersistenceClient) CompleteTask(
   683  	ctx context.Context,
   684  	request *CompleteTaskRequest,
   685  ) error {
   686  	op := func(ctx context.Context) error {
   687  		return p.persistence.CompleteTask(ctx, request)
   688  	}
   689  
   690  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   691  }
   692  
   693  func (p *taskRetryablePersistenceClient) CompleteTasksLessThan(
   694  	ctx context.Context,
   695  	request *CompleteTasksLessThanRequest,
   696  ) (int, error) {
   697  	var response int
   698  	op := func(ctx context.Context) error {
   699  		var err error
   700  		response, err = p.persistence.CompleteTasksLessThan(ctx, request)
   701  		return err
   702  	}
   703  
   704  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   705  	return response, err
   706  }
   707  
   708  func (p *taskRetryablePersistenceClient) CreateTaskQueue(
   709  	ctx context.Context,
   710  	request *CreateTaskQueueRequest,
   711  ) (*CreateTaskQueueResponse, error) {
   712  	var response *CreateTaskQueueResponse
   713  	op := func(ctx context.Context) error {
   714  		var err error
   715  		response, err = p.persistence.CreateTaskQueue(ctx, request)
   716  		return err
   717  	}
   718  
   719  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   720  	return response, err
   721  }
   722  
   723  func (p *taskRetryablePersistenceClient) UpdateTaskQueue(
   724  	ctx context.Context,
   725  	request *UpdateTaskQueueRequest,
   726  ) (*UpdateTaskQueueResponse, error) {
   727  	var response *UpdateTaskQueueResponse
   728  	op := func(ctx context.Context) error {
   729  		var err error
   730  		response, err = p.persistence.UpdateTaskQueue(ctx, request)
   731  		return err
   732  	}
   733  
   734  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   735  	return response, err
   736  }
   737  
   738  func (p *taskRetryablePersistenceClient) GetTaskQueue(
   739  	ctx context.Context,
   740  	request *GetTaskQueueRequest,
   741  ) (*GetTaskQueueResponse, error) {
   742  	var response *GetTaskQueueResponse
   743  	op := func(ctx context.Context) error {
   744  		var err error
   745  		response, err = p.persistence.GetTaskQueue(ctx, request)
   746  		return err
   747  	}
   748  
   749  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   750  	return response, err
   751  }
   752  
   753  func (p *taskRetryablePersistenceClient) ListTaskQueue(
   754  	ctx context.Context,
   755  	request *ListTaskQueueRequest,
   756  ) (*ListTaskQueueResponse, error) {
   757  	var response *ListTaskQueueResponse
   758  	op := func(ctx context.Context) error {
   759  		var err error
   760  		response, err = p.persistence.ListTaskQueue(ctx, request)
   761  		return err
   762  	}
   763  
   764  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   765  	return response, err
   766  }
   767  
   768  func (p *taskRetryablePersistenceClient) DeleteTaskQueue(
   769  	ctx context.Context,
   770  	request *DeleteTaskQueueRequest,
   771  ) error {
   772  	op := func(ctx context.Context) error {
   773  		return p.persistence.DeleteTaskQueue(ctx, request)
   774  	}
   775  
   776  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   777  }
   778  
   779  func (p *taskRetryablePersistenceClient) GetTaskQueueUserData(
   780  	ctx context.Context,
   781  	request *GetTaskQueueUserDataRequest,
   782  ) (*GetTaskQueueUserDataResponse, error) {
   783  	var response *GetTaskQueueUserDataResponse
   784  	op := func(ctx context.Context) error {
   785  		var err error
   786  		response, err = p.persistence.GetTaskQueueUserData(ctx, request)
   787  		return err
   788  	}
   789  
   790  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   791  	return response, err
   792  }
   793  
   794  func (p *taskRetryablePersistenceClient) UpdateTaskQueueUserData(
   795  	ctx context.Context,
   796  	request *UpdateTaskQueueUserDataRequest,
   797  ) error {
   798  	op := func(ctx context.Context) error {
   799  		return p.persistence.UpdateTaskQueueUserData(ctx, request)
   800  	}
   801  
   802  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   803  	return err
   804  }
   805  
   806  func (p *taskRetryablePersistenceClient) ListTaskQueueUserDataEntries(
   807  	ctx context.Context,
   808  	request *ListTaskQueueUserDataEntriesRequest,
   809  ) (*ListTaskQueueUserDataEntriesResponse, error) {
   810  	var response *ListTaskQueueUserDataEntriesResponse
   811  	op := func(ctx context.Context) error {
   812  		var err error
   813  		response, err = p.persistence.ListTaskQueueUserDataEntries(ctx, request)
   814  		return err
   815  	}
   816  
   817  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   818  	return response, err
   819  }
   820  
   821  func (p *taskRetryablePersistenceClient) GetTaskQueuesByBuildId(ctx context.Context, request *GetTaskQueuesByBuildIdRequest) ([]string, error) {
   822  	var response []string
   823  	op := func(ctx context.Context) error {
   824  		var err error
   825  		response, err = p.persistence.GetTaskQueuesByBuildId(ctx, request)
   826  		return err
   827  	}
   828  
   829  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   830  	return response, err
   831  }
   832  
   833  func (p *taskRetryablePersistenceClient) CountTaskQueuesByBuildId(ctx context.Context, request *CountTaskQueuesByBuildIdRequest) (int, error) {
   834  	var response int
   835  	op := func(ctx context.Context) error {
   836  		var err error
   837  		response, err = p.persistence.CountTaskQueuesByBuildId(ctx, request)
   838  		return err
   839  	}
   840  
   841  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   842  	return response, err
   843  }
   844  
   845  func (p *taskRetryablePersistenceClient) Close() {
   846  	p.persistence.Close()
   847  }
   848  
   849  func (p *metadataRetryablePersistenceClient) GetName() string {
   850  	return p.persistence.GetName()
   851  }
   852  
   853  func (p *metadataRetryablePersistenceClient) CreateNamespace(
   854  	ctx context.Context,
   855  	request *CreateNamespaceRequest,
   856  ) (*CreateNamespaceResponse, error) {
   857  	var response *CreateNamespaceResponse
   858  	op := func(ctx context.Context) error {
   859  		var err error
   860  		response, err = p.persistence.CreateNamespace(ctx, request)
   861  		return err
   862  	}
   863  
   864  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   865  	return response, err
   866  }
   867  
   868  func (p *metadataRetryablePersistenceClient) GetNamespace(
   869  	ctx context.Context,
   870  	request *GetNamespaceRequest,
   871  ) (*GetNamespaceResponse, error) {
   872  	var response *GetNamespaceResponse
   873  	op := func(ctx context.Context) error {
   874  		var err error
   875  		response, err = p.persistence.GetNamespace(ctx, request)
   876  		return err
   877  	}
   878  
   879  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   880  	return response, err
   881  }
   882  
   883  func (p *metadataRetryablePersistenceClient) UpdateNamespace(
   884  	ctx context.Context,
   885  	request *UpdateNamespaceRequest,
   886  ) error {
   887  	op := func(ctx context.Context) error {
   888  		return p.persistence.UpdateNamespace(ctx, request)
   889  	}
   890  
   891  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   892  }
   893  
   894  func (p *metadataRetryablePersistenceClient) RenameNamespace(
   895  	ctx context.Context,
   896  	request *RenameNamespaceRequest,
   897  ) error {
   898  	op := func(ctx context.Context) error {
   899  		return p.persistence.RenameNamespace(ctx, request)
   900  	}
   901  
   902  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   903  }
   904  
   905  func (p *metadataRetryablePersistenceClient) DeleteNamespace(
   906  	ctx context.Context,
   907  	request *DeleteNamespaceRequest,
   908  ) error {
   909  	op := func(ctx context.Context) error {
   910  		return p.persistence.DeleteNamespace(ctx, request)
   911  	}
   912  
   913  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   914  }
   915  
   916  func (p *metadataRetryablePersistenceClient) DeleteNamespaceByName(
   917  	ctx context.Context,
   918  	request *DeleteNamespaceByNameRequest,
   919  ) error {
   920  	op := func(ctx context.Context) error {
   921  		return p.persistence.DeleteNamespaceByName(ctx, request)
   922  	}
   923  
   924  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   925  }
   926  
   927  func (p *metadataRetryablePersistenceClient) ListNamespaces(
   928  	ctx context.Context,
   929  	request *ListNamespacesRequest,
   930  ) (*ListNamespacesResponse, error) {
   931  	var response *ListNamespacesResponse
   932  	op := func(ctx context.Context) error {
   933  		var err error
   934  		response, err = p.persistence.ListNamespaces(ctx, request)
   935  		return err
   936  	}
   937  
   938  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   939  	return response, err
   940  }
   941  
   942  func (p *metadataRetryablePersistenceClient) GetMetadata(
   943  	ctx context.Context,
   944  ) (*GetMetadataResponse, error) {
   945  	var response *GetMetadataResponse
   946  	op := func(ctx context.Context) error {
   947  		var err error
   948  		response, err = p.persistence.GetMetadata(ctx)
   949  		return err
   950  	}
   951  
   952  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   953  	return response, err
   954  }
   955  
   956  func (p *metadataRetryablePersistenceClient) InitializeSystemNamespaces(
   957  	ctx context.Context,
   958  	currentClusterName string,
   959  ) error {
   960  	op := func(ctx context.Context) error {
   961  		return p.persistence.InitializeSystemNamespaces(ctx, currentClusterName)
   962  	}
   963  
   964  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   965  }
   966  
   967  func (p *metadataRetryablePersistenceClient) Close() {
   968  	p.persistence.Close()
   969  }
   970  
   971  func (p *clusterMetadataRetryablePersistenceClient) GetName() string {
   972  	return p.persistence.GetName()
   973  }
   974  
   975  func (p *clusterMetadataRetryablePersistenceClient) GetClusterMembers(
   976  	ctx context.Context,
   977  	request *GetClusterMembersRequest,
   978  ) (*GetClusterMembersResponse, error) {
   979  	var response *GetClusterMembersResponse
   980  	op := func(ctx context.Context) error {
   981  		var err error
   982  		response, err = p.persistence.GetClusterMembers(ctx, request)
   983  		return err
   984  	}
   985  
   986  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   987  	return response, err
   988  }
   989  
   990  func (p *clusterMetadataRetryablePersistenceClient) UpsertClusterMembership(
   991  	ctx context.Context,
   992  	request *UpsertClusterMembershipRequest,
   993  ) error {
   994  	op := func(ctx context.Context) error {
   995  		return p.persistence.UpsertClusterMembership(ctx, request)
   996  	}
   997  
   998  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
   999  }
  1000  
  1001  func (p *clusterMetadataRetryablePersistenceClient) PruneClusterMembership(
  1002  	ctx context.Context,
  1003  	request *PruneClusterMembershipRequest,
  1004  ) error {
  1005  	op := func(ctx context.Context) error {
  1006  		return p.persistence.PruneClusterMembership(ctx, request)
  1007  	}
  1008  
  1009  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1010  }
  1011  
  1012  func (p *clusterMetadataRetryablePersistenceClient) ListClusterMetadata(
  1013  	ctx context.Context,
  1014  	request *ListClusterMetadataRequest,
  1015  ) (*ListClusterMetadataResponse, error) {
  1016  	var response *ListClusterMetadataResponse
  1017  	op := func(ctx context.Context) error {
  1018  		var err error
  1019  		response, err = p.persistence.ListClusterMetadata(ctx, request)
  1020  		return err
  1021  	}
  1022  
  1023  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1024  	return response, err
  1025  }
  1026  
  1027  func (p *clusterMetadataRetryablePersistenceClient) GetCurrentClusterMetadata(
  1028  	ctx context.Context,
  1029  ) (*GetClusterMetadataResponse, error) {
  1030  	var response *GetClusterMetadataResponse
  1031  	op := func(ctx context.Context) error {
  1032  		var err error
  1033  		response, err = p.persistence.GetCurrentClusterMetadata(ctx)
  1034  		return err
  1035  	}
  1036  
  1037  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1038  	return response, err
  1039  }
  1040  
  1041  func (p *clusterMetadataRetryablePersistenceClient) GetClusterMetadata(
  1042  	ctx context.Context,
  1043  	request *GetClusterMetadataRequest,
  1044  ) (*GetClusterMetadataResponse, error) {
  1045  	var response *GetClusterMetadataResponse
  1046  	op := func(ctx context.Context) error {
  1047  		var err error
  1048  		response, err = p.persistence.GetClusterMetadata(ctx, request)
  1049  		return err
  1050  	}
  1051  
  1052  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1053  	return response, err
  1054  }
  1055  
  1056  func (p *clusterMetadataRetryablePersistenceClient) SaveClusterMetadata(
  1057  	ctx context.Context,
  1058  	request *SaveClusterMetadataRequest,
  1059  ) (bool, error) {
  1060  	var response bool
  1061  	op := func(ctx context.Context) error {
  1062  		var err error
  1063  		response, err = p.persistence.SaveClusterMetadata(ctx, request)
  1064  		return err
  1065  	}
  1066  
  1067  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1068  	return response, err
  1069  }
  1070  
  1071  func (p *clusterMetadataRetryablePersistenceClient) DeleteClusterMetadata(
  1072  	ctx context.Context,
  1073  	request *DeleteClusterMetadataRequest,
  1074  ) error {
  1075  	op := func(ctx context.Context) error {
  1076  		return p.persistence.DeleteClusterMetadata(ctx, request)
  1077  	}
  1078  
  1079  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1080  }
  1081  
  1082  func (p *clusterMetadataRetryablePersistenceClient) Close() {
  1083  	p.persistence.Close()
  1084  }
  1085  
  1086  func (p *queueRetryablePersistenceClient) Init(
  1087  	ctx context.Context,
  1088  	blob *commonpb.DataBlob,
  1089  ) error {
  1090  	op := func(ctx context.Context) error {
  1091  		return p.persistence.Init(ctx, blob)
  1092  	}
  1093  
  1094  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1095  }
  1096  
  1097  func (p *queueRetryablePersistenceClient) EnqueueMessage(
  1098  	ctx context.Context,
  1099  	blob *commonpb.DataBlob,
  1100  ) error {
  1101  	op := func(ctx context.Context) error {
  1102  		return p.persistence.EnqueueMessage(ctx, blob)
  1103  	}
  1104  
  1105  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1106  }
  1107  
  1108  func (p *queueRetryablePersistenceClient) ReadMessages(
  1109  	ctx context.Context,
  1110  	lastMessageID int64,
  1111  	maxCount int,
  1112  ) ([]*QueueMessage, error) {
  1113  	var response []*QueueMessage
  1114  	op := func(ctx context.Context) error {
  1115  		var err error
  1116  		response, err = p.persistence.ReadMessages(ctx, lastMessageID, maxCount)
  1117  		return err
  1118  	}
  1119  
  1120  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1121  	return response, err
  1122  }
  1123  
  1124  func (p *queueRetryablePersistenceClient) UpdateAckLevel(
  1125  	ctx context.Context,
  1126  	metadata *InternalQueueMetadata,
  1127  ) error {
  1128  	op := func(ctx context.Context) error {
  1129  		return p.persistence.UpdateAckLevel(ctx, metadata)
  1130  	}
  1131  
  1132  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1133  }
  1134  
  1135  func (p *queueRetryablePersistenceClient) GetAckLevels(
  1136  	ctx context.Context,
  1137  ) (*InternalQueueMetadata, error) {
  1138  	var response *InternalQueueMetadata
  1139  	op := func(ctx context.Context) error {
  1140  		var err error
  1141  		response, err = p.persistence.GetAckLevels(ctx)
  1142  		return err
  1143  	}
  1144  
  1145  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1146  	return response, err
  1147  }
  1148  
  1149  func (p *queueRetryablePersistenceClient) DeleteMessagesBefore(
  1150  	ctx context.Context,
  1151  	messageID int64,
  1152  ) error {
  1153  	op := func(ctx context.Context) error {
  1154  		return p.persistence.DeleteMessagesBefore(ctx, messageID)
  1155  	}
  1156  
  1157  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1158  }
  1159  
  1160  func (p *queueRetryablePersistenceClient) EnqueueMessageToDLQ(
  1161  	ctx context.Context,
  1162  	blob *commonpb.DataBlob,
  1163  ) (int64, error) {
  1164  	var response int64
  1165  	op := func(ctx context.Context) error {
  1166  		var err error
  1167  		response, err = p.persistence.EnqueueMessageToDLQ(ctx, blob)
  1168  		return err
  1169  	}
  1170  
  1171  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1172  	return response, err
  1173  }
  1174  
  1175  func (p *queueRetryablePersistenceClient) ReadMessagesFromDLQ(
  1176  	ctx context.Context,
  1177  	firstMessageID int64,
  1178  	lastMessageID int64,
  1179  	pageSize int,
  1180  	pageToken []byte,
  1181  ) ([]*QueueMessage, []byte, error) {
  1182  	var messages []*QueueMessage
  1183  	var nextPageToken []byte
  1184  	op := func(ctx context.Context) error {
  1185  		var err error
  1186  		messages, nextPageToken, err = p.persistence.ReadMessagesFromDLQ(ctx, firstMessageID, lastMessageID, pageSize, pageToken)
  1187  		return err
  1188  	}
  1189  
  1190  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1191  	return messages, nextPageToken, err
  1192  }
  1193  
  1194  func (p *queueRetryablePersistenceClient) RangeDeleteMessagesFromDLQ(
  1195  	ctx context.Context,
  1196  	firstMessageID int64,
  1197  	lastMessageID int64,
  1198  ) error {
  1199  	op := func(ctx context.Context) error {
  1200  		return p.persistence.RangeDeleteMessagesFromDLQ(ctx, firstMessageID, lastMessageID)
  1201  	}
  1202  
  1203  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1204  }
  1205  func (p *queueRetryablePersistenceClient) UpdateDLQAckLevel(
  1206  	ctx context.Context,
  1207  	metadata *InternalQueueMetadata,
  1208  ) error {
  1209  	op := func(ctx context.Context) error {
  1210  		return p.persistence.UpdateDLQAckLevel(ctx, metadata)
  1211  	}
  1212  
  1213  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1214  }
  1215  
  1216  func (p *queueRetryablePersistenceClient) GetDLQAckLevels(
  1217  	ctx context.Context,
  1218  ) (*InternalQueueMetadata, error) {
  1219  	var response *InternalQueueMetadata
  1220  	op := func(ctx context.Context) error {
  1221  		var err error
  1222  		response, err = p.persistence.GetDLQAckLevels(ctx)
  1223  		return err
  1224  	}
  1225  
  1226  	err := backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1227  	return response, err
  1228  }
  1229  
  1230  func (p *queueRetryablePersistenceClient) DeleteMessageFromDLQ(
  1231  	ctx context.Context,
  1232  	messageID int64,
  1233  ) error {
  1234  	op := func(ctx context.Context) error {
  1235  		return p.persistence.DeleteMessageFromDLQ(ctx, messageID)
  1236  	}
  1237  
  1238  	return backoff.ThrottleRetryContext(ctx, op, p.policy, p.isRetryable)
  1239  }
  1240  
  1241  func (p *queueRetryablePersistenceClient) Close() {
  1242  	p.persistence.Close()
  1243  }