Skip to content

Commit d8e75fa

Browse files
committed
add stack overflow indexer as Tests.LongRuning
1 parent 897dab6 commit d8e75fa

20 files changed

+1077
-49
lines changed

src/Elasticsearch.Net/Providers/RecyclableMemoryStreamFactory.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@ public class RecyclableMemoryStreamFactory : IMemoryStreamFactory
1616

1717
public RecyclableMemoryStreamFactory()
1818
{
19-
var blockSize = 1024;
20-
var largeBufferMultiple = 1024 * 1024;
21-
var maxBufferSize = 16 * largeBufferMultiple;
22-
_manager = new RecyclableMemoryStreamManager(blockSize, largeBufferMultiple, maxBufferSize)
19+
// var blockSize = 1024;
20+
// var largeBufferMultiple = 1024 * 1024;
21+
// var maxBufferSize = 16 * largeBufferMultiple;
22+
// _manager = new RecyclableMemoryStreamManager(blockSize, largeBufferMultiple, maxBufferSize)
23+
// {
24+
// //AggressiveBufferReturn = true,
25+
// MaximumFreeLargePoolBytes = maxBufferSize * 4,
26+
// MaximumFreeSmallPoolBytes = 100 * blockSize
27+
// };
28+
_manager = new RecyclableMemoryStreamManager()
2329
{
2430
//AggressiveBufferReturn = true,
25-
MaximumFreeLargePoolBytes = maxBufferSize * 4,
26-
MaximumFreeSmallPoolBytes = 100 * blockSize
2731
};
2832
}
2933

src/Elasticsearch.Net/Providers/RecyclableMemoryStreamManager-Events.cs

Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
// ---------------------------------------------------------------------
2222

2323
using System;
24+
using System.Collections.Generic;
25+
using System.Collections.ObjectModel;
2426
using System.Diagnostics.Tracing;
2527
using System.Threading;
2628

@@ -32,71 +34,76 @@ namespace Elasticsearch.Net
3234
/// </summary>
3335
internal class EventCounter
3436
{
35-
public EventCounter(string blocks, object eventsWriter) { }
37+
public EventCounter(string blocks, RecyclableMemoryStreamManager.Events eventsWriter) { }
3638

3739
public void WriteMetric(long v) { }
3840
}
3941
#endif
42+
#if !NETSTANDARD2_1
43+
internal class PollingCounter : IDisposable
44+
{
45+
public PollingCounter(string largeBuffers, RecyclableMemoryStreamManager.Events eventsWriter, Func<double> func) { }
46+
47+
public void Dispose() {}
48+
}
49+
#endif
4050

4151
internal sealed partial class RecyclableMemoryStreamManager
4252
{
4353
public static readonly Events EventsWriter = new Events();
44-
public static readonly Counters Counter = new Counters();
54+
private Counters Counter { get; }
4555

46-
public sealed class Counters
56+
public sealed class Counters : IDisposable
4757
{
48-
public Counters()
58+
private ReadOnlyCollection<PollingCounter> Polls { get;}
59+
60+
public Counters(RecyclableMemoryStreamManager instance)
4961
{
50-
BlocksCounter = new EventCounter("blocks", EventsWriter);
51-
BufferCounter = new EventCounter("large-buffers", EventsWriter);
52-
MemoryStreamCounter = new EventCounter("memorystreams", EventsWriter);
53-
}
62+
PollingCounter Create(string name, Func<double> poll, string description) =>
63+
new PollingCounter(name, EventsWriter, poll)
64+
{
65+
#if NETSTANDARD2_1
66+
DisplayName = description
67+
#endif
68+
};
5469

55-
private EventCounter BlocksCounter { get; }
56-
private EventCounter BufferCounter { get; }
57-
private EventCounter MemoryStreamCounter { get; }
5870

59-
private long _blocks = 0;
60-
internal void ReportBlockCreated()
61-
{
62-
var count = Interlocked.Increment(ref _blocks);
63-
BlocksCounter.WriteMetric(count);
71+
var polls = new List<PollingCounter>()
72+
{
73+
{ Create("blocks", () => _blocks, "Pooled blocks active")},
74+
{ Create("large-buffers", () => _largeBuffers, "Large buffers active")},
75+
{ Create("large-buffers-free", () => instance.LargeBuffersFree, "Large buffers free")},
76+
{ Create("large-pool-inuse", () => instance.LargePoolInUseSize, "Large pool in use size")},
77+
{ Create("small-pool-free", () => instance.SmallBlocksFree, "Small pool free blocks")},
78+
{ Create("small-pool-inuse", () => instance.SmallPoolInUseSize, "Small pool in use size")},
79+
{ Create("small-pool-free", () => instance.SmallPoolFreeSize, "Small pool free size")},
80+
{ Create("small-pool-max", () => instance.MaximumFreeSmallPoolBytes, "Small pool max size")},
81+
{ Create("memory-streams", () => _memoryStreams, "Active memory streams")},
82+
};
83+
Polls = new ReadOnlyCollection<PollingCounter>(polls);
84+
6485

6586
}
6687

67-
internal void ReportBlockDiscarded()
68-
{
69-
var count = Interlocked.Decrement(ref _blocks);
70-
BlocksCounter.WriteMetric(count);
88+
private long _blocks = 0;
89+
internal void ReportBlockCreated() => Interlocked.Increment(ref _blocks);
7190

72-
}
91+
internal void ReportBlockDiscarded() => Interlocked.Decrement(ref _blocks);
7392

7493
private long _largeBuffers = 0;
75-
internal void ReportLargeBufferCreated()
76-
{
77-
var count = Interlocked.Increment(ref _largeBuffers);
78-
BufferCounter.WriteMetric(count);
79-
}
94+
internal void ReportLargeBufferCreated() => Interlocked.Increment(ref _largeBuffers);
8095

81-
internal void ReportLargeBufferDiscarded()
82-
{
83-
var count = Interlocked.Decrement(ref _largeBuffers);
84-
BufferCounter.WriteMetric(count);
85-
}
96+
internal void ReportLargeBufferDiscarded() => Interlocked.Decrement(ref _largeBuffers);
8697

8798
private long _memoryStreams = 0;
88-
internal void ReportStreamCreated()
89-
{
90-
var count = Interlocked.Decrement(ref _memoryStreams);
91-
MemoryStreamCounter.WriteMetric(count);
92-
}
99+
internal void ReportStreamCreated() => Interlocked.Increment(ref _memoryStreams);
93100

94-
internal void ReportStreamDisposed()
101+
internal void ReportStreamDisposed() => Interlocked.Decrement(ref _memoryStreams);
102+
103+
public void Dispose()
95104
{
96-
var count = Interlocked.Decrement(ref _memoryStreams);
97-
MemoryStreamCounter.WriteMetric(count);
105+
foreach(var p in Polls) p.Dispose();
98106
}
99-
100107
}
101108

102109
[EventSource(Name = "Elasticsearch-Net-RecyclableMemoryStream", Guid = "{AD44FDAC-D3FC-460A-9EBE-E55A3569A8F6}")]

src/Elasticsearch.Net/Providers/RecyclableMemoryStreamManager.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ public RecyclableMemoryStreamManager(int blockSize, int largeBufferMultiple, int
156156

157157
for (var i = 0; i < _largePools.Length; ++i) _largePools[i] = new ConcurrentStack<byte[]>();
158158

159+
Counter = new Counters(this);
159160
EventsWriter.MemoryStreamManagerInitialized(blockSize, largeBufferMultiple, maximumBufferSize);
160161
}
161162

@@ -528,17 +529,23 @@ internal void ReportUsageReport(
528529

529530
private class ReportingMemoryStream : MemoryStream
530531
{
531-
public ReportingMemoryStream(byte[] bytes) : base(bytes) => Counter.ReportStreamCreated();
532+
private readonly RecyclableMemoryStreamManager _instance;
533+
534+
public ReportingMemoryStream(byte[] bytes, RecyclableMemoryStreamManager instance) : base(bytes)
535+
{
536+
_instance = instance;
537+
_instance.Counter.ReportStreamCreated();
538+
}
532539

533540
//NOTE DisposeAsync calls Dispose as well
534-
protected override void Dispose(bool disposing) => Counter.ReportLargeBufferDiscarded();
541+
protected override void Dispose(bool disposing) => _instance.Counter.ReportStreamDisposed();
535542
}
536543

537544
/// <summary>
538545
/// Shortcut to create a stream that directly wraps bytes but still uses reporting on the stream being created and disposes.
539546
/// Note this does NOT use the pooled memory streams as the bytes have already been allocated
540547
/// </summary>
541-
public MemoryStream GetStream(byte[] bytes) => new ReportingMemoryStream(bytes);
548+
public MemoryStream GetStream(byte[] bytes) => new ReportingMemoryStream(bytes, this);
542549

543550
/// <summary>
544551
/// Retrieve a new MemoryStream object with no tag and a default initial capacity.

src/Elasticsearch.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ EndProjectSection
7777
EndProject
7878
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elasticsearch.Net.VirtualizedCluster", "Auxiliary\Elasticsearch.Net.VirtualizedCluster\Elasticsearch.Net.VirtualizedCluster.csproj", "{BA4C7FC9-13AD-4632-9A51-FAAD376E70BE}"
7979
EndProject
80+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.LongRunning", "Tests\Tests.LongRunning\Tests.LongRunning.csproj", "{4F4C7D75-0512-4BA2-915C-E627CD7213A5}"
81+
EndProject
8082
Global
8183
GlobalSection(SolutionConfigurationPlatforms) = preSolution
8284
Debug|Any CPU = Debug|Any CPU
@@ -104,6 +106,7 @@ Global
104106
{C7865979-1D1C-46AF-BDE8-1DA6F3ED81B3} = {432D5575-2347-4D3C-BF8C-3E38410C46CA}
105107
{2FABB663-F4DB-499A-89F8-3A08828D1D91} = {432D5575-2347-4D3C-BF8C-3E38410C46CA}
106108
{BA4C7FC9-13AD-4632-9A51-FAAD376E70BE} = {14241027-0A92-466D-B024-E0063F338915}
109+
{4F4C7D75-0512-4BA2-915C-E627CD7213A5} = {6C4A2627-AF22-4388-9DF7-7A9AEACFD635}
107110
EndGlobalSection
108111
GlobalSection(ProjectConfigurationPlatforms) = postSolution
109112
{5B393962-7586-49BA-BD99-3B1E35F48E94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -166,5 +169,9 @@ Global
166169
{BA4C7FC9-13AD-4632-9A51-FAAD376E70BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
167170
{BA4C7FC9-13AD-4632-9A51-FAAD376E70BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
168171
{BA4C7FC9-13AD-4632-9A51-FAAD376E70BE}.Release|Any CPU.Build.0 = Release|Any CPU
172+
{4F4C7D75-0512-4BA2-915C-E627CD7213A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
173+
{4F4C7D75-0512-4BA2-915C-E627CD7213A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
174+
{4F4C7D75-0512-4BA2-915C-E627CD7213A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
175+
{4F4C7D75-0512-4BA2-915C-E627CD7213A5}.Release|Any CPU.Build.0 = Release|Any CPU
169176
EndGlobalSection
170177
EndGlobal

0 commit comments

Comments
 (0)