hcengineering/platform · critical · PlatformError

Low level storage is not available

Error message

Low level storage is not available

What it means

wrapPipeline builds a backup-aware pipeline client and needs pipeline.context.lowLevelStorage to construct BackupClientOps. If the pipeline context was created without low-level storage, a PlatformError with 'Low level storage is not available' is thrown.

Source

Thrown at foundations/server/packages/core/src/utils.ts:288

  wsIds: WorkspaceIds,
  doBroadcast: boolean = false
): Client & BackupClient {
  const contextData = new SessionDataImpl(
    systemAccount,
    'pipeline',
    true,
    { targets: {}, txes: [], queue: [], sessions: {} },
    wsIds,
    true,
    undefined,
    undefined,
    pipeline.context.modelDb,
    new Map(),
    'transactor'
  )
  ctx.contextData = contextData
  if (pipeline.context.lowLevelStorage === undefined) {
    throw new PlatformError(unknownError('Low level storage is not available'))
  }
  const backupOps = new BackupClientOps(pipeline.context.lowLevelStorage)

  return {
    findAll: async (_class, query, options) => {
      const result = await pipeline.findAll(ctx, _class, query, options)
      return toFindResult(
        result.map((v) => {
          return pipeline.context.hierarchy.updateLookupMixin(_class, v, options)
        }),
        result.total
      )
    },
    findOne: async (_class, query, options) => {
      const result = await pipeline.findAll(ctx, _class, query, { ...options, limit: 1 })
      return toFindResult(
        result.map((v) => {
          return pipeline.context.hierarchy.updateLookupMixin(_class, v, options)

View on GitHub (pinned to 63e28dc964)

Solutions

  1. Configure the low-level storage (blob/datalake) provider for the pipeline context
  2. Point the tooling at a full workspace node that has storage attached
  3. Verify service env vars/endpoints for storage are set before startup

Example fix

// before
const ctx = { modelDb, workspace: ..., } // no lowLevelStorage
// after
const ctx = { modelDb, lowLevelStorage: createLowLevelStorage(conf), workspace: ... }
Defensive patterns

Strategy: validation

Validate before calling

if (pipeline.context.lowLevelStorage === undefined) {
  throw new Error('pipeline has no low-level storage; attach a storage provider before backup/upgrade')
}

Type guard

function hasLowLevelStorage(ctx: unknown): ctx is { lowLevelStorage: object } {
  return typeof ctx === 'object' && ctx !== null && 'lowLevelStorage' in ctx && (ctx as any).lowLevelStorage !== undefined
}

Try / catch

try {
  const client = pipelineClient(pipeline, ctx)
} catch (err) {
  if (err instanceof PlatformError && err.message.includes('Low level storage is not available')) {
    // route to a node with storage or configure storage provider
  } else throw err
}

Prevention

When it happens

Trigger: Calling client/pipelineClient/upgradeWorkspace against a pipeline whose context has no lowLevelStorage — e.g. a transactor-only setup without a storage (datalake/blob) provider wired in.

Common situations: Deployment missing the storage service configuration; running backup/upgrade tooling against a node that does not own storage; misconfigured service bindings so lowLevelStorage was never assigned.

Related errors


AI-assisted analysis of hcengineering/platform@63e28dc964 (2026-08-29). Data as JSON: /api/errors/9b1850e6acf8f262. Report an issue: GitHub.