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 <[email protected]>
  • Loading branch information
SirPhuttel authored and coutinhop committed Jan 27, 2025
1 parent f6e6a02 commit 1989329
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)
}

// insertUnique will add a rule to a chain if it does not already exist.
Expand Down

0 comments on commit 1989329

Please sign in to comment.