code: func (gc *GarbageCollector) classifyReferences(item *node, latestReferences []metav1.OwnerReference) (
  	solid, dangling, waitingForDependentsDeletion []metav1.OwnerReference, err error) {
  	for _, reference := range latestReferences {
  		isDangling, owner, err := gc.isDangling(reference, item)
  		if err != nil {
  			return nil, nil, nil, err
  		}
  		if isDangling {
  			dangling = append(dangling, reference)
  			continue
  		}
  
  		ownerAccessor, err := meta.Accessor(owner)
  		if err != nil {
  			return nil, nil, nil, err
  		}
  		if ownerAccessor.GetDeletionTimestamp() != nil && hasDeleteDependentsFinalizer(ownerAccessor) {
  			waitingForDependentsDeletion = append(waitingForDependentsDeletion, reference)
  		} else {
  			solid = append(solid, reference)
  		}
  	}
  	return solid, dangling, waitingForDependentsDeletion, nil
  }
docs: // classify the latestReferences to three categories:
  // solid: the owner exists, and is not "waitingForDependentsDeletion"
  // dangling: the owner does not exist
  // waitingForDependentsDeletion: the owner exists, its deletionTimestamp is non-nil, and it has
  // FinalizerDeletingDependents
  // This function communicates with the server.