Skip to content

Commit 2e87471

Browse files
authored
Merge pull request #94 from Nexus-Mods/behavior-subject-fixes
Behavior subject fixes
2 parents 9f3210d + 2e20f02 commit 2e87471

File tree

6 files changed

+21
-13
lines changed

6 files changed

+21
-13
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
## Changelog
22

3-
### 0.9.81 - 19/09/2024
3+
### 0.9.82 - 12/09/2024
4+
* Fix a O(n) issue caused by Rx storing observers in a ImmutableList inside a `BehaviorSubject`. Switched to using R3 internally. Over
5+
time Rx's uses will be replaced with R3 to avoid these and several other issues
6+
7+
### 0.9.81 - 9/09/2024
48
* Fix a bug the source generators when trying to use HashedBlobAttributes
59

610
### 0.9.80 - 22/08/2024

src/NexusMods.MnemonicDB.Abstractions/IDatomStore.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Threading;
43
using System.Threading.Tasks;
54
using NexusMods.MnemonicDB.Abstractions.IndexSegments;
65
using NexusMods.MnemonicDB.Abstractions.Internals;
76
using NexusMods.MnemonicDB.Abstractions.TxFunctions;
7+
using R3;
88

99
namespace NexusMods.MnemonicDB.Abstractions;
1010

@@ -17,7 +17,7 @@ public interface IDatomStore : IDisposable
1717
/// An observable of the transaction log, for getting the latest changes to the store. This observable
1818
/// will always start with the most recent value, so there is no reason to use `StartWith` or `Replay` on it.
1919
/// </summary>
20-
public IObservable<IDb> TxLog { get; }
20+
public Observable<IDb> TxLog { get; }
2121

2222
/// <summary>
2323
/// Gets the latest transaction id found in the log.

src/NexusMods.MnemonicDB.Abstractions/NexusMods.MnemonicDB.Abstractions.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<PackageReference Include="DynamicData" Version="8.4.1"/>
99
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1"/>
1010
<PackageReference Include="NexusMods.Paths" Version="0.9.5" />
11+
<PackageReference Include="R3" Version="1.2.8" />
1112
<PackageReference Include="System.IO.Hashing" Version="8.0.0" />
1213
<PackageReference Include="TransparentValueObjects" Version="1.0.1" PrivateAssets="all" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
1314
<PackageReference Update="JetBrains.Annotations" Version="2023.3.0"/>

src/NexusMods.MnemonicDB/Connection.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using System.Reactive.Linq;
54
using System.Reactive.Subjects;
65
using System.Threading;
76
using System.Threading.Tasks;
@@ -13,6 +12,9 @@
1312
using NexusMods.MnemonicDB.Abstractions.Query;
1413
using NexusMods.MnemonicDB.Abstractions.TxFunctions;
1514
using NexusMods.MnemonicDB.Storage;
15+
using R3;
16+
using Observable = System.Reactive.Linq.Observable;
17+
using ObservableExtensions = R3.ObservableExtensions;
1618

1719
namespace NexusMods.MnemonicDB;
1820

@@ -25,7 +27,7 @@ public class Connection : IConnection
2527
private readonly Dictionary<Symbol, IAttribute> _declaredAttributes;
2628
private readonly ILogger<Connection> _logger;
2729

28-
private BehaviorSubject<IDb> _dbStream;
30+
private R3.BehaviorSubject<IDb> _dbStream;
2931
private IDisposable? _dbStreamDisposable;
3032
private readonly IAnalyzer[] _analyzers;
3133

@@ -38,19 +40,19 @@ public Connection(ILogger<Connection> logger, IDatomStore store, IServiceProvide
3840
_logger = logger;
3941
_declaredAttributes = declaredAttributes.ToDictionary(a => a.Id);
4042
_store = store;
41-
_dbStream = new BehaviorSubject<IDb>(default!);
43+
_dbStream = new R3.BehaviorSubject<IDb>(default!);
4244
_analyzers = analyzers.ToArray();
4345
Bootstrap();
4446
}
4547

4648
/// <summary>
4749
/// Scrubs the transaction stream so that we only ever move forward and never repeat transactions
4850
/// </summary>
49-
private IObservable<Db> ProcessUpdate(IObservable<IDb> dbStream)
51+
private R3.Observable<Db> ProcessUpdate(R3.Observable<IDb> dbStream)
5052
{
5153
IDb? prev = null;
5254

53-
return Observable.Create((IObserver<Db> observer) =>
55+
return R3.Observable.Create((Observer<Db> observer) =>
5456
{
5557
return dbStream.Subscribe(nextItem =>
5658
{
@@ -76,7 +78,7 @@ private IObservable<Db> ProcessUpdate(IObservable<IDb> dbStream)
7678

7779
observer.OnNext((Db)nextItem);
7880
prev = nextItem;
79-
}, observer.OnError, observer.OnCompleted);
81+
}, observer.OnCompleted);
8082
});
8183
}
8284

@@ -134,7 +136,7 @@ public IObservable<IDb> Revisions
134136
{
135137
if (_dbStream == default!)
136138
ThrowNullDb();
137-
return _dbStream!;
139+
return ObservableExtensions.AsSystemObservable(_dbStream!);
138140
}
139141
}
140142

@@ -198,7 +200,7 @@ private void Bootstrap()
198200
AddMissingAttributes(_declaredAttributes.Values);
199201

200202
_dbStreamDisposable = ProcessUpdate(_store.TxLog)
201-
.Subscribe(_dbStream);
203+
.Subscribe(itm => _dbStream.OnNext(itm));
202204
}
203205
catch (Exception ex)
204206
{

src/NexusMods.MnemonicDB/NexusMods.MnemonicDB.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<PackageReference Include="DynamicData" Version="8.4.1"/>
88
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.1"/>
99
<PackageReference Include="Microsoft.Extensions.ObjectPool" Version="8.0.6" />
10+
<PackageReference Include="R3" Version="1.2.8" />
1011
<PackageReference Include="Reloaded.Memory" Version="9.4.1"/>
1112
<PackageReference Include="RocksDB" Version="8.11.3.46984" />
1213
<PackageReference Include="System.Reactive" Version="6.0.1" />

src/NexusMods.MnemonicDB/Storage/DatomStore.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Collections.Generic;
44
using System.Diagnostics;
55
using System.Linq;
6-
using System.Reactive.Subjects;
76
using System.Runtime.InteropServices;
87
using System.Threading;
98
using System.Threading.Tasks;
@@ -18,6 +17,7 @@
1817
using NexusMods.MnemonicDB.Abstractions.TxFunctions;
1918
using NexusMods.MnemonicDB.Storage.Abstractions;
2019
using NexusMods.MnemonicDB.Storage.DatomStorageStructures;
20+
using R3;
2121
using Reloaded.Memory.Extensions;
2222

2323
namespace NexusMods.MnemonicDB.Storage;
@@ -158,7 +158,7 @@ public DatomStore(ILogger<DatomStore> logger, AttributeRegistry registry, DatomS
158158
}
159159

160160
/// <inheritdoc />
161-
public IObservable<IDb> TxLog
161+
public Observable<IDb> TxLog
162162
{
163163
get
164164
{

0 commit comments

Comments
 (0)