Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit b5e4c22

Browse files
author
Steven Kirk
committed
Don't store UsageModel in memory.
As there can be >1 instance of VS running. There is still the possibility of race conditions here but as they would be unlikely and the impact would be minimal, I'm tempted to just accept the possibility rather than make the code more complex.
1 parent 74ed6ea commit b5e4c22

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

src/GitHub.Exports/Services/UsageTracker.cs

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using System.Windows.Threading;
88
using GitHub.Models;
99
using GitHub.Settings;
10-
using GitHub.VisualStudio;
1110
using Microsoft.VisualStudio.ComponentModelHost;
1211
using Microsoft.VisualStudio.Shell;
1312
using Task = System.Threading.Tasks.Task;
@@ -19,15 +18,13 @@ namespace GitHub.Services
1918
public class UsageTracker : IUsageTracker
2019
{
2120
const string StoreFileName = "ghfvs.usage";
22-
//static readonly NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
2321
static readonly Calendar cal = CultureInfo.InvariantCulture.Calendar;
2422

2523
readonly IMetricsService client;
2624
readonly Lazy<IConnectionManager> connectionManager;
2725
readonly IPackageSettings userSettings;
2826
readonly DispatcherTimer timer;
2927
readonly string storePath;
30-
UsageStore usage;
3128

3229
[ImportingConstructor]
3330
public UsageTracker(
@@ -50,7 +47,6 @@ public UsageTracker(
5047
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
5148
program.ApplicationName,
5249
StoreFileName);
53-
this.usage = LoadUsage();
5450

5551
userSettings.PropertyChanged += (s, e) =>
5652
{
@@ -65,6 +61,7 @@ public UsageTracker(
6561

6662
public void IncrementLaunchCount()
6763
{
64+
var usage = LoadUsage();
6865
++usage.Model.NumberOfStartups;
6966
++usage.Model.NumberOfStartupsWeek;
7067
++usage.Model.NumberOfStartupsMonth;
@@ -73,42 +70,49 @@ public void IncrementLaunchCount()
7370

7471
public void IncrementCloneCount()
7572
{
73+
var usage = LoadUsage();
7674
++usage.Model.NumberOfClones;
7775
SaveUsage(usage);
7876
}
7977

8078
public void IncrementCreateCount()
8179
{
80+
var usage = LoadUsage();
8281
++usage.Model.NumberOfReposCreated;
8382
SaveUsage(usage);
8483
}
8584

8685
public void IncrementPublishCount()
8786
{
87+
var usage = LoadUsage();
8888
++usage.Model.NumberOfReposPublished;
8989
SaveUsage(usage);
9090
}
9191

9292
public void IncrementOpenInGitHubCount()
9393
{
94+
var usage = LoadUsage();
9495
++usage.Model.NumberOfOpenInGitHub;
9596
SaveUsage(usage);
9697
}
9798

9899
public void IncrementLinkToGitHubCount()
99100
{
101+
var usage = LoadUsage();
100102
++usage.Model.NumberOfLinkToGitHub;
101103
SaveUsage(usage);
102104
}
103105

104106
public void IncrementCreateGistCount()
105107
{
108+
var usage = LoadUsage();
106109
++usage.Model.NumberOfGists;
107110
SaveUsage(usage);
108111
}
109112

110113
public void IncrementUpstreamPullRequestCount()
111114
{
115+
var usage = LoadUsage();
112116
++usage.Model.NumberOfClones;
113117
SaveUsage(usage);
114118
}
@@ -167,6 +171,7 @@ async void TimerTick(object sender, EventArgs e)
167171
// launch count but we only submit (and clear) the weekly launch count when we've
168172
// transitioned into a new week. We've defined a week by the ISO8601 definition,
169173
// i.e. week starting on Monday and ending on Sunday.
174+
var usage = LoadUsage();
170175
var lastDate = usage.LastUpdated;
171176
var currentDate = DateTimeOffset.Now;
172177
var includeWeekly = GetIso8601WeekOfYear(lastDate) != GetIso8601WeekOfYear(currentDate);
@@ -175,8 +180,8 @@ async void TimerTick(object sender, EventArgs e)
175180
// Only send stats once a day.
176181
if (lastDate.Date != currentDate.Date)
177182
{
178-
await SendUsage(includeWeekly, includeMonthly);
179-
ClearCounters(includeWeekly, includeMonthly);
183+
await SendUsage(usage.Model, includeWeekly, includeMonthly);
184+
ClearCounters(usage.Model, includeWeekly, includeMonthly);
180185
usage.LastUpdated = DateTimeOffset.Now.UtcDateTime;
181186
SaveUsage(usage);
182187
}
@@ -187,23 +192,23 @@ async void TimerTick(object sender, EventArgs e)
187192
}
188193
}
189194

190-
async Task SendUsage(bool weekly, bool monthly)
195+
async Task SendUsage(UsageModel usage, bool weekly, bool monthly)
191196
{
192197
Debug.Assert(client != null, "SendUsage should not be called when there is no IMetricsService");
193198

194199
var connectionManager = this.connectionManager.Value;
195200

196201
if (connectionManager.Connections.Any(x => x.HostAddress.IsGitHubDotCom()))
197202
{
198-
usage.Model.IsGitHubUser = true;
203+
usage.IsGitHubUser = true;
199204
}
200205

201206
if (connectionManager.Connections.Any(x => !x.HostAddress.IsGitHubDotCom()))
202207
{
203-
usage.Model.IsEnterpriseUser = true;
208+
usage.IsEnterpriseUser = true;
204209
}
205210

206-
var model = usage.Model.Clone(weekly, monthly);
211+
var model = usage.Clone(weekly, monthly);
207212
await client.PostUsage(model);
208213
}
209214

@@ -223,23 +228,23 @@ static int GetIso8601WeekOfYear(DateTimeOffset time)
223228
return cal.GetWeekOfYear(time.UtcDateTime, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
224229
}
225230

226-
void ClearCounters(bool weekly, bool monthly)
231+
static void ClearCounters(UsageModel usage, bool weekly, bool monthly)
227232
{
228-
usage.Model.NumberOfStartups = 0;
229-
usage.Model.NumberOfClones = 0;
230-
usage.Model.NumberOfReposCreated = 0;
231-
usage.Model.NumberOfReposPublished = 0;
232-
usage.Model.NumberOfGists = 0;
233-
usage.Model.NumberOfOpenInGitHub = 0;
234-
usage.Model.NumberOfLinkToGitHub = 0;
235-
usage.Model.NumberOfLogins = 0;
236-
usage.Model.NumberOfUpstreamPullRequests = 0;
233+
usage.NumberOfStartups = 0;
234+
usage.NumberOfClones = 0;
235+
usage.NumberOfReposCreated = 0;
236+
usage.NumberOfReposPublished = 0;
237+
usage.NumberOfGists = 0;
238+
usage.NumberOfOpenInGitHub = 0;
239+
usage.NumberOfLinkToGitHub = 0;
240+
usage.NumberOfLogins = 0;
241+
usage.NumberOfUpstreamPullRequests = 0;
237242

238243
if (weekly)
239-
usage.Model.NumberOfStartupsWeek = 0;
244+
usage.NumberOfStartupsWeek = 0;
240245

241246
if (monthly)
242-
usage.Model.NumberOfStartupsMonth = 0;
247+
usage.NumberOfStartupsMonth = 0;
243248
}
244249

245250
class UsageStore

0 commit comments

Comments
 (0)