Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private unsafe void TransactionMerger()
- {
- var existing = new HashSet<long>();
- var tasks = new List<TaskCompletionSource<object>>();
- while (_cts.IsCancellationRequested == false)
- {
- existing.Clear();
- tasks.Clear();
- double value;
- using (var tx = _storageEnvironment.WriteTransaction())
- using (Slice.From(tx.Allocator, "dummy-val", out Slice dummy))
- using (Slice.External(tx.Allocator, (byte*)&value, sizeof(double), out Slice valueSlice))
- {
- var fst = tx.FixedTreeFor(dummy, valSize: sizeof(double));
- int count = 0;
- Entry entry;
- var propertiesInsertionBuffer = new BlittableJsonReaderObject.PropertiesInsertionBuffer();
- while (_entries.TryDequeue(out entry))
- {
- var keyHash = (long)entry.Key.DebugHash;
- using (Slice.External(tx.Allocator, (byte*)&keyHash, sizeof(long), out Slice slice))
- {
- fst.RepurposeInstance(slice, clone: false);
- value = entry.Value;
- fst.Add(entry.Time.Ticks, valueSlice);
- }
- if (existing.Add(keyHash))
- {
- int propCount = entry.Key.GetPropertiesByInsertionOrder(propertiesInsertionBuffer);
- var prop = new BlittableJsonReaderObject.PropertyDetails();
- for (int i = 0; i < propCount; i++)
- {
- entry.Key.GetPropertyByIndex(propertiesInsertionBuffer.Properties[i], ref prop);
- var tree = tx.CreateTree(prop.Name);
- var matches = tree.FixedTreeFor(prop.Value.ToString());
- matches.Add(keyHash);
- }
- }
- tasks.Add(entry.Tcs);
- if (count++ > 25_000)
- {
- _hasEntries.Set();
- break;
- }
- }
- tx.Commit();
- }
- foreach (var tcs in tasks)
- {
- tcs.TrySetResult(null);
- }
- _hasEntries.Wait();
- _hasEntries.Reset();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement