Skip to content

Commit

Permalink
plugins: meta: portmap: Implement a teardown() fast path
Browse files Browse the repository at this point in the history
Just attempt to delete the known rules referring to the custom chain,
then flush and delete it. If the latter succeeds, no referencing rules
are left and the job is done.

If the final flush'n'delete fails, fall back to the referencing rule
search which is slow with large rulesets.

Signed-off-by: Phil Sutter <psutter@redhat.com>
  • Loading branch information
SirPhuttel committed Jul 20, 2023
1 parent 719f60b commit 3eb775c
Showing 1 changed file with 20 additions and 6 deletions.
26 changes: 20 additions & 6 deletions plugins/meta/portmap/chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,27 @@ func (c *chain) setup(ipt *iptables.IPTables) error {
// teardown idempotently deletes a chain. It will not error if the chain doesn't exist.
// It will first delete all references to this chain in the entryChains.
func (c *chain) teardown(ipt *iptables.IPTables) error {
// flush the chain
// This will succeed *and create the chain* if it does not exist.
// If the chain doesn't exist, the next checks will fail.
if err := utils.ClearChain(ipt, c.table, c.name); err != nil {
return err
// nothing to do if the custom chain doesn't exist to begin with
exists, err := ipt.ChainExists(c.table, c.name)
if err == nil && !exists {
return nil
}
// delete references created by setup()
for _, entryChain := range c.entryChains {
for _, rule := range c.entryRules {
r := []string{}
r = append(r, rule...)
r = append(r, "-j", c.name)

ipt.Delete(c.table, entryChain, r...)
}
}
// if chain deletion succeeds now, all references are gone
if err := ipt.ClearAndDeleteChain(c.table, c.name); err == nil {
return nil
}

// find references the hard way
for _, entryChain := range c.entryChains {
entryChainRules, err := ipt.List(c.table, entryChain)
if err != nil || len(entryChainRules) < 1 {
Expand All @@ -98,7 +112,7 @@ func (c *chain) teardown(ipt *iptables.IPTables) error {
}
}

return utils.DeleteChain(ipt, c.table, c.name)
return ipt.ClearAndDeleteChain(c.table, c.name)
}

// check the chain.
Expand Down

0 comments on commit 3eb775c

Please sign in to comment.