Skip to content

Commit f3092dd

Browse files
committed
fix: agent start not exiting then stopping Polykey
The life-cycle of the `WorkerManager` is now managed by the `PolykeyAgent`.
1 parent 6342221 commit f3092dd

File tree

6 files changed

+50
-30
lines changed

6 files changed

+50
-30
lines changed

src/PolykeyAgent.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import process from 'process';
1010
import Logger from '@matrixai/logger';
1111
import { DB } from '@matrixai/db';
1212
import { CreateDestroyStartStop } from '@matrixai/async-init/dist/CreateDestroyStartStop';
13+
import { WorkerManager } from '@matrixai/workers';
1314
import * as networkUtils from './network/utils';
1415
import KeyRing from './keys/KeyRing';
1516
import CertManager from './keys/CertManager';
@@ -37,6 +38,7 @@ import * as errors from './errors';
3738
import * as utils from './utils';
3839
import * as keysUtils from './keys/utils';
3940
import * as nodesUtils from './nodes/utils';
41+
import * as workersUtils from './workers/utils';
4042
import TaskManager from './tasks/TaskManager';
4143

4244
type NetworkConfig = {
@@ -81,6 +83,7 @@ class PolykeyAgent {
8183
proxyConfig = {},
8284
nodeConnectionManagerConfig = {},
8385
seedNodes = {},
86+
workers,
8487
// Optional dependencies
8588
status,
8689
schema,
@@ -134,6 +137,7 @@ class PolykeyAgent {
134137
};
135138
networkConfig?: NetworkConfig;
136139
seedNodes?: SeedNodes;
140+
workers?: number;
137141
status?: Status;
138142
schema?: Schema;
139143
keyRing?: KeyRing;
@@ -455,6 +459,7 @@ class PolykeyAgent {
455459
await pkAgent.start({
456460
password,
457461
networkConfig,
462+
workers,
458463
fresh,
459464
});
460465
logger.info(`Created ${this.name}`);
@@ -485,6 +490,7 @@ class PolykeyAgent {
485490
public readonly events: EventBus;
486491
public readonly fs: FileSystem;
487492
public readonly logger: Logger;
493+
protected workerManager: PolykeyWorkerManagerInterface | undefined;
488494

489495
constructor({
490496
nodePath,
@@ -566,10 +572,12 @@ class PolykeyAgent {
566572
public async start({
567573
password,
568574
networkConfig = {},
575+
workers,
569576
fresh = false,
570577
}: {
571578
password: string;
572579
networkConfig?: NetworkConfig;
580+
workers?: number;
573581
fresh?: boolean;
574582
}) {
575583
try {
@@ -748,6 +756,15 @@ class PolykeyAgent {
748756
await this.notificationsManager.start({ fresh });
749757
await this.sessionManager.start({ fresh });
750758
await this.taskManager.startProcessing();
759+
if (workers != null) {
760+
this.workerManager = await workersUtils.createWorkerManager({
761+
// 0 means max workers
762+
cores: workers === 0 ? undefined : workers,
763+
logger: this.logger.getChild(WorkerManager.name),
764+
});
765+
this.vaultManager.setWorkerManager(this.workerManager);
766+
this.db.setWorkerManager(this.workerManager);
767+
}
751768
await this.status.finishStart({
752769
pid: process.pid,
753770
nodeId: this.keyRing.getNodeId(),
@@ -786,6 +803,9 @@ class PolykeyAgent {
786803
await this.db?.stop();
787804
await this.keyRing?.stop();
788805
await this.schema?.stop();
806+
this.vaultManager.unsetWorkerManager();
807+
this.db.unsetWorkerManager();
808+
await this.workerManager?.destroy();
789809
await this.status?.stop({});
790810
throw e;
791811
}
@@ -819,6 +839,9 @@ class PolykeyAgent {
819839
await this.db.stop();
820840
await this.keyRing.stop();
821841
await this.schema.stop();
842+
this.vaultManager.unsetWorkerManager();
843+
this.db.unsetWorkerManager();
844+
await this.workerManager?.destroy();
822845
await this.status.stop({});
823846
this.logger.info(`Stopped ${this.constructor.name}`);
824847
}
@@ -870,16 +893,6 @@ class PolykeyAgent {
870893
await this.schema.destroy();
871894
this.logger.info(`Destroyed ${this.constructor.name}`);
872895
}
873-
874-
public setWorkerManager(workerManager: PolykeyWorkerManagerInterface) {
875-
this.db.setWorkerManager(workerManager);
876-
this.vaultManager.setWorkerManager(workerManager);
877-
}
878-
879-
public unsetWorkerManager() {
880-
this.db.unsetWorkerManager();
881-
this.vaultManager.unsetWorkerManager();
882-
}
883896
}
884897

885898
export default PolykeyAgent;

src/bin/agent/CommandStart.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import type {
66
} from '../types';
77
import type PolykeyAgent from '../../PolykeyAgent';
88
import type { RecoveryCode } from '../../keys/types';
9-
import type { PolykeyWorkerManagerInterface } from '../../workers/types';
109
import path from 'path';
1110
import childProcess from 'child_process';
1211
import process from 'process';
@@ -46,9 +45,6 @@ class CommandStart extends CommandPolykey {
4645
options.clientPort =
4746
options.clientPort ?? config.defaults.networkConfig.clientPort;
4847
const { default: PolykeyAgent } = await import('../../PolykeyAgent');
49-
const { WorkerManager, utils: workersUtils } = await import(
50-
'../../workers'
51-
);
5248
const nodesUtils = await import('../../nodes/utils');
5349
const keysUtils = await import('../../keys/utils/index');
5450
let password: string | undefined;
@@ -113,6 +109,7 @@ class CommandStart extends CommandPolykey {
113109
proxyPort: options.proxyPort,
114110
},
115111
seedNodes: seedNodes_,
112+
workers: options.workers,
116113
fresh: options.fresh,
117114
};
118115
let statusLiveData: AgentStatusLiveData;
@@ -212,11 +209,7 @@ class CommandStart extends CommandPolykey {
212209
process.title = 'polykey-agent';
213210
// eslint-disable-next-line prefer-const
214211
let pkAgent: PolykeyAgent;
215-
// eslint-disable-next-line prefer-const
216-
let workerManager: PolykeyWorkerManagerInterface;
217212
this.exitHandlers.handlers.push(async () => {
218-
pkAgent?.unsetWorkerManager();
219-
await workerManager?.destroy();
220213
await pkAgent?.stop();
221214
});
222215
try {
@@ -231,13 +224,6 @@ class CommandStart extends CommandPolykey {
231224
}
232225
throw e;
233226
}
234-
if (options.workers !== 0) {
235-
workerManager = await workersUtils.createWorkerManager({
236-
cores: options.workers,
237-
logger: this.logger.getChild(WorkerManager.name),
238-
});
239-
pkAgent.setWorkerManager(workerManager);
240-
}
241227
recoveryCodeOut = pkAgent.keyRing.recoveryCode;
242228
statusLiveData = {
243229
pid: process.pid,

src/bin/utils/options.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ const network = new commander.Option(
138138

139139
const workers = new commander.Option(
140140
'-w --workers <count>',
141-
'Number of workers to use, defaults to number of cores with `all`, 0 means no multi-threading',
141+
'Number of workers to use, defaults to number of cores with `all`, 0 means all cores, `false`|`null`|`none`|`no` means no multi-threading',
142142
)
143143
.argParser(binParsers.parseCoreCount)
144-
.default(undefined);
144+
.default(0, 'all');
145145

146146
const pullVault = new commander.Option(
147147
'-pv, --pull-vault <pullVaultNameOrId>',

src/bin/utils/parsers.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,17 @@ const parseProviderIdList = validateParserToArgListParser(
7272
);
7373

7474
function parseCoreCount(v: string): number | undefined {
75-
if (v === 'all') {
76-
return undefined;
75+
switch (v) {
76+
case 'all':
77+
return 0;
78+
case 'none':
79+
case 'no':
80+
case 'false':
81+
case 'null':
82+
return undefined;
83+
default:
84+
return parseInt(v);
7785
}
78-
return parseInt(v);
7986
}
8087

8188
function parseSecretPath(secretPath: string): [string, string, string?] {

src/workers/errors.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { ErrorPolykey, sysexits } from '../errors';
2+
3+
class ErrorWorkers<T> extends ErrorPolykey<T> {}
4+
5+
class ErrorWorkersInvalidCores<T> extends ErrorWorkers<T> {
6+
static description = 'specified cores must be positive or 0';
7+
exitCode = sysexits.USAGE;
8+
}
9+
10+
export { ErrorWorkersInvalidCores };

src/workers/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { PolykeyWorkerManagerInterface } from './types';
33
import type Logger from '@matrixai/logger';
44
import { WorkerManager } from '@matrixai/workers';
55
import { spawn, Worker } from 'threads';
6+
import * as workerErrors from './errors';
67

78
async function createWorkerManager({
89
cores,
@@ -11,6 +12,9 @@ async function createWorkerManager({
1112
cores?: number;
1213
logger?: Logger;
1314
}): Promise<PolykeyWorkerManagerInterface> {
15+
if (cores != null && (cores < 0 || isNaN(cores))) {
16+
throw new workerErrors.ErrorWorkersInvalidCores();
17+
}
1418
return await WorkerManager.createWorkerManager<PolykeyWorkerModule>({
1519
workerFactory: () => spawn(new Worker('./polykeyWorker')),
1620
cores,

0 commit comments

Comments
 (0)