From cb2e56fc443cf61113faa62f7295c74f03fb091b Mon Sep 17 00:00:00 2001 From: Kirill Buev Date: Mon, 24 Aug 2020 16:23:52 +0300 Subject: [PATCH] Pause and retry ipset deletion if it fails the first time --- net/ipset/ipset.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/net/ipset/ipset.go b/net/ipset/ipset.go index c835a8b2..072046cd 100644 --- a/net/ipset/ipset.go +++ b/net/ipset/ipset.go @@ -7,6 +7,7 @@ import ( "log" "os/exec" "strings" + "time" "github.com/pkg/errors" ) @@ -21,6 +22,8 @@ const ( ListSet = Type("list:set") HashIP = Type("hash:ip") HashNet = Type("hash:net") + + DestroyRetrySleepMs = 100 ) type Interface interface { @@ -153,12 +156,22 @@ func (i *ipset) FlushAll() error { func (i *ipset) Destroy(ipsetName Name) error { i.removeSetFromUsers(ipsetName) - return doExec("destroy", string(ipsetName)) + err := doExec("destroy", string(ipsetName)) + if err != nil { + time.Sleep(DestroyRetrySleepMs * time.Millisecond) + return doExec("destroy", string(ipsetName)) + } + return err } func (i *ipset) DestroyAll() error { i.users = make(map[entryKey]map[UID]struct{}) - return doExec("destroy") + err := doExec("destroy") + if err != nil { + time.Sleep(DestroyRetrySleepMs * time.Millisecond) + return doExec("destroy") + } + return err } // Fetch a list of all existing sets with a given prefix