Skip to content

Commit

Permalink
Optimization WalletWasabi#2
Browse files Browse the repository at this point in the history
  • Loading branch information
kiminuo committed Mar 10, 2023
1 parent 5ddbe33 commit 403fc15
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 10 deletions.
36 changes: 26 additions & 10 deletions WalletWasabi/Stores/IndexStore.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using Microsoft.Data.Sqlite;
using NBitcoin;
using Nito.AsyncEx;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using WalletWasabi.Backend.Models;
using WalletWasabi.Blockchain.BlockFilters;
using WalletWasabi.Blockchain.Blocks;
Expand Down Expand Up @@ -118,22 +120,36 @@ private bool TryProcessFilterNoLock(FilterModel filter, bool enqueue)

public async Task AddNewFiltersAsync(IEnumerable<FilterModel> filters, CancellationToken cancellationToken)
{
var successAny = false;

foreach (var filter in filters)
if (NewFilter is null)
{
var success = false;
// Lock once.
using IDisposable lockDisposable = await IndexLock.LockAsync(cancellationToken).ConfigureAwait(false);

using SqliteTransaction sqliteTransaction = IndexStorage.BeginTransaction();

using (await IndexLock.LockAsync(cancellationToken).ConfigureAwait(false))
foreach (FilterModel filter in filters)
{
success = TryProcessFilterNoLock(filter, enqueue: true);
// TODO: Should throw?
_ = TryProcessFilterNoLock(filter, enqueue: true);
}

successAny = successAny || success;

if (success)
sqliteTransaction.Commit();
}
else
{
foreach (FilterModel filter in filters)
{
NewFilter?.Invoke(this, filter); // Event always outside the lock.
bool success;

using (await IndexLock.LockAsync(cancellationToken).ConfigureAwait(false))
{
success = TryProcessFilterNoLock(filter, enqueue: true);
}

if (success)
{
NewFilter?.Invoke(this, filter); // Event always outside the lock.
}
}
}
}
Expand Down
9 changes: 9 additions & 0 deletions WalletWasabi/Stores/SqliteStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,15 @@ public static SqliteStorage FromFile(string path, FilterModel? startingFilter =
return storage;
}

/// <summary>
/// Begin a transaction.
/// </summary>
/// <seealso href="https://learn.microsoft.com/en-us/dotnet/standard/data/sqlite/transactions"/>
public SqliteTransaction BeginTransaction()
{
return Connection.BeginTransaction();
}

/// <summary>
/// Returns all filters with height ≥ than the given one.
/// </summary>
Expand Down

0 comments on commit 403fc15

Please sign in to comment.