{"record":{"id":"b4e9d24b8316f1e1","repo":"hcengineering/platform","slug":"upload-failed","errorCode":null,"errorMessage":"Upload failed: ","messagePattern":"Upload failed: ","errorType":"exception","errorClass":"DatalakeError","httpStatus":null,"severity":"error","filePath":"foundations/server/packages/datalake/src/client.ts","lineNumber":294,"sourceCode":"    form.append('file', file)\n\n    const response = await fetchSafe(ctx, url, {\n      method: 'POST',\n      body: form as unknown as BodyInit,\n      headers: {\n        ...this.headers\n      }\n    })\n\n    const result = (await response.json()) as BlobUploadResult[]\n    if (result.length !== 1) {\n      throw new DatalakeError('Bad datalake response: ' + result.toString())\n    }\n\n    const uploadResult = result[0]\n\n    if ('error' in uploadResult) {\n      throw new DatalakeError('Upload failed: ' + uploadResult.error)\n    }\n\n    return uploadResult.metadata\n  }\n\n  async uploadWithMultipart (\n    ctx: MeasureContext,\n    workspace: WorkspaceUuid,\n    objectName: string,\n    stream: Readable | Buffer | string,\n    params: UploadObjectParams\n  ): Promise<ObjectMetadata> {\n    const chunkSize = 10 * 1024 * 1024\n\n    const multipart = await this.multipartUploadStart(ctx, workspace, objectName, params)\n\n    try {\n      const parts: MultipartUploadPart[] = []","sourceCodeStart":276,"sourceCodeEnd":312,"githubUrl":"https://github.com/hcengineering/platform/blob/63e28dc96483967b2fc21c881b3f1023c1de7718/foundations/server/packages/datalake/src/client.ts#L276-L312","documentation":"After a successful form-data upload, the single BlobUploadResult is checked for an 'error' field; if present, DatalakeError('Upload failed: <server error>') is thrown with the server-provided reason.","triggerScenarios":"The datalake accepted the request but the per-blob upload result carries an error — e.g. bucket/workspace permissions, quota exceeded, name conflicts, or backend write failure.","commonSituations":"Insufficient permissions on the target workspace/container; object name policy violations; disk-full or backend storage errors server-side.","solutions":["Read the server error appended in the message and fix the underlying cause (permissions, quota, name)","Retry the upload with a valid objectName","Check datalake server logs for the corresponding upload failure"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"function isUploadOk(r: BlobUploadResult): boolean {\n  return !('error' in r)\n}","tryCatchPattern":"try {\n  await client.putObject(ctx, workspace, objectName, stream)\n} catch (err) {\n  if (err instanceof DatalakeError && err.message.startsWith('Upload failed:')) {\n    const reason = err.message.slice('Upload failed: '.length)\n    // act on server-provided reason (permissions, quota, name)\n  } else throw err\n}","preventionTips":["Verify workspace/container permissions before uploads","Respect object naming policies to avoid server-side rejections","Monitor server-side storage capacity and quotas"],"tags":["datalake","upload","server-error"],"backgroundTag":"upload-failed","analyzedSha":"63e28dc96483967b2fc21c881b3f1023c1de7718","analyzedAt":"2026-08-29T15:21:27.377Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}