diff --git a/packages/daemon/src/constants.ts b/packages/daemon/src/constants.ts index 38efaedb..42737a37 100644 --- a/packages/daemon/src/constants.ts +++ b/packages/daemon/src/constants.ts @@ -51,6 +51,8 @@ export const NODE_ENV = env('NODE_ENV', '') export const DEBUG = envb('DEBUG', NODE_ENV === 'development') export const TRACE = envb('TRACE', false) +export const DAEMON_MAX_PORTS = envi(`DAEMON_MAX_PORTS`, 500) + export const DAEMON_PB_BACKUP_SLEEP = envi(`DAEMON_PB_BACKUP_SLEEP`, 100) export const DAEMON_PB_BACKUP_PAGE_COUNT = envi( `DAEMON_PB_BACKUP_PAGE_COUNT`, diff --git a/packages/daemon/src/server.ts b/packages/daemon/src/server.ts index b947f352..838431aa 100644 --- a/packages/daemon/src/server.ts +++ b/packages/daemon/src/server.ts @@ -1,4 +1,5 @@ import { + DAEMON_MAX_PORTS, DAEMON_PB_PORT_BASE, DAEMON_PB_SEMVER, DEBUG, @@ -102,7 +103,8 @@ global.EventSource = require('eventsource') await instanceService({ logger, instanceApiCheckIntervalMs: 50, - instanceApiTimeoutMs: 1000, + instanceApiTimeoutMs: 5000, + maxPorts: DAEMON_MAX_PORTS, }) await centralDbService({ logger }) // gen:service diff --git a/packages/daemon/src/services/InstanceService/InstanceService.ts b/packages/daemon/src/services/InstanceService/InstanceService.ts index 345f4c92..fafea8ec 100644 --- a/packages/daemon/src/services/InstanceService/InstanceService.ts +++ b/packages/daemon/src/services/InstanceService/InstanceService.ts @@ -30,7 +30,7 @@ import { AsyncReturnType } from 'type-fest' import { instanceLoggerService } from '../InstanceLoggerService' import { pocketbase } from '../PocketBaseService' import { createDenoProcess } from './Deno/DenoProcess' -import { portManager } from './PortManager' +import { portManager, PortManagerConfig } from './PortManager' enum InstanceApiStatus { Starting = 'starting', @@ -48,12 +48,17 @@ type InstanceApi = { export type InstanceServiceConfig = SingletonBaseConfig & { instanceApiTimeoutMs: number instanceApiCheckIntervalMs: number -} +} & PortManagerConfig export type InstanceServiceApi = AsyncReturnType export const instanceService = mkSingleton( async (config: InstanceServiceConfig) => { - const { logger, instanceApiTimeoutMs, instanceApiCheckIntervalMs } = config + const { + logger, + instanceApiTimeoutMs, + instanceApiCheckIntervalMs, + maxPorts, + } = config const instanceServiceLogger = logger.create('InstanceService') const { dbg, raw, error, warn } = instanceServiceLogger const { client } = await clientService() @@ -202,9 +207,6 @@ export const instanceService = mkSingleton( Obtain empty port */ dbg(`Obtaining port`) - healthyGuard() - await updateInstanceStatus(instance.id, InstanceStatus.Port) - healthyGuard() const [newPort, releasePort] = getNextPort() shutdownManager.add(() => { dbg(`Releasing port`) @@ -507,7 +509,7 @@ export const instanceService = mkSingleton( `InstanceService` ) - const { getNextPort } = await portManager({}) + const { getNextPort } = await portManager({ maxPorts }) const shutdown = async () => { dbg(`Shutting down instance manager`) diff --git a/packages/daemon/src/services/InstanceService/PortManager.ts b/packages/daemon/src/services/InstanceService/PortManager.ts index c8bf109a..7d17e698 100644 --- a/packages/daemon/src/services/InstanceService/PortManager.ts +++ b/packages/daemon/src/services/InstanceService/PortManager.ts @@ -6,7 +6,12 @@ import getPort from 'get-port' export type PortResult = [number, () => void] -export const portManager = mkSingleton(async () => { +export type PortManagerConfig = { + maxPorts: number +} + +export const portManager = mkSingleton(async (cfg: PortManagerConfig) => { + const { maxPorts } = cfg const _logger = logger().create(`PortManager`) const { dbg, error } = _logger @@ -41,7 +46,7 @@ export const portManager = mkSingleton(async () => { })() const ports = await ( - await Promise.all(range(500).map(getNextPort)) + await Promise.all(range(maxPorts).map(getNextPort)) ).map((portInfo) => portInfo[0]) return {