enh: port pool

This commit is contained in:
Ben Allfree 2023-06-21 13:44:45 -07:00
parent 90c6a75928
commit cf63b15e32
4 changed files with 21 additions and 10 deletions

View File

@ -51,6 +51,8 @@ export const NODE_ENV = env('NODE_ENV', '')
export const DEBUG = envb('DEBUG', NODE_ENV === 'development') export const DEBUG = envb('DEBUG', NODE_ENV === 'development')
export const TRACE = envb('TRACE', false) 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_SLEEP = envi(`DAEMON_PB_BACKUP_SLEEP`, 100)
export const DAEMON_PB_BACKUP_PAGE_COUNT = envi( export const DAEMON_PB_BACKUP_PAGE_COUNT = envi(
`DAEMON_PB_BACKUP_PAGE_COUNT`, `DAEMON_PB_BACKUP_PAGE_COUNT`,

View File

@ -1,4 +1,5 @@
import { import {
DAEMON_MAX_PORTS,
DAEMON_PB_PORT_BASE, DAEMON_PB_PORT_BASE,
DAEMON_PB_SEMVER, DAEMON_PB_SEMVER,
DEBUG, DEBUG,
@ -102,7 +103,8 @@ global.EventSource = require('eventsource')
await instanceService({ await instanceService({
logger, logger,
instanceApiCheckIntervalMs: 50, instanceApiCheckIntervalMs: 50,
instanceApiTimeoutMs: 1000, instanceApiTimeoutMs: 5000,
maxPorts: DAEMON_MAX_PORTS,
}) })
await centralDbService({ logger }) await centralDbService({ logger })
// gen:service // gen:service

View File

@ -30,7 +30,7 @@ import { AsyncReturnType } from 'type-fest'
import { instanceLoggerService } from '../InstanceLoggerService' import { instanceLoggerService } from '../InstanceLoggerService'
import { pocketbase } from '../PocketBaseService' import { pocketbase } from '../PocketBaseService'
import { createDenoProcess } from './Deno/DenoProcess' import { createDenoProcess } from './Deno/DenoProcess'
import { portManager } from './PortManager' import { portManager, PortManagerConfig } from './PortManager'
enum InstanceApiStatus { enum InstanceApiStatus {
Starting = 'starting', Starting = 'starting',
@ -48,12 +48,17 @@ type InstanceApi = {
export type InstanceServiceConfig = SingletonBaseConfig & { export type InstanceServiceConfig = SingletonBaseConfig & {
instanceApiTimeoutMs: number instanceApiTimeoutMs: number
instanceApiCheckIntervalMs: number instanceApiCheckIntervalMs: number
} } & PortManagerConfig
export type InstanceServiceApi = AsyncReturnType<typeof instanceService> export type InstanceServiceApi = AsyncReturnType<typeof instanceService>
export const instanceService = mkSingleton( export const instanceService = mkSingleton(
async (config: InstanceServiceConfig) => { async (config: InstanceServiceConfig) => {
const { logger, instanceApiTimeoutMs, instanceApiCheckIntervalMs } = config const {
logger,
instanceApiTimeoutMs,
instanceApiCheckIntervalMs,
maxPorts,
} = config
const instanceServiceLogger = logger.create('InstanceService') const instanceServiceLogger = logger.create('InstanceService')
const { dbg, raw, error, warn } = instanceServiceLogger const { dbg, raw, error, warn } = instanceServiceLogger
const { client } = await clientService() const { client } = await clientService()
@ -202,9 +207,6 @@ export const instanceService = mkSingleton(
Obtain empty port Obtain empty port
*/ */
dbg(`Obtaining port`) dbg(`Obtaining port`)
healthyGuard()
await updateInstanceStatus(instance.id, InstanceStatus.Port)
healthyGuard()
const [newPort, releasePort] = getNextPort() const [newPort, releasePort] = getNextPort()
shutdownManager.add(() => { shutdownManager.add(() => {
dbg(`Releasing port`) dbg(`Releasing port`)
@ -507,7 +509,7 @@ export const instanceService = mkSingleton(
`InstanceService` `InstanceService`
) )
const { getNextPort } = await portManager({}) const { getNextPort } = await portManager({ maxPorts })
const shutdown = async () => { const shutdown = async () => {
dbg(`Shutting down instance manager`) dbg(`Shutting down instance manager`)

View File

@ -6,7 +6,12 @@ import getPort from 'get-port'
export type PortResult = [number, () => void] 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 _logger = logger().create(`PortManager`)
const { dbg, error } = _logger const { dbg, error } = _logger
@ -41,7 +46,7 @@ export const portManager = mkSingleton(async () => {
})() })()
const ports = await ( const ports = await (
await Promise.all<PortResult>(range(500).map(getNextPort)) await Promise.all<PortResult>(range(maxPorts).map(getNextPort))
).map((portInfo) => portInfo[0]) ).map((portInfo) => portInfo[0])
return { return {