add module invalidation via DELETE request
This commit is contained in:
@@ -158,6 +158,10 @@ func (api *api) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
version = m[2]
|
||||
}
|
||||
module = decodeBangs(module)
|
||||
if r.Method == http.MethodDelete && version != "" {
|
||||
api.delete(w, r, module, version)
|
||||
return
|
||||
}
|
||||
httpRequests.Add(route.id, 1)
|
||||
defer func() {
|
||||
v := &expvar.Float{}
|
||||
@@ -288,3 +292,12 @@ func (api *api) zip(w http.ResponseWriter, r *http.Request, module, version stri
|
||||
}
|
||||
io.Copy(w, bytes.NewReader(b))
|
||||
}
|
||||
|
||||
func (api *api) delete(w http.ResponseWriter, r *http.Request, module, version string) {
|
||||
for _, store := range api.stores {
|
||||
if err := store.Del(r.Context(), module, vcs.Version(version)); err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,4 +47,15 @@ func (d disk) Get(ctx context.Context, module string, version vcs.Version) (Snap
|
||||
return s, err
|
||||
}
|
||||
|
||||
func (d disk) Del(ctx context.Context, module string, version vcs.Version) error {
|
||||
dir := string(d)
|
||||
s := Snapshot{Module: module, Version: version}
|
||||
err := os.Remove(filepath.Join(dir, s.Key()+".time"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = os.Remove(filepath.Join(dir, s.Key()+".zip"))
|
||||
return err
|
||||
}
|
||||
|
||||
func (d disk) Close() error { return nil }
|
||||
|
||||
@@ -45,17 +45,41 @@ func (m *memory) Put(ctx context.Context, snapshot Snapshot) error {
|
||||
func (m *memory) Get(ctx context.Context, module string, version vcs.Version) (Snapshot, error) {
|
||||
m.Lock()
|
||||
defer m.Unlock()
|
||||
return m.lookup(module, version)
|
||||
item, err := m.lookup(module, version)
|
||||
if err != nil {
|
||||
return Snapshot{}, err
|
||||
}
|
||||
return item.Snapshot, nil
|
||||
}
|
||||
|
||||
func (m *memory) lookup(module string, version vcs.Version) (Snapshot, error) {
|
||||
func (m *memory) Del(ctx context.Context, module string, version vcs.Version) error {
|
||||
m.Lock()
|
||||
defer m.Unlock()
|
||||
item, err := m.lookup(module, version)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if item.prev == nil {
|
||||
m.head = item.next
|
||||
} else {
|
||||
item.prev.next = item.next
|
||||
}
|
||||
if item.next == nil {
|
||||
m.tail = item.prev
|
||||
} else {
|
||||
item.next.prev = item.prev
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *memory) lookup(module string, version vcs.Version) (*lruItem, error) {
|
||||
for item := m.head; item != nil; item = item.next {
|
||||
if item.Module == module && item.Version == version {
|
||||
m.update(item)
|
||||
return item.Snapshot, nil
|
||||
return item, nil
|
||||
}
|
||||
}
|
||||
return Snapshot{}, errors.New("not found")
|
||||
return nil, errors.New("not found")
|
||||
}
|
||||
|
||||
func (m *memory) insert(item *lruItem) {
|
||||
|
||||
@@ -14,6 +14,7 @@ type logger = func(...interface{})
|
||||
type Store interface {
|
||||
Put(ctx context.Context, snapshot Snapshot) error
|
||||
Get(ctx context.Context, module string, version vcs.Version) (Snapshot, error)
|
||||
Del(ctx context.Context, module string, version vcs.Version) error
|
||||
Close() error
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user