Correctly save transaction with retries

This commit is contained in:
Chocobozzz 2024-07-23 16:38:28 +02:00
parent fbee171a0b
commit 89e3951587
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
2 changed files with 13 additions and 2 deletions

View File

@ -68,10 +68,20 @@ function transactionRetryer <T> (func: (err: any, data: T) => any) {
})
}
function saveInTransactionWithRetries <T extends Pick<Model, 'save'>> (model: T) {
function saveInTransactionWithRetries <T extends Pick<Model, 'save' | 'changed'>> (model: T) {
const changedKeys = model.changed()
if (!changedKeys) throw new Error('No changed keys found')
return retryTransactionWrapper(() => {
return sequelizeTypescript.transaction(async transaction => {
await model.save({ transaction })
try {
await model.save({ transaction })
} catch {
// Reinit changed keys
for (const key of changedKeys) {
model.changed(key as keyof Model, true)
}
}
})
})
}

View File

@ -75,6 +75,7 @@ Some env variables can be defined to disable/enable some tests:
* `AKISMET_KEY`: specify an Akismet key to test akismet external PeerTube plugin
* `OBJECT_STORAGE_SCALEWAY_KEY_ID` and `OBJECT_STORAGE_SCALEWAY_ACCESS_KEY`: specify Scaleway API keys to test object storage ACL (not supported by our `chocobozzz/s3-ninja` container)
* `ENABLE_FFMPEG_THUMBNAIL_PIXEL_COMPARISON_TESTS=true`: enable pixel comparison on images generated by ffmpeg. Disabled by default because a custom ffmpeg version may fails the tests
* `YOUTUBE_DL_DOWNLOAD_BEARER_TOKEN`: Bearer token to download youtube-dl binary
### Debug server logs