From a970abce16fb9e9fb9e2615f990cd7cce05961cb Mon Sep 17 00:00:00 2001 From: "Diogo Franco (Kovensky)" Date: Mon, 15 Jul 2013 01:07:27 -0300 Subject: [PATCH] anidb: Delete invalid cache data If the API queries return errors specifically stating that requested object doesn't exist, then delete the entry from the local cache. --- animecache.go | 2 ++ episodecache.go | 22 ++++++++++++++++++++-- groupcache.go | 3 +++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/animecache.go b/animecache.go index f185867..4eff4b4 100644 --- a/animecache.go +++ b/animecache.go @@ -121,6 +121,8 @@ func (adb *AniDB) AnimeByID(aid AID) <-chan *Anime { case reply := <-udpChan: if reply.Code() == 330 { cache.MarkInvalid(keys...) + // deleted AID? + cache.Delete(keys...) ok = false break Loop diff --git a/episodecache.go b/episodecache.go index 0ed142e..00b2a40 100644 --- a/episodecache.go +++ b/episodecache.go @@ -89,6 +89,7 @@ func (adb *AniDB) EpisodeByID(eid EID) <-chan *Episode { } } else if reply.Code() == 340 { cache.MarkInvalid(keys...) + cache.Delete(keys...) // deleted EID? } else { break } @@ -101,9 +102,26 @@ func (adb *AniDB) EpisodeByID(eid EID) <-chan *Episode { e = ep break } else { - // if this is somehow still a miss, then the EID<->AID map broke - cache.Delete("aid", "by-eid", eid) ok = false + + // check to see if we looked in the right AID + found := false + if a != nil { + for _, ep := range a.Episodes { + if eid == ep.EID { + found = true + break + } + } + } + + // if found, then it's just that the anime is also stale (offline?) + if found { + break + } else { + // otherwise, the EID<->AID map broke + cache.Delete("aid", "by-eid", eid) + } } } intentMap.Notify(e, keys...) diff --git a/groupcache.go b/groupcache.go index 65fe333..a91ebf3 100644 --- a/groupcache.go +++ b/groupcache.go @@ -90,6 +90,7 @@ func (adb *AniDB) GroupByID(gid GID) <-chan *Group { cache.Set(g, keys...) } else if reply.Code() == 350 { cache.MarkInvalid(keys...) + cache.Delete(keys...) // deleted group? } intentMap.Notify(g, keys...) @@ -152,6 +153,8 @@ func (adb *AniDB) GroupByName(gname string) <-chan *Group { cache.Set(g, "gid", gid) } else if reply.Code() == 350 { cache.MarkInvalid(keys...) + cache.Delete(keys...) // renamed group? + cache.Delete(altKeys...) } intentMap.Notify(gid, keys...) -- 2.44.0