{"record":{"id":"9b1850e6acf8f262","repo":"hcengineering/platform","slug":"low-level-storage-is-not-available","errorCode":null,"errorMessage":"Low level storage is not available","messagePattern":"Low level storage is not available","errorType":"exception","errorClass":"PlatformError","httpStatus":null,"severity":"critical","filePath":"foundations/server/packages/core/src/utils.ts","lineNumber":288,"sourceCode":"  wsIds: WorkspaceIds,\n  doBroadcast: boolean = false\n): Client & BackupClient {\n  const contextData = new SessionDataImpl(\n    systemAccount,\n    'pipeline',\n    true,\n    { targets: {}, txes: [], queue: [], sessions: {} },\n    wsIds,\n    true,\n    undefined,\n    undefined,\n    pipeline.context.modelDb,\n    new Map(),\n    'transactor'\n  )\n  ctx.contextData = contextData\n  if (pipeline.context.lowLevelStorage === undefined) {\n    throw new PlatformError(unknownError('Low level storage is not available'))\n  }\n  const backupOps = new BackupClientOps(pipeline.context.lowLevelStorage)\n\n  return {\n    findAll: async (_class, query, options) => {\n      const result = await pipeline.findAll(ctx, _class, query, options)\n      return toFindResult(\n        result.map((v) => {\n          return pipeline.context.hierarchy.updateLookupMixin(_class, v, options)\n        }),\n        result.total\n      )\n    },\n    findOne: async (_class, query, options) => {\n      const result = await pipeline.findAll(ctx, _class, query, { ...options, limit: 1 })\n      return toFindResult(\n        result.map((v) => {\n          return pipeline.context.hierarchy.updateLookupMixin(_class, v, options)","sourceCodeStart":270,"sourceCodeEnd":306,"githubUrl":"https://github.com/hcengineering/platform/blob/63e28dc96483967b2fc21c881b3f1023c1de7718/foundations/server/packages/core/src/utils.ts#L270-L306","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Configure the low-level storage (blob/datalake) provider for the pipeline context","Point the tooling at a full workspace node that has storage attached","Verify service env vars/endpoints for storage are set before startup"],"exampleFix":"// before\nconst ctx = { modelDb, workspace: ..., } // no lowLevelStorage\n// after\nconst ctx = { modelDb, lowLevelStorage: createLowLevelStorage(conf), workspace: ... }","handlingStrategy":"validation","validationCode":"if (pipeline.context.lowLevelStorage === undefined) {\n  throw new Error('pipeline has no low-level storage; attach a storage provider before backup/upgrade')\n}","typeGuard":"function hasLowLevelStorage(ctx: unknown): ctx is { lowLevelStorage: object } {\n  return typeof ctx === 'object' && ctx !== null && 'lowLevelStorage' in ctx && (ctx as any).lowLevelStorage !== undefined\n}","tryCatchPattern":"try {\n  const client = pipelineClient(pipeline, ctx)\n} catch (err) {\n  if (err instanceof PlatformError && err.message.includes('Low level storage is not available')) {\n    // route to a node with storage or configure storage provider\n  } else throw err\n}","preventionTips":["Wire the blob/datalake storage provider in every pipeline context that supports backup","Run backup/upgrade tooling only against full workspace nodes","Add a startup assertion that lowLevelStorage is present where required"],"tags":["storage","configuration","backup"],"backgroundTag":"storage-backend-unavailable","analyzedSha":"63e28dc96483967b2fc21c881b3f1023c1de7718","analyzedAt":"2026-08-29T15:21:27.377Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}