Skip to content

Commit

Permalink
Use TransactionResults for reduce gql request
Browse files Browse the repository at this point in the history
  • Loading branch information
ipdae committed Sep 3, 2024
1 parent 0d0d1fa commit a3e1963
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,12 @@ public async Task<string> StageTx(Transaction tx)
throw new GraphQLException(msg);
}

/// <summary>
/// query transaction result by given <see cref="TxId"/>
/// </summary>
/// <param name="txId"><see cref="TxId"/></param>
/// <returns><see cref="TransactionResult"/></returns>
/// <exception cref="GraphQLException"></exception>
public async Task<TransactionResult> Result(TxId txId)
{
var query = @"
Expand Down Expand Up @@ -146,6 +152,54 @@ public async Task<TransactionResult> Result(TxId txId)
throw new GraphQLException(msg);
}


/// <summary>
/// query transaction result by given <see cref="TxId"/>
/// </summary>
/// <param name="txIds"><see cref="List{String}"/></param>
/// <returns><see cref="IReadOnlyList{TransactionResult}"/></returns>
/// <exception cref="GraphQLException"></exception>
public async Task<IReadOnlyList<TransactionResult>> Results(List<string> txIds)
{
var query = @"
query($txIds: [TxId]!) {
transaction {
transactionResults(txIds: $txIds) {
txStatus
exceptionNames
blockIndex
}
}
}
";
var variables = new
{
txIds,
};
var request = new GraphQLHttpRequestWithAuth
{
Query = query,
Variables = variables,
Authentication = new AuthenticationHeaderValue("Bearer",Token()),
};

GraphQLResponse<TransactionResultsResponse> resp;
try
{
resp = await _client.SendQueryAsync<TransactionResultsResponse>(request);
}
catch (Exception e)
{
_logger.LogError("{Msg}", e.Message);
throw;
}

if (resp.Errors is null) return resp.Data.Transaction.TransactionResults;

var msg = resp.Errors.Aggregate("", (current, error) => current + error.Message + "\n");
throw new GraphQLException(msg);
}

public async Task<int> Tip()
{
var query = @"query {
Expand Down Expand Up @@ -220,6 +274,16 @@ public class TransactionResultQuery
public TransactionResult TransactionResult;
}

public class TransactionResultsResponse
{
public TransactionResultsQuery Transaction;
}

public class TransactionResultsQuery
{
public IReadOnlyList<TransactionResult> TransactionResults;
}

public class TransactionResult
{
public List<string>? exceptionNames;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public static async Task StageTx(RewardDbContext dbContext, NineChroniclesClient
CancellationToken stoppingToken)
{
var transactions = dbContext.Transactions
.Where(p => p.Result == TransactionStatus.CREATED || p.Result == TransactionStatus.INVALID).ToList();
.Where(p => p.Result == TransactionStatus.CREATED || p.Result == TransactionStatus.INVALID);
foreach (var transaction in transactions)
{
var tx = Transaction.Deserialize(Convert.FromBase64String(transaction.Payload));
Expand Down
20 changes: 15 additions & 5 deletions PatrolRewardService/PatrolRewardService/TransactionWorker.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using Libplanet.Types.Tx;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using PatrolRewardService.GraphqlTypes;
Expand Down Expand Up @@ -45,6 +44,12 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
}
}

/// <summary>
/// Update staged transactions result
/// </summary>
/// <param name="dbContext"></param>
/// <param name="client"></param>
/// <param name="stoppingToken"></param>
public static async Task UpdateTx(RewardDbContext dbContext, NineChroniclesClient client,
CancellationToken stoppingToken)
{
Expand All @@ -53,11 +58,16 @@ public static async Task UpdateTx(RewardDbContext dbContext, NineChroniclesClien
.OrderBy(p => p.Nonce)
.Take(100)
.ToList();
foreach (var tx in transactions)
var results = await client.Results(transactions.Select(t => t.TxId.ToHex()).ToList());
var count = transactions.Count;
for (int i = 0; i < count; i++)
{
var result = await client.Result(tx.TxId);
tx.Result = result.txStatus;
tx.ExceptionName = result.exceptionNames?.FirstOrDefault();
var result = results[i];
var tx = transactions[i];
var txResult = result.txStatus;
var exceptionName = result.exceptionNames?.FirstOrDefault();
tx.Result = txResult;
tx.ExceptionName = exceptionName;
}

dbContext.UpdateRange(transactions);
Expand Down

0 comments on commit a3e1963

Please sign in to comment.