// attempt to clear transaction from commit log private async Task <bool> TryCollect(Guid transactionId) { try { var storeComplete = new TaskCompletionSource <bool>(); // Now we can remove the commit record. StorageBatch <TState> storageBatch = getStorageBatch(); storageBatch.Collect(transactionId); storageBatch.FollowUpAction(() => { if (this.logger.IsEnabled(LogLevel.Trace)) { this.logger.LogTrace("Collection completed. TransactionId:{TransactionId}", transactionId); } this.pending.Remove(transactionId); storeComplete.TrySetResult(true); }); storageWorker.Notify(); // wait for storage call, so we don't free spin await Task.WhenAll(storeComplete.Task, Task.Delay(this.options.ConfirmationRetryDelay)); if (storeComplete.Task.IsCompleted) { return(storeComplete.Task.Result); } } catch (Exception ex) { this.logger.LogWarning($"Error occured while cleaning up transaction {transactionId} from commit log. Will retry.", ex); } return(false); }
// attempt to clear transaction from commit log private async Task <bool> TryCollect(Guid transactionId) { try { var storeComplete = new TaskCompletionSource <bool>(TaskCreationOptions.RunContinuationsAsynchronously); // Now we can remove the commit record. StorageBatch <TState> storageBatch = getStorageBatch(); storageBatch.Collect(transactionId); storageBatch.FollowUpAction(() => { if (this.logger.IsEnabled(LogLevel.Trace)) { this.logger.LogTrace("Collection completed. TransactionId:{TransactionId}", transactionId); } this.pending.Remove(transactionId); storeComplete.TrySetResult(true); }); storageWorker.Notify(); // wait for storage call, so we don't free spin return(await storeComplete.Task); } catch (Exception ex) { this.logger.LogWarning(ex, "Error occured while cleaning up transaction {TransactionId} from commit log. Will retry.", transactionId); } return(false); }