@tus/s3-store: failed part upload crashes entire server
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 45/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- aws, typescript
Direzione di ricerca
Start in packages/s3-store/src/index.ts at the deferred promises around lines 421 and 440, then inspect packages/server/src/server.ts around line 188 to trace rejection handling. Reproduce an uploadPart or uploadIncompletePart rejection, including permit.release() failures, and verify that the server remains running while the current upload returns HTTP 500.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
When uploadPart or uploadIncompletePart throws (is rejected) entire server crashes. This happens often with Scaleway Object Storage as their service fails with error 500 with non-informative console message An error was encountered in a non-retryable streaming request. from AWS library. After listening for unhandledRejection event I got some more information.
Unhandled Rejection at: Promise {
<rejected> S3ServiceException [InternalError]: We encountered an internal error. Please try again.
at throwDefaultError (/app/node_modules/@smithy/smithy-client/dist-cjs/index.js:867:20)
at /app/node_modules/@smithy/smithy-client/dist-cjs/index.js:876:5
at de_CommandError (/app/node_modules/@aws-sdk/client-s3/dist-cjs/index.js:4965:14)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async /app/node_modules/@smithy/middleware-serde/dist-cjs/index.js:35:20
at async /app/node_modules/@aws-sdk/middleware-sdk-s3/dist-cjs/index.js:483:18
at async /app/node_modules/@smithy/middleware-retry/dist-cjs/index.js:321:38
at async /app/node_modules/@aws-sdk/middleware-flexible-checksums/dist-cjs/index.js:315:18
at async /app/node_modules/@aws-sdk/middleware-sdk-s3/dist-cjs/index.js:109:22
at async /app/node_modules/@aws-sdk/middleware-sdk-s3/dist-cjs/index.js:136:14 {
'$fault': 'client',
'$metadata': {
httpStatusCode: 500,
requestId: 'txg5c09a7e2fbe14ba89375-0067aa0421',
extendedRequestId: 'txg5c09a7e2fbe14ba89375-0067aa0421',
cfId: undefined
},
Code: 'InternalError',
RequestId: 'txg5c09a7e2fbe14ba89375-0067aa0421',
HostId: 'txg5c09a7e2fbe14ba89375-0067aa0421',
Resource: '<s3-object-key>.bin'
},
I believe the problem is that when a deferred promise is created it does not handle rejections. It is only inserted into a list.
https://github.com/tus/tus-node-server/blob/81eb03a82658b2e5e97abdb05c26418192320724/packages/s3-store/src/index.ts#L421
At the end promises are aggregated with Promise.all and returned to the caller where an rejection handler is eventually added.
https://github.com/tus/tus-node-server/blob/81eb03a82658b2e5e97abdb05c26418192320724/packages/s3-store/src/index.ts#L440
https://github.com/tus/tus-node-server/blob/81eb03a82658b2e5e97abdb05c26418192320724/packages/server/src/server.ts#L188
During this period if any of the promises in a list are rejected, the rejection is not handled.
Steps to reproduce
Use S3 server that sometimes throws errors (e.g. Scaleway Object Storage) or manually throw error. I modified uploadPart(metadata, readStream, partNumber) to randomly reject. Add provided snippet at the top of this function. This will result in server crash.
const errorProbability = Math.random()
if (errorProbability < 0.2) {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('test'));
}, 1000);
})
}
Expected behavior
Server should not crash. Failed part upload should end the current upload with HTTP 500 Internal Server Error status code.
Observation
Promises (rejections) returned by acquiredPermit?.release() and permit?.release() are also not handled and would cause server to crash.
- Lingua principale
- TypeScript
- Stelle
- 1.1k
- Fork
- 228
- Merge medio
- 4g 3h
- PR unite (30g)
- 14
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di tus/tus-node-server
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 64/100
tus/tus-node-server#884 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 42/100
tus/tus-node-server#807 ·
I maintainer di solito rispondono entro 1 giorno
-
Datastore dynamicAperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
tus/tus-node-server#737 · 3 commenti · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
tus/tus-node-server#521 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
tus/tus-node-server#380 · 7 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di tus/tus-node-server
Issue simili
-
area:cli bug P4
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
bug from-studio
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
esengine/DeepSeek-Reasonix#14868 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
linxiv-dev/linXiv#384 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
factory-active task-identify-harness-labels-done task-identify-issue-type-done
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
vercel/ai#24302 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno