func (a *Allocator) initializeAddressSpace(as string, ds datastore.DataStore) error { scope := "" if ds != nil { scope = ds.Scope() } a.Lock() if currAS, ok := a.addrSpaces[as]; ok { if currAS.ds != nil { a.Unlock() return types.ForbiddenErrorf("a datastore is already configured for the address space %s", as) } } a.addrSpaces[as] = &addrSpace{ subnets: map[SubnetKey]*PoolData{}, id: dsConfigKey + "/" + as, scope: scope, ds: ds, alloc: a, } a.Unlock() a.checkConsistency(as) return nil }
func ensureKeys(key string, cs datastore.DataStore) error { exists, err := cs.KVStore().Exists(key) if err != nil { return err } if exists { return nil } return cs.KVStore().Put(key, []byte{}, nil) }
func (c *controller) getNetworksFromStore(global bool) ([]*store.KVPair, error) { var cs datastore.DataStore c.Lock() if global { cs = c.globalStore } else { cs = c.localStore } c.Unlock() return cs.KVStore().List(datastore.Key(datastore.NetworkKeyPrefix)) }
func (a *Allocator) initializeAddressSpace(as string, ds datastore.DataStore) error { a.Lock() if _, ok := a.addrSpaces[as]; ok { a.Unlock() return types.ForbiddenErrorf("tried to add an axisting address space: %s", as) } a.addrSpaces[as] = &addrSpace{ subnets: map[SubnetKey]*PoolData{}, id: dsConfigKey + "/" + as, scope: ds.Scope(), ds: ds, alloc: a, } a.Unlock() a.checkConsistency(as) return nil }
// set/reset the bit func (h *Handle) set(ordinal, start, end uint64, any bool, release bool) (uint64, error) { var ( bitPos uint64 bytePos uint64 ret uint64 err error ) for { var store datastore.DataStore h.Lock() store = h.store h.Unlock() if store != nil { if err := store.GetObject(datastore.Key(h.Key()...), h); err != nil && err != datastore.ErrKeyNotFound { return ret, err } } h.Lock() // Get position if available if release { bytePos, bitPos = ordinalToPos(ordinal) } else { if any { bytePos, bitPos, err = getFirstAvailable(h.head, start) ret = posToOrdinal(bytePos, bitPos) if end < ret { err = ErrNoBitAvailable } } else { bytePos, bitPos, err = checkIfAvailable(h.head, ordinal) ret = ordinal } } if err != nil { h.Unlock() return ret, err } // Create a private copy of h and work on it nh := h.getCopy() h.Unlock() nh.head = pushReservation(bytePos, bitPos, nh.head, release) if release { nh.unselected++ } else { nh.unselected-- } // Attempt to write private copy to store if err := nh.writeToStore(); err != nil { if _, ok := err.(types.RetryError); !ok { return ret, fmt.Errorf("internal failure while setting the bit: %v", err) } // Retry continue } // Previous atomic push was succesfull. Save private copy to local copy h.Lock() defer h.Unlock() h.unselected = nh.unselected h.head = nh.head h.dbExists = nh.dbExists h.dbIndex = nh.dbIndex return ret, nil } }