Skip to content
This repository has been archived by the owner on Jan 15, 2021. It is now read-only.

Adds support for a configurable buffer size #888

Merged
merged 4 commits into from Mar 11, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 23 additions & 0 deletions source/Glimpse.Core/Configuration/Section.cs
Expand Up @@ -28,6 +28,7 @@ namespace Glimpse.Core.Configuration
public class Section : ConfigurationSection
{
internal const string DefaultLocation = "";
internal const int DefaultBufferSize = 25;

/// <summary>
/// Gets or sets the logging settings used by Glimpse.
Expand Down Expand Up @@ -306,5 +307,27 @@ public string DiscoveryLocation
get { return (string)base["discoveryLocation"]; }
set { base["discoveryLocation"] = value; }
}

/// <summary>
/// Gets or sets the number of requests persisted by default.
/// </summary>
/// <remarks>
/// The <c>RequestBufferSize</c> defaults to <c>25</c>. The <c>RequestBufferSize</c> is leveraged by an instance of <see cref="IPersistenceStore"/> in order to persist the correct number of requests.
/// </remarks>
/// <example>
/// <code>
/// <![CDATA[
/// <glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd" requestBufferSize="100">
/// <!-- Additional Glimpse configuration nodes -->
/// </glimpse>
/// ]]>
/// </code>
/// </example>
[ConfigurationProperty("requestBufferSize", DefaultValue = DefaultBufferSize)]
public int RequestBufferSize
{
get { return (int)base["requestBufferSize"]; }
set { base["requestBufferSize"] = value; }
}
}
}
10 changes: 6 additions & 4 deletions source/Glimpse.Core/Framework/ApplicationPersistenceStore.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using Glimpse.Core.Extensibility;
using Glimpse.Core.Extensions;
Expand All @@ -15,18 +16,17 @@ namespace Glimpse.Core.Framework
public class ApplicationPersistenceStore : IPersistenceStore
{
private const string PersistenceStoreKey = "__GlimpsePersistenceKey";

private const int BufferSize = 25;


private readonly object queueLock = new object();

/// <summary>
/// Initializes a new instance of the <see cref="ApplicationPersistenceStore" /> class.
/// </summary>
/// <param name="dataStore">The data store.</param>
public ApplicationPersistenceStore(IDataStore dataStore)
public ApplicationPersistenceStore(IDataStore dataStore, int bufferSize)
{
DataStore = dataStore;
BufferSize = bufferSize;

var glimpseRequests = DataStore.Get<Queue<GlimpseRequest>>(PersistenceStoreKey);
if (glimpseRequests == null)
Expand All @@ -44,6 +44,8 @@ public ApplicationPersistenceStore(IDataStore dataStore)

private GlimpseMetadata Metadata { get; set; }

private int BufferSize { get; set; }

/// <summary>
/// Saves the specified request.
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion source/Glimpse.Core/Framework/Factory.cs
Expand Up @@ -247,7 +247,7 @@ public IPersistenceStore InstantiatePersistenceStore()
return store;
}

return new ApplicationPersistenceStore(InstantiateFrameworkProvider().HttpServerStore);
return new ApplicationPersistenceStore(InstantiateFrameworkProvider().HttpServerStore, Configuration.RequestBufferSize);
}

/// <summary>
Expand Down
Expand Up @@ -3,8 +3,10 @@
using System.Threading;
using Glimpse.Core.Extensibility;
using Glimpse.Core.Framework;
using Glimpse.Test.Core.Tester;
using Moq;
using Xunit;
using Xunit.Extensions;

namespace Glimpse.Test.Core.Framework
{
Expand All @@ -13,7 +15,7 @@ public class ApplicationPersistenceStoreShould
[Fact]
public void BeThreadSafe()
{
var sut = new ApplicationPersistenceStore(new DictionaryDataStoreAdapter(new Dictionary<string, object>()));
var sut = new ApplicationPersistenceStore(new DictionaryDataStoreAdapter(new Dictionary<string, object>()), 25);

Action<ApplicationPersistenceStore> addingRequests = store =>
{
Expand Down Expand Up @@ -64,5 +66,31 @@ public void BeThreadSafe()
invokedDelegate.Item1.EndInvoke(invokedDelegate.Item2);
}
}

[Theory]
[InlineData(1, 10)]
[InlineData(10, 10)]
[InlineData(100, 10)]
[InlineData(1, 50)]
[InlineData(50, 50)]
[InlineData(100, 50)]
public void RespectTheBufferSize(int bufferSize, int requestCount)
{
var sut = ApplicationPersistenceStoreTester.Create(bufferSize);

var glimpseRequest = new GlimpseRequest(
Guid.NewGuid(),
new Mock<IRequestMetadata>().Object,
new Dictionary<string, TabResult>(),
new Dictionary<string, TabResult>(),
new TimeSpan(1000));

for (int i = 0; i < requestCount; i++)
{
sut.Save(glimpseRequest);
}

Assert.Equal(Math.Min(bufferSize, requestCount), sut.GlimpseRequests.Count);
}
}
}
Expand Up @@ -10,7 +10,8 @@ public class ApplicationPersistenceStoreTester : ApplicationPersistenceStore
{
public Mock<IRequestMetadata> RequestMetadataMock { get; set; }

private ApplicationPersistenceStoreTester(IDataStore dataStore):base(dataStore)
private ApplicationPersistenceStoreTester(IDataStore dataStore, int bufferSize)
: base(dataStore, bufferSize)
{
RequestMetadataMock = new Mock<IRequestMetadata>();
RequestMetadataMock.Setup(r => r.RequestHttpMethod).Returns("POST");
Expand All @@ -19,9 +20,9 @@ private ApplicationPersistenceStoreTester(IDataStore dataStore):base(dataStore)
RequestMetadataMock.Setup(r => r.RequestIsAjax).Returns(true);
}

public static ApplicationPersistenceStoreTester Create()
public static ApplicationPersistenceStoreTester Create(int bufferSize = 25)
{
return new ApplicationPersistenceStoreTester(new DictionaryDataStoreAdapter(new Dictionary<object, object>()));
return new ApplicationPersistenceStoreTester(new DictionaryDataStoreAdapter(new Dictionary<object, object>()), bufferSize);
}
}
}