code: func (proxier *Proxier) releaseNodePort(ip net.IP, port int, protocol v1.Protocol, owner proxy.ServicePortName) error {
  	proxier.portMapMutex.Lock()
  	defer proxier.portMapMutex.Unlock()
  
  	key := portMapKey{ip: ip.String(), port: port, protocol: protocol}
  	existing, found := proxier.portMap[key]
  	if !found {
  		// We tolerate this, it happens if we are cleaning up a failed allocation
  		klog.Infof("Ignoring release on unowned port: %v", key)
  		return nil
  	}
  	if existing.owner != owner {
  		return fmt.Errorf("Port conflict detected on port %v (unowned unlock).  %v vs %v", key, owner, existing)
  	}
  	delete(proxier.portMap, key)
  	existing.socket.Close()
  	return nil
  }
docs: // Release a claim on a port.  Returns an error if the owner does not match the claim.
  // Tolerates release on an unclaimed port, to simplify .