]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Only lock in set_members on mutating operations
authorKevin Benton <blak111@gmail.com>
Mon, 5 Oct 2015 14:57:54 +0000 (07:57 -0700)
committerKevin Benton <blak111@gmail.com>
Thu, 8 Oct 2015 21:51:48 +0000 (14:51 -0700)
ipset was locking on every set_members call with an external
filesystem lock. This was expensive when lots of ports that
were a part of the same security group were on the same agent.

This patch adjusts it to check if it needs to make a change before
acquiring the semaphore.

Closes-Bug: #1502930
Change-Id: I2553ab74b7d0fbada5d573246194f83d58bd7d56

neutron/agent/linux/ipset_manager.py

index ebcc72dc1c246167a978a4a53f5e08e090616b7c..78445cb7f7150d3c99316c94b47becfb1c1d1759 100644 (file)
@@ -70,7 +70,6 @@ class IpsetManager(object):
         set_name = self.get_name(id, ethertype)
         return set_name in self.ipset_sets
 
-    @utils.synchronized('ipset', external=True)
     def set_members(self, id, ethertype, member_ips):
         """Create or update a specific set by name and ethertype.
         It will make sure that a set is created, updated to
@@ -78,6 +77,16 @@ class IpsetManager(object):
         that's faster.
         """
         member_ips = self._sanitize_addresses(member_ips)
+        set_name = self.get_name(id, ethertype)
+        add_ips = self._get_new_set_ips(set_name, member_ips)
+        del_ips = self._get_deleted_set_ips(set_name, member_ips)
+        if not add_ips and not del_ips and self.set_exists(id, ethertype):
+            # nothing to do because no membership changes and the ipset exists
+            return
+        self.set_members_mutate(id, ethertype, member_ips)
+
+    @utils.synchronized('ipset', external=True)
+    def set_members_mutate(self, id, ethertype, member_ips):
         set_name = self.get_name(id, ethertype)
         if not self.set_exists(id, ethertype):
             # The initial creation is handled with create/refresh to