Add worker to wait for project export relations to finished
What does this MR do and why?
Note: The user can't trigger these workers yet. In a future MR, a feature flag will be added to enable these workers.
Related to: #366828 (closed)
This change is part of a sequence of changes that will export projects using multiple Sidekiq Jobs rather than running the whole export process in just one single job.
This MR adds the CreateRelationExportsWorker
worker, which is responsible for creating a relation_export
record for each project relation that needs to be exported. For context, the relation_export
record is just an entry in the DB that stores information about the status of the relation export. Then for each record that is created, a RelationExportWorker
worker is enqueued to initiate the export of the relation. And finally, the CreateRelationExportsWorker
enqueues the WaitRelationExportsWorker
worker, which will wait for all relations to be exported.
The WaitRelationExportsWorker
worker is responsible for monitoring the relation exports. If one of the relation_export
fails or gets stuck (the respective worker gets interrupted multiple times, and it's sent to the dead queue), the WaitRelationExportsWorker
marks the whole project export as failed and notifies the error. And in case all relation_export
succeeds, it calls the ParallelProjectExportWorker
worker, which will merge each individual exported relation in a single archive file (project.tar.gz).
sequenceDiagram
autonumber
participant export_service as CreateRelationExportsWorker
participant relations_worker as RelationExportWorker
participant tracker as WaitRelationExportsWorker
participant export_worker as ParallelProjectExportWorker
par Generate relations in parallel
export_service->>relations_worker: Enqueue worker to generate relation A
export_service->>relations_worker: Enqueue worker to generate relation B
export_service->>relations_worker: Enqueue worker to generate relation C
export_service->>relations_worker: ...
end
export_service->>tracker: Enqueues WaitRelationExportsWorker
loop
tracker->>tracker: Monitor if all relations were generated. <br />Keep re-enqueuing itself until all relations are generated.<br />Notify the user in case of an error occurs
end
tracker->>export_worker: Enqueue worker
Screenshots or screen recordings
Successful export example
Export with an unexpected error
How to set up and validate locally
Because these workers aren't reached via UI or API, we need to use the Rails console to test them.
bin/rails c
project_id = 1
user_id = User.first.id
Projects::ImportExport::CreateRelationExportsWorker.perform_async(user_id, project_id)
Then check if the project was exported successfully by going to the Project page -> Settings -> General -> Advanced -> Export project
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.