code: func (r *rangeAllocator) AllocateOrOccupyCIDR(node *v1.Node) error {
  	if node == nil {
  		return nil
  	}
  	if !r.insertNodeToProcessing(node.Name) {
  		klog.V(2).Infof("Node %v is already in a process of CIDR assignment.", node.Name)
  		return nil
  	}
  	if node.Spec.PodCIDR != "" {
  		return r.occupyCIDR(node)
  	}
  	podCIDR, err := r.cidrs.AllocateNext()
  	if err != nil {
  		r.removeNodeFromProcessing(node.Name)
  		nodeutil.RecordNodeStatusChange(r.recorder, node, "CIDRNotAvailable")
  		return fmt.Errorf("failed to allocate cidr: %v", err)
  	}
  
  	klog.V(4).Infof("Putting node %s with CIDR %s into the work queue", node.Name, podCIDR)
  	r.nodeCIDRUpdateChannel <- nodeAndCIDR{
  		nodeName: node.Name,
  		cidr:     podCIDR,
  	}
  	return nil
  }
docs: // WARNING: If you're adding any return calls or defer any more work from this
  // function you have to make sure to update nodesInProcessing properly with the
  // disposition of the node when the work is done.