code: func (gb *GraphBuilder) addDependentToOwners(n *node, owners []metav1.OwnerReference) {
  	for _, owner := range owners {
  		ownerNode, ok := gb.uidToNode.Read(owner.UID)
  		if !ok {
  			// Create a "virtual" node in the graph for the owner if it doesn't
  			// exist in the graph yet.
  			ownerNode = &node{
  				identity: objectReference{
  					OwnerReference: owner,
  					Namespace:      n.identity.Namespace,
  				},
  				dependents: make(map[*node]struct{}),
  				virtual:    true,
  			}
  			klog.V(5).Infof("add virtual node.identity: %s\n\n", ownerNode.identity)
  			gb.uidToNode.Write(ownerNode)
  		}
  		ownerNode.addDependent(n)
  		if !ok {
  			// Enqueue the virtual node into attemptToDelete.
  			// The garbage processor will enqueue a virtual delete
  			// event to delete it from the graph if API server confirms this
  			// owner doesn't exist.
  			gb.attemptToDelete.Add(ownerNode)
  		}
  	}
  }
docs: // addDependentToOwners adds n to owners' dependents list. If the owner does not
  // exist in the gb.uidToNode yet, a "virtual" node will be created to represent
  // the owner. The "virtual" node will be enqueued to the attemptToDelete, so that
  // attemptToDeleteItem() will verify if the owner exists according to the API server.