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 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`,

View File

@ -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

View File

@ -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<typeof instanceService>
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`)

View File

@ -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<PortResult>(range(500).map(getNextPort))
await Promise.all<PortResult>(range(maxPorts).map(getNextPort))
).map((portInfo) => portInfo[0])
return {