internal async Task Execute()

in Amazon.QLDB.Driver/session/AsyncQldbSession.cs [66:136]


        internal async Task<T> Execute<T>(
            Func<AsyncTransactionExecutor, Task<T>> func,
            CancellationToken cancellationToken)
        {
            ValidationUtils.AssertNotNull(func, "func");

            AsyncTransaction transaction = null;
            string transactionId = QldbTransactionException.DefaultTransactionId;
            try
            {
                transaction = await this.StartTransaction(cancellationToken);
                transactionId = transaction.Id;
                T returnedValue = await func(new AsyncTransactionExecutor(transaction, this.serializer));
                if (returnedValue is IAsyncResult result)
                {
                    returnedValue = (T)(object)(await AsyncBufferedResult.BufferResultAsync(result));
                }

                await transaction.Commit();
                return returnedValue;
            }
            catch (TransactionAbortedException)
            {
                throw;
            }
            catch (InvalidSessionException ise)
            {
                if (IsTransactionExpiredException(ise))
                {
                    throw new QldbTransactionException(
                        transactionId,
                        await this.TryAbort(transaction, cancellationToken),
                        ise);
                }
                else
                {
                    throw new RetriableException(transactionId, false, ise);
                }
            }
            catch (OccConflictException occ)
            {
                throw new RetriableException(transactionId, true, occ);
            }
            catch (AmazonServiceException ase)
            {
                if (ase.StatusCode == HttpStatusCode.InternalServerError ||
                    ase.StatusCode == HttpStatusCode.ServiceUnavailable)
                {
                    throw new RetriableException(
                        transactionId,
                        await this.TryAbort(transaction, cancellationToken),
                        ase);
                }

                throw new QldbTransactionException(
                    transactionId,
                    await this.TryAbort(transaction, cancellationToken),
                    ase);
            }
            catch (Exception e)
            {
                throw new QldbTransactionException(
                    transactionId,
                    await this.TryAbort(transaction, cancellationToken),
                    e);
            }
            finally
            {
                transaction?.Dispose();
            }
        }