Handle concurrent access to the inFlight list

This commit is contained in:
Alexander Neumann 2015-10-14 20:50:54 +02:00
parent 6fa4be5af2
commit 1dd731fdb8
2 changed files with 10 additions and 15 deletions

View file

@ -139,18 +139,19 @@ func (mi *MasterIndex) Current() *Index {
return newIdx return newIdx
} }
// AddInFlight add the given IDs to the list of in-flight IDs. // AddInFlight add the given ID to the list of in-flight IDs. An error is
func (mi *MasterIndex) AddInFlight(IDs ...backend.ID) { // returned when the ID is already in the list.
func (mi *MasterIndex) AddInFlight(id backend.ID) error {
mi.inFlight.Lock() mi.inFlight.Lock()
defer mi.inFlight.Unlock() defer mi.inFlight.Unlock()
ids := backend.IDs(IDs) debug.Log("MasterIndex.AddInFlight", "adding %v", id)
if mi.inFlight.Has(id) {
debug.Log("MasterIndex.AddInFlight", "adding %v", ids) return fmt.Errorf("%v is already in flight", id)
for _, id := range ids {
mi.inFlight.Insert(id)
} }
mi.inFlight.Insert(id)
return nil
} }
// IsInFlight returns true iff the id is contained in the list of in-flight IDs. // IsInFlight returns true iff the id is contained in the list of in-flight IDs.

View file

@ -305,15 +305,9 @@ func (r *Repository) SaveAndEncrypt(t pack.BlobType, data []byte, id *backend.ID
return backend.ID{}, err return backend.ID{}, err
} }
// check if this id is already been saved by another goroutine
if r.idx.IsInFlight(*id) {
debug.Log("Repo.Save", "blob %v is already being saved", id.Str())
return *id, nil
}
// add this id to the list of in-flight chunk ids. // add this id to the list of in-flight chunk ids.
debug.Log("Repo.Save", "add %v to list of in-flight IDs", id.Str()) debug.Log("Repo.Save", "add %v to list of in-flight IDs", id.Str())
r.idx.AddInFlight(*id) err = r.idx.AddInFlight(*id)
if err != nil { if err != nil {
debug.Log("Repo.Save", "another goroutine is already working on %v (%v) does already exist", id.Str, t) debug.Log("Repo.Save", "another goroutine is already working on %v (%v) does already exist", id.Str, t)
return *id, nil return *id, nil