1
1
using System . Collections . Concurrent ;
2
+ using System . Threading ;
2
3
using Tenray . ZoneTree . Logger ;
3
4
using Tenray . ZoneTree . Segments ;
4
5
using Tenray . ZoneTree . Segments . Disk ;
@@ -36,12 +37,6 @@ public sealed class ZoneTreeMaintainer<TKey, TValue> : IMaintainer, IDisposable
36
37
/// </summary>
37
38
public IZoneTreeMaintenance < TKey , TValue > Maintenance { get ; }
38
39
39
- /// <inheritdoc/>
40
- public int MinimumSparseArrayLength { get ; set ; }
41
-
42
- /// <inheritdoc/>
43
- public int SparseArrayStepLength { get ; set ; } = 1_000 ;
44
-
45
40
/// <inheritdoc/>
46
41
public int ThresholdForMergeOperationStart { get ; set ; } = 0 ;
47
42
@@ -105,17 +100,27 @@ void AttachEvents()
105
100
Maintenance . OnDiskSegmentCreated += OnDiskSegmentCreated ;
106
101
Maintenance . OnMergeOperationEnded += OnMergeOperationEnded ;
107
102
Maintenance . OnZoneTreeIsDisposing += OnZoneTreeIsDisposing ;
103
+ Maintenance . OnBottomSegmentsMergeOperationEnded += OnBottomSegmentsMergeOperationEnded ;
108
104
}
109
105
106
+
110
107
void OnZoneTreeIsDisposing ( IZoneTreeMaintenance < TKey , TValue > zoneTree )
111
108
{
112
109
Trace ( "ZoneTree is disposing. ZoneTreeMaintainer disposal started." ) ;
113
110
PeriodicTimerCancellationTokenSource . Cancel ( ) ;
114
- CompleteRunningTasks ( ) ;
111
+ WaitForBackgroundThreads ( ) ;
115
112
Dispose ( ) ;
116
113
Trace ( "ZoneTreeMaintainer is disposed." ) ;
117
114
}
118
115
116
+ void OnBottomSegmentsMergeOperationEnded (
117
+ IZoneTreeMaintenance < TKey , TValue > zoneTree ,
118
+ MergeResult mergeResult )
119
+ {
120
+ Trace ( mergeResult . ToString ( ) ) ;
121
+ MergerThreads . Remove ( Environment . CurrentManagedThreadId , out _ ) ;
122
+ }
123
+
119
124
void OnMergeOperationEnded (
120
125
IZoneTreeMaintenance < TKey , TValue > zoneTree ,
121
126
MergeResult mergeResult )
@@ -168,7 +173,8 @@ void OnMutableSegmentMovedForward(IZoneTreeMaintenance<TKey, TValue> zoneTree)
168
173
StartMerge ( ) ;
169
174
}
170
175
171
- void StartMerge ( )
176
+ /// <inheritdoc/>
177
+ public void StartMerge ( )
172
178
{
173
179
lock ( this )
174
180
{
@@ -182,14 +188,39 @@ void StartMerge()
182
188
}
183
189
}
184
190
191
+
192
+ /// <inheritdoc/>
193
+ public void StartBottomSegmentsMerge (
194
+ int fromIndex = 0 , int toIndex = int . MaxValue )
195
+ {
196
+ lock ( this )
197
+ {
198
+ var mergerThread = Maintenance
199
+ . StartBottomSegmentsMergeOperation ( fromIndex , toIndex ) ;
200
+ if ( mergerThread == null )
201
+ return ;
202
+ MergerThreads . AddOrUpdate (
203
+ mergerThread . ManagedThreadId ,
204
+ mergerThread ,
205
+ ( key , value ) => mergerThread ) ;
206
+ }
207
+ }
208
+
185
209
/// <inheritdoc/>
186
- public void TryCancelRunningTasks ( )
210
+ public void TryCancelBackgroundThreads ( )
187
211
{
188
212
Maintenance . TryCancelMergeOperation ( ) ;
213
+ Maintenance . TryCancelBottomSegmentsMergeOperation ( ) ;
189
214
}
190
215
191
216
/// <inheritdoc/>
192
- public void CompleteRunningTasks ( )
217
+ public void WaitForBackgroundThreads ( )
218
+ {
219
+ WaitForBackgroundThreadsAsync ( ) . Wait ( ) ;
220
+ }
221
+
222
+ /// <inheritdoc/>
223
+ public async Task WaitForBackgroundThreadsAsync ( )
193
224
{
194
225
while ( true )
195
226
{
@@ -203,7 +234,7 @@ public void CompleteRunningTasks()
203
234
if ( t . ThreadState == ThreadState . Stopped )
204
235
MergerThreads . TryRemove ( a . Key , out var _ ) ;
205
236
else
206
- t . Join ( ) ;
237
+ await Task . Run ( ( ) => t . Join ( ) ) ;
207
238
}
208
239
Trace ( "Wait ended" ) ;
209
240
}
@@ -245,6 +276,13 @@ void Trace(string msg)
245
276
Logger . LogTrace ( msg ) ;
246
277
}
247
278
279
+ /// <inheritdoc/>
280
+ public void EvictToDisk ( )
281
+ {
282
+ Maintenance . MoveMutableSegmentForward ( ) ;
283
+ StartMerge ( ) ;
284
+ }
285
+
248
286
/// <summary>
249
287
/// Disposes this maintainer.
250
288
/// </summary>
@@ -256,5 +294,6 @@ public void Dispose()
256
294
Maintenance . OnDiskSegmentCreated -= OnDiskSegmentCreated ;
257
295
Maintenance . OnMergeOperationEnded -= OnMergeOperationEnded ;
258
296
Maintenance . OnZoneTreeIsDisposing -= OnZoneTreeIsDisposing ;
297
+ Maintenance . OnBottomSegmentsMergeOperationEnded -= OnBottomSegmentsMergeOperationEnded ;
259
298
}
260
299
}
0 commit comments