code: func (m *ManagerImpl) sanitizeNodeAllocatable(node *schedulernodeinfo.NodeInfo) {
  	var newAllocatableResource *schedulernodeinfo.Resource
  	allocatableResource := node.AllocatableResource()
  	if allocatableResource.ScalarResources == nil {
  		allocatableResource.ScalarResources = make(map[v1.ResourceName]int64)
  	}
  	for resource, devices := range m.allocatedDevices {
  		needed := devices.Len()
  		quant, ok := allocatableResource.ScalarResources[v1.ResourceName(resource)]
  		if ok && int(quant) >= needed {
  			continue
  		}
  		// Needs to update nodeInfo.AllocatableResource to make sure
  		// NodeInfo.allocatableResource at least equal to the capacity already allocated.
  		if newAllocatableResource == nil {
  			newAllocatableResource = allocatableResource.Clone()
  		}
  		newAllocatableResource.ScalarResources[v1.ResourceName(resource)] = int64(needed)
  	}
  	if newAllocatableResource != nil {
  		node.SetAllocatableResource(newAllocatableResource)
  	}
  }
docs: // sanitizeNodeAllocatable scans through allocatedDevices in the device manager
  // and if necessary, updates allocatableResource in nodeInfo to at least equal to
  // the allocated capacity. This allows pods that have already been scheduled on
  // the node to pass GeneralPredicates admission checking even upon device plugin failure.