Forráskód Böngészése

Merge pull request #1072 from cpuguy83/reduce_init_cost

Remove pre-defined networks from package init
Madhu Venugopal 9 éve
szülő
commit
bb14f0afb0

+ 4 - 0
libnetwork/drivers/bridge/bridge_test.go

@@ -15,6 +15,10 @@ import (
 	"github.com/docker/libnetwork/types"
 )
 
+func init() {
+	ipamutils.InitNetworks()
+}
+
 func getIPv4Data(t *testing.T) []driverapi.IPAMData {
 	ipd := driverapi.IPAMData{AddressSpace: "full"}
 	nw, _, err := ipamutils.ElectInterfaceAddresses("")

+ 1 - 0
libnetwork/ipam/allocator_test.go

@@ -46,6 +46,7 @@ func randomLocalStore() (datastore.DataStore, error) {
 }
 
 func getAllocator() (*Allocator, error) {
+	ipamutils.InitNetworks()
 	ds, err := randomLocalStore()
 	if err != nil {
 		return nil, err

+ 4 - 0
libnetwork/ipams/builtin/builtin_unix.go

@@ -8,6 +8,7 @@ import (
 	"github.com/docker/libnetwork/datastore"
 	"github.com/docker/libnetwork/ipam"
 	"github.com/docker/libnetwork/ipamapi"
+	"github.com/docker/libnetwork/ipamutils"
 )
 
 // Init registers the built-in ipam service with libnetwork
@@ -28,6 +29,9 @@ func Init(ic ipamapi.Callback, l, g interface{}) error {
 			return fmt.Errorf("incorrect global datastore passed to built-in ipam init")
 		}
 	}
+
+	ipamutils.InitNetworks()
+
 	a, err := ipam.NewAllocator(localDs, globalDs)
 	if err != nil {
 		return err

+ 12 - 4
libnetwork/ipamutils/utils.go

@@ -1,7 +1,10 @@
 // Package ipamutils provides utililty functions for ipam management
 package ipamutils
 
-import "net"
+import (
+	"net"
+	"sync"
+)
 
 var (
 	// PredefinedBroadNetworks contains a list of 31 IPv4 private networks with host size 16 and 12
@@ -10,11 +13,16 @@ var (
 	// PredefinedGranularNetworks contains a list of 64K IPv4 private networks with host size 8
 	// (10.x.x.x/24) which do not overlap with the networks in `PredefinedBroadNetworks`
 	PredefinedGranularNetworks []*net.IPNet
+
+	initNetworksOnce sync.Once
 )
 
-func init() {
-	PredefinedBroadNetworks = initBroadPredefinedNetworks()
-	PredefinedGranularNetworks = initGranularPredefinedNetworks()
+// InitNetworks initializes the pre-defined networks used by the  built-in IP allocator
+func InitNetworks() {
+	initNetworksOnce.Do(func() {
+		PredefinedBroadNetworks = initBroadPredefinedNetworks()
+		PredefinedGranularNetworks = initGranularPredefinedNetworks()
+	})
 }
 
 func initBroadPredefinedNetworks() []*net.IPNet {

+ 2 - 0
libnetwork/ipamutils/utils_linux.go

@@ -22,6 +22,8 @@ func ElectInterfaceAddresses(name string) (*net.IPNet, []*net.IPNet, error) {
 		err    error
 	)
 
+	InitNetworks()
+
 	defer osl.InitOSContext()()
 
 	link, _ := netlink.LinkByName(name)

+ 4 - 0
libnetwork/ipamutils/utils_test.go

@@ -9,6 +9,10 @@ import (
 	"github.com/vishvananda/netlink"
 )
 
+func init() {
+	InitNetworks()
+}
+
 func TestGranularPredefined(t *testing.T) {
 	for _, nw := range PredefinedGranularNetworks {
 		if ones, bits := nw.Mask.Size(); bits != 32 || ones != 24 {