// PutL3n4Addr stores the given service in the kvstore and returns the L3n4AddrID // created for the given l3n4Addr. If baseID is different than 0, it tries to acquire that // ID to the l3n4Addr. func (d *Daemon) PutL3n4Addr(l3n4Addr types.L3n4Addr, baseID uint32) (*types.L3n4AddrID, error) { log.Debugf("Resolving service %+v", l3n4Addr) // Retrieve unique SHA256Sum for service sha256Sum, err := l3n4Addr.SHA256Sum() if err != nil { return nil, err } svcPath := path.Join(common.ServicesKeyPath, sha256Sum) // Lock that sha256Sum lockKey, err := d.kvClient.LockPath(svcPath) if err != nil { return nil, err } defer lockKey.Unlock() // After lock complete, get svc's path rmsg, err := d.kvClient.GetValue(svcPath) if err != nil { return nil, err } sl4KV := types.L3n4AddrID{} if rmsg != nil { if err := json.Unmarshal(rmsg, &sl4KV); err != nil { return nil, err } } if sl4KV.ID == 0 { sl4KV.L3n4Addr = l3n4Addr if err := d.gasNewL3n4AddrID(&sl4KV, baseID); err != nil { return nil, err } err = d.kvClient.SetValue(svcPath, sl4KV) } return &sl4KV, err }