Fix race condition causing multiple uploads

This commit is contained in:
Justin Hawkins 2022-05-08 11:38:07 +09:30
parent b851a4f773
commit df0c6d090d
2 changed files with 12 additions and 0 deletions

1
dau.go
View File

@ -129,6 +129,7 @@ func (w *watch) ProcessNewFiles() []string {
} }
w.lastCheck = w.newLastCheck w.lastCheck = w.newLastCheck
} }
return newFiles return newFiles
} }

View File

@ -15,6 +15,7 @@ import (
"net/http" "net/http"
"os" "os"
"path/filepath" "path/filepath"
"sync"
"sync/atomic" "sync/atomic"
"time" "time"
@ -43,6 +44,7 @@ type HTTPClient interface {
type Uploader struct { type Uploader struct {
Uploads []*Upload `json:"uploads"` Uploads []*Upload `json:"uploads"`
Lock sync.Mutex
} }
type Upload struct { type Upload struct {
@ -76,6 +78,7 @@ func NewUploader() *Uploader {
} }
func (u *Uploader) AddFile(file string, conf config.Watcher) { func (u *Uploader) AddFile(file string, conf config.Watcher) {
u.Lock.Lock()
atomic.AddInt32(&currentId, 1) atomic.AddInt32(&currentId, 1)
thisUpload := Upload{ thisUpload := Upload{
Id: currentId, Id: currentId,
@ -91,19 +94,27 @@ func (u *Uploader) AddFile(file string, conf config.Watcher) {
thisUpload.State = StatePending thisUpload.State = StatePending
} }
u.Uploads = append(u.Uploads, &thisUpload) u.Uploads = append(u.Uploads, &thisUpload)
u.Lock.Unlock()
} }
// Upload uploads any files that have not yet been uploaded // Upload uploads any files that have not yet been uploaded
func (u *Uploader) Upload() { func (u *Uploader) Upload() {
u.Lock.Lock()
for _, upload := range u.Uploads { for _, upload := range u.Uploads {
if upload.State == StateQueued { if upload.State == StateQueued {
upload.processUpload() upload.processUpload()
} }
} }
u.Lock.Unlock()
} }
func (u *Uploader) UploadById(id int32) *Upload { func (u *Uploader) UploadById(id int32) *Upload {
u.Lock.Lock()
defer u.Lock.Unlock()
for _, anUpload := range u.Uploads { for _, anUpload := range u.Uploads {
if anUpload.Id == int32(id) { if anUpload.Id == int32(id) {
return anUpload return anUpload