Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 5f7f6a1

Browse files
Adding locks to the UsageTracker
1 parent 64e1262 commit 5f7f6a1

File tree

3 files changed

+132
-79
lines changed

3 files changed

+132
-79
lines changed

script

src/GitHub.Api/Metrics/IMetricsService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ interface IMetricsService
88
/// <summary>
99
/// Posts the provided usage model.
1010
/// </summary>
11-
Task PostUsage(List<Usage> model);
11+
void PostUsage(List<Usage> model);
1212
}
1313
}

src/GitHub.Api/Metrics/UsageTracker.cs

Lines changed: 130 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class UsageTracker : IUsageTracker
1212
{
1313
private static ILogging Logger { get; } = LogHelper.GetLogger<UsageTracker>();
1414

15+
private static object _lock = new object();
16+
1517
private readonly ISettings userSettings;
1618
private readonly IUsageLoader usageLoader;
1719
private readonly IMetricsService metricsService;
@@ -23,7 +25,7 @@ class UsageTracker : IUsageTracker
2325

2426
public UsageTracker(IMetricsService metricsService, ISettings userSettings,
2527
IEnvironment environment, string userId, string unityVersion, string instanceId)
26-
: this(metricsService, userSettings,
28+
: this(metricsService, userSettings,
2729
new UsageLoader(environment.UserCachePath.Combine(Constants.UsageFile)),
2830
userId, unityVersion, instanceId)
2931
{
@@ -43,23 +45,23 @@ public UsageTracker(IMetricsService metricsService, ISettings userSettings,
4345

4446
Logger.Trace("userId:{0} instanceId:{1}", userId, instanceId);
4547
if (Enabled)
46-
RunTimer(3*60);
48+
RunTimer(3 * 60);
4749
}
4850

4951
private void RunTimer(int seconds)
5052
{
51-
timer = new Timer(async _ =>
53+
timer = new Timer(_ =>
5254
{
5355
try
5456
{
5557
timer.Dispose();
56-
await SendUsage();
58+
SendUsage();
5759
}
58-
catch {}
60+
catch { }
5961
}, null, seconds * 1000, Timeout.Infinite);
6062
}
6163

62-
private async Task SendUsage()
64+
private void SendUsage()
6365
{
6466
var usageStore = usageLoader.Load(userId);
6567

@@ -69,13 +71,16 @@ private async Task SendUsage()
6971
return;
7072
}
7173

72-
if (usageStore.LastUpdated.Date != DateTimeOffset.UtcNow.Date)
74+
var currentTimeOffset = DateTimeOffset.UtcNow;
75+
if (usageStore.LastUpdated.Date == currentTimeOffset)
7376
{
74-
var currentTimeOffset = DateTimeOffset.UtcNow;
75-
var beforeDate = currentTimeOffset.Date;
77+
return;
78+
}
7679

80+
lock (_lock)
81+
{
7782
var success = false;
78-
var extractReports = usageStore.Model.SelectReports(beforeDate);
83+
var extractReports = usageStore.Model.SelectReports(currentTimeOffset.Date);
7984
if (!extractReports.Any())
8085
{
8186
Logger.Trace("No items to send");
@@ -90,7 +95,7 @@ private async Task SendUsage()
9095

9196
try
9297
{
93-
await metricsService.PostUsage(extractReports);
98+
metricsService.PostUsage(extractReports);
9499
success = true;
95100
}
96101
catch (Exception ex)
@@ -101,7 +106,7 @@ private async Task SendUsage()
101106

102107
if (success)
103108
{
104-
usageStore.Model.RemoveReports(beforeDate);
109+
usageStore.Model.RemoveReports(currentTimeOffset.Date);
105110
usageStore.LastUpdated = currentTimeOffset;
106111
usageLoader.Save(usageStore);
107112
}
@@ -110,130 +115,178 @@ private async Task SendUsage()
110115

111116
public void IncrementNumberOfStartups()
112117
{
113-
var usage = usageLoader.Load(userId);
114-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
115-
.NumberOfStartups++;
116-
usageLoader.Save(usage);
118+
lock (_lock)
119+
{
120+
var usage = usageLoader.Load(userId);
121+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
122+
.NumberOfStartups++;
123+
usageLoader.Save(usage);
124+
}
117125
}
118126

119127
public void IncrementProjectsInitialized()
120128
{
121-
var usage = usageLoader.Load(userId);
122-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
123-
.ProjectsInitialized++;
124-
usageLoader.Save(usage);
129+
lock (_lock)
130+
{
131+
var usage = usageLoader.Load(userId);
132+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
133+
.ProjectsInitialized++;
134+
usageLoader.Save(usage);
135+
}
125136
}
126137

127138
public void IncrementChangesViewButtonCommit()
128139
{
129-
var usage = usageLoader.Load(userId);
130-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
131-
.ChangesViewButtonCommit++;
132-
usageLoader.Save(usage);
140+
lock (_lock)
141+
{
142+
var usage = usageLoader.Load(userId);
143+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
144+
.ChangesViewButtonCommit++;
145+
usageLoader.Save(usage);
146+
}
133147
}
134148

135149
public void IncrementHistoryViewToolbarFetch()
136150
{
137-
var usage = usageLoader.Load(userId);
138-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
139-
.HistoryViewToolbarFetch++;
140-
usageLoader.Save(usage);
151+
lock (_lock)
152+
{
153+
var usage = usageLoader.Load(userId);
154+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
155+
.HistoryViewToolbarFetch++;
156+
usageLoader.Save(usage);
157+
}
141158
}
142159

143160
public void IncrementHistoryViewToolbarPush()
144161
{
145-
var usage = usageLoader.Load(userId);
146-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
147-
.HistoryViewToolbarPush++;
148-
usageLoader.Save(usage);
162+
lock (_lock)
163+
{
164+
var usage = usageLoader.Load(userId);
165+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
166+
.HistoryViewToolbarPush++;
167+
usageLoader.Save(usage);
168+
}
149169
}
150170

151171
public void IncrementHistoryViewToolbarPull()
152172
{
153-
var usage = usageLoader.Load(userId);
154-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
155-
.HistoryViewToolbarPull++;
156-
usageLoader.Save(usage);
173+
lock (_lock)
174+
{
175+
var usage = usageLoader.Load(userId);
176+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
177+
.HistoryViewToolbarPull++;
178+
usageLoader.Save(usage);
179+
}
157180
}
158181

159182
public void IncrementBranchesViewButtonCreateBranch()
160183
{
161-
var usage = usageLoader.Load(userId);
162-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
163-
.BranchesViewButtonCreateBranch++;
164-
usageLoader.Save(usage);
184+
lock (_lock)
185+
{
186+
var usage = usageLoader.Load(userId);
187+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
188+
.BranchesViewButtonCreateBranch++;
189+
usageLoader.Save(usage);
190+
}
165191
}
166192

167193
public void IncrementBranchesViewButtonDeleteBranch()
168194
{
169-
var usage = usageLoader.Load(userId);
170-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
171-
.BranchesViewButtonDeleteBranch++;
172-
usageLoader.Save(usage);
195+
lock (_lock)
196+
{
197+
var usage = usageLoader.Load(userId);
198+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
199+
.BranchesViewButtonDeleteBranch++;
200+
usageLoader.Save(usage);
201+
}
173202
}
174203

175204
public void IncrementBranchesViewButtonCheckoutLocalBranch()
176205
{
177-
var usage = usageLoader.Load(userId);
178-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
179-
.BranchesViewButtonCheckoutLocalBranch++;
180-
usageLoader.Save(usage);
206+
lock (_lock)
207+
{
208+
var usage = usageLoader.Load(userId);
209+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
210+
.BranchesViewButtonCheckoutLocalBranch++;
211+
usageLoader.Save(usage);
212+
}
181213
}
182214

183215
public void IncrementBranchesViewButtonCheckoutRemoteBranch()
184216
{
185-
var usage = usageLoader.Load(userId);
186-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
187-
.BranchesViewButtonCheckoutRemoteBranch++;
188-
usageLoader.Save(usage);
217+
lock (_lock)
218+
{
219+
var usage = usageLoader.Load(userId);
220+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
221+
.BranchesViewButtonCheckoutRemoteBranch++;
222+
usageLoader.Save(usage);
223+
}
189224
}
190225

191226
public void IncrementSettingsViewButtonLfsUnlock()
192227
{
193-
var usage = usageLoader.Load(userId);
194-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
195-
.SettingsViewButtonLfsUnlock++;
196-
usageLoader.Save(usage);
228+
lock (_lock)
229+
{
230+
var usage = usageLoader.Load(userId);
231+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
232+
.SettingsViewButtonLfsUnlock++;
233+
usageLoader.Save(usage);
234+
}
197235
}
198236

199237
public void IncrementAuthenticationViewButtonAuthentication()
200238
{
201-
var usage = usageLoader.Load(userId);
202-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
203-
.AuthenticationViewButtonAuthentication++;
204-
usageLoader.Save(usage);
239+
lock (_lock)
240+
{
241+
var usage = usageLoader.Load(userId);
242+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
243+
.AuthenticationViewButtonAuthentication++;
244+
usageLoader.Save(usage);
245+
}
205246
}
206247

207248
public void IncrementUnityProjectViewContextLfsLock()
208249
{
209-
var usage = usageLoader.Load(userId);
210-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
211-
.UnityProjectViewContextLfsLock++;
212-
usageLoader.Save(usage);
250+
lock (_lock)
251+
{
252+
var usage = usageLoader.Load(userId);
253+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
254+
.UnityProjectViewContextLfsLock++;
255+
usageLoader.Save(usage);
256+
}
213257
}
214258

215259
public void IncrementUnityProjectViewContextLfsUnlock()
216260
{
217-
var usage = usageLoader.Load(userId);
218-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
219-
.UnityProjectViewContextLfsUnlock++;
220-
usageLoader.Save(usage);
261+
lock (_lock)
262+
{
263+
var usage = usageLoader.Load(userId);
264+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
265+
.UnityProjectViewContextLfsUnlock++;
266+
usageLoader.Save(usage);
267+
}
221268
}
222269

223270
public void IncrementPublishViewButtonPublish()
224271
{
225-
var usage = usageLoader.Load(userId);
226-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
227-
.PublishViewButtonPublish++;
228-
usageLoader.Save(usage);
272+
lock (_lock)
273+
{
274+
var usage = usageLoader.Load(userId);
275+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
276+
.PublishViewButtonPublish++;
277+
usageLoader.Save(usage);
278+
}
229279
}
230280

231281
public void IncrementApplicationMenuMenuItemCommandLine()
232282
{
233-
var usage = usageLoader.Load(userId);
234-
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
235-
.ApplicationMenuMenuItemCommandLine++;
236-
usageLoader.Save(usage);
283+
lock (_lock)
284+
{
285+
var usage = usageLoader.Load(userId);
286+
usage.GetCurrentMeasures(appVersion, unityVersion, instanceId)
287+
.ApplicationMenuMenuItemCommandLine++;
288+
usageLoader.Save(usage);
289+
}
237290
}
238291

239292
public bool Enabled
@@ -293,7 +346,7 @@ public UsageStore Load(string userId)
293346
{
294347
path.DeleteIfExists();
295348
}
296-
catch {}
349+
catch { }
297350
}
298351
}
299352

0 commit comments

Comments
 (0)