repo: archive: make GET endpoint synchronous again

If the request isn't complete, this endpoint will now submit the request and
wait for completion using the new API. This may still be susceptible to
timeouts for larger repos, but other endpoints now exist that the web
interface will use to negotiate its way through larger archive processes.
This commit is contained in:
Kyle Evans 2020-05-05 22:37:12 -05:00
parent d134c3f3ce
commit ee6f508799
1 changed files with 11 additions and 15 deletions

View File

@ -480,23 +480,19 @@ func Download(ctx *context.Context) {
aReq := archiver_service.DeriveRequestFrom(ctx, uri) aReq := archiver_service.DeriveRequestFrom(ctx, uri)
downloadName := ctx.Repo.Repository.Name + "-" + aReq.GetArchiveName() downloadName := ctx.Repo.Repository.Name + "-" + aReq.GetArchiveName()
if !aReq.IsComplete() {
aReq = archiver_service.ArchiveRepository(aReq)
archiver_service.LockQueue()
for !aReq.IsComplete() {
archiver_service.WaitForCompletion()
}
archiver_service.UnlockQueue()
}
if aReq.IsComplete() { if aReq.IsComplete() {
ctx.ServeFile(aReq.GetArchivePath(), downloadName) ctx.ServeFile(aReq.GetArchivePath(), downloadName)
} else { } else {
// We'll wait up to two seconds for the request to be satisfied, before we just return ctx.Error(404)
// a 200 Accepted to indicate that we're processing.
archiver_service.ArchiveRepository(aReq)
timeout := time.Now().Add(2 * time.Second)
for {
if aReq.IsComplete() || time.Now().After(timeout) {
break
}
}
if aReq.IsComplete() {
ctx.ServeFile(aReq.GetArchivePath(), downloadName)
} else {
ctx.Error(202, "Request accepted, processing archive.")
}
} }
} }
@ -513,7 +509,7 @@ func InitiateDownload(ctx *context.Context) {
complete := aReq.IsComplete() complete := aReq.IsComplete()
if !complete { if !complete {
archiver_service.ArchiveRepository(aReq) aReq = archiver_service.ArchiveRepository(aReq)
// As with the standard Download, we'll wait up to two seconds for the request // As with the standard Download, we'll wait up to two seconds for the request
// to be completed. The difference is that we'll never download the file from a POST // to be completed. The difference is that we'll never download the file from a POST
// request, only indicate the current status. If we did manage to complete the request // request, only indicate the current status. If we did manage to complete the request