Skip to content

Commit 02d78b4

Browse files
committed
SlidingWindow fix (#3093)
1 parent 0137c93 commit 02d78b4

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

src/WebJobs.Script/SlidingWindow.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ public IEnumerable<TItem> GetEvents()
2222
{
2323
lock (_syncLock)
2424
{
25-
// remove expired events
26-
_events.RemoveAll(p => IsExpired(p, _window));
25+
RemoveExpired();
2726

2827
return _events.Select(p => p.Item).ToList();
2928
}
@@ -38,10 +37,17 @@ public void AddEvent(TItem item)
3837
};
3938
lock (_syncLock)
4039
{
40+
RemoveExpired();
41+
4142
_events.Add(evt);
4243
}
4344
}
4445

46+
private void RemoveExpired()
47+
{
48+
_events.RemoveAll(p => IsExpired(p, _window));
49+
}
50+
4551
internal static bool IsExpired(Event evt, TimeSpan window)
4652
{
4753
return (DateTime.UtcNow.Ticks - evt.TimeStamp) > window.Ticks;

test/WebJobs.Script.Tests/SlidingWindowTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Linq;
7+
using System.Reflection;
78
using System.Text;
89
using System.Threading.Tasks;
910
using Xunit;
@@ -42,6 +43,31 @@ public async Task GetEvents_RemovesExpiredItems()
4243
Assert.Same(evt, evts[0]);
4344
}
4445

46+
[Fact]
47+
public async Task AddEvent_RemovesExpiredItems()
48+
{
49+
var window = new SlidingWindow<MyItem>(TimeSpan.FromSeconds(1));
50+
51+
for (int i = 0; i < 5; i++)
52+
{
53+
window.AddEvent(new MyItem { Data = i });
54+
await Task.Delay(100);
55+
}
56+
57+
var eventsField = window.GetType().GetField("_events", BindingFlags.Instance | BindingFlags.NonPublic);
58+
var events = (List<SlidingWindow<MyItem>.Event>)eventsField.GetValue(window);
59+
Assert.Equal(5, events.Count);
60+
61+
// now let the items expire
62+
await Task.Delay(1000);
63+
64+
// add a new event that shouldn't be expired
65+
var evt = new MyItem { Data = 7 };
66+
window.AddEvent(evt);
67+
68+
Assert.Equal(1, events.Count);
69+
}
70+
4571
[Theory]
4672
[InlineData(0, false)]
4773
[InlineData(3, false)]

0 commit comments

Comments
 (0)