Skip to content

Commit b820bc5

Browse files
fix: kill leaked analytics process
With recent changes, CLI's processService does not handle SIGINT signal, so it actually never sends Finish message to analytics process. CLI dies gracefully, but the analytics process is not killed. To fix this add `process.exit` in the analytics process when it receives disconnect event. Also remove all logic for Finish message as CLI will never send it.
1 parent 19fa242 commit b820bc5

File tree

3 files changed

+5
-46
lines changed

3 files changed

+5
-46
lines changed

lib/common/declarations.d.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,6 @@ declare const enum TrackingTypes {
207207
* Defines that the broker process should get and track the data from preview app to Google Analytics
208208
*/
209209
PreviewAppData = "PreviewAppData",
210-
211-
/**
212-
* Defines that all information has been sent and no more data will be tracked in current session.
213-
*/
214-
Finish = "finish"
215210
}
216211

217212
/**

lib/services/analytics/analytics-broker-process.ts

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,38 +20,17 @@ const analyticsBroker = $injector.resolve<IAnalyticsBroker>(AnalyticsBroker, { p
2020

2121
let trackingQueue: Promise<void> = Promise.resolve();
2222

23-
let sentFinishMsg = false;
24-
let receivedFinishMsg = false;
25-
2623
const sendDataForTracking = async (data: ITrackingInformation) => {
2724
trackingQueue = trackingQueue.then(() => analyticsBroker.sendDataForTracking(data));
2825
await trackingQueue;
2926
};
3027

3128
const finishTracking = async (data?: ITrackingInformation) => {
32-
analyticsLoggingService.logData({ message: `analytics-broker-process finish tracking started, sentFinishMsg: ${sentFinishMsg}, receivedFinishMsg: ${receivedFinishMsg}` });
33-
34-
if (!sentFinishMsg) {
35-
sentFinishMsg = true;
36-
37-
data = data || { type: TrackingTypes.Finish };
38-
const action = async () => {
39-
await trackingQueue;
40-
analyticsLoggingService.logData({ message: `analytics-broker-process tracking finished` });
41-
process.disconnect();
42-
};
43-
44-
if (receivedFinishMsg) {
45-
await action();
46-
} else {
47-
// In case we've got here without receiving "finish" message from parent (receivedFinishMsg is false)
48-
// there might be various reasons, but most probably the parent is dead.
49-
// However, there's no guarantee that we've received all messages. So wait some time before sending finish message to children.
50-
setTimeout(async () => {
51-
await action();
52-
}, 1000);
53-
}
54-
}
29+
analyticsLoggingService.logData({ message: `analytics-broker-process finish tracking started` });
30+
await trackingQueue;
31+
analyticsLoggingService.logData({ message: `analytics-broker-process tracking finished` });
32+
process.disconnect();
33+
process.exit();
5534
};
5635

5736
const trackPreviewAppData = async (data: any) => {
@@ -84,12 +63,6 @@ const trackPreviewAppData = async (data: any) => {
8463
process.on("message", async (data: ITrackingInformation) => {
8564
analyticsLoggingService.logData({ message: `analytics-broker-process received message of type: ${JSON.stringify(data)}` });
8665

87-
if (data.type === TrackingTypes.Finish) {
88-
receivedFinishMsg = true;
89-
await finishTracking(data);
90-
return;
91-
}
92-
9366
if (data.type === TrackingTypes.PreviewAppData) {
9467
await trackPreviewAppData(<IPreviewAppTrackingInformation>data);
9568
return;

lib/services/analytics/analytics-service.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ export class AnalyticsService implements IAnalyticsService, IDisposable {
1313

1414
constructor(private $logger: ILogger,
1515
private $options: IOptions,
16-
private $processService: IProcessService,
1716
private $staticConfig: Config.IStaticConfig,
1817
private $prompter: IPrompter,
1918
private $userSettingsService: UserSettings.IUserSettingsService,
@@ -228,15 +227,7 @@ export class AnalyticsService implements IAnalyticsService, IDisposable {
228227

229228
if (!isSettled) {
230229
isSettled = true;
231-
232-
this.$processService.attachToProcessExitSignals(this, () => {
233-
broker.send({
234-
type: TrackingTypes.Finish
235-
});
236-
});
237-
238230
this.brokerProcess = broker;
239-
240231
resolve(broker);
241232
}
242233
}

0 commit comments

Comments
 (0)