Skip to content

Commit e89d1ac

Browse files
committed
SlidingWindow fix (#3093)
1 parent 415e119 commit e89d1ac

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;
@@ -54,6 +55,31 @@ public async Task GetEvents_RemovesExpiredItems()
5455
Assert.Same(evt, evts[0]);
5556
}
5657

58+
[Fact]
59+
public async Task AddEvent_RemovesExpiredItems()
60+
{
61+
var window = new SlidingWindow<MyItem>(TimeSpan.FromSeconds(1));
62+
63+
for (int i = 0; i < 5; i++)
64+
{
65+
window.AddEvent(new MyItem { Data = i });
66+
await Task.Delay(100);
67+
}
68+
69+
var eventsField = window.GetType().GetField("_events", BindingFlags.Instance | BindingFlags.NonPublic);
70+
var events = (List<SlidingWindow<MyItem>.Event>)eventsField.GetValue(window);
71+
Assert.Equal(5, events.Count);
72+
73+
// now let the items expire
74+
await Task.Delay(1000);
75+
76+
// add a new event that shouldn't be expired
77+
var evt = new MyItem { Data = 8 };
78+
window.AddEvent(evt);
79+
80+
Assert.Equal(1, events.Count);
81+
}
82+
5783
[Theory]
5884
[InlineData(0, false)]
5985
[InlineData(3, false)]

0 commit comments

Comments
 (0)