code: func (s *holderSyncer) syncField(index, name string) error {
  	span, ctx := tracing.StartSpanFromContext(context.Background(), "HolderSyncer.syncField")
  	defer span.Finish()
  
  	// Retrieve field reference.
  	f := s.Holder.Field(index, name)
  	if f == nil {
  		return nil
  	}
  	indexTag := fmt.Sprintf("index:%s", index)
  	fieldTag := fmt.Sprintf("field:%s", name)
  
  	// Read block checksums.
  	blks, err := f.RowAttrStore().Blocks()
  	if err != nil {
  		return errors.Wrap(err, "getting blocks")
  	}
  	s.Stats.CountWithCustomTags("RowAttrStoreBlocks", int64(len(blks)), 1.0, []string{indexTag, fieldTag})
  
  	// Sync with every other host.
  	for _, node := range Nodes(s.Cluster.nodes).FilterID(s.Node.ID) {
  		// Retrieve attributes from differing blocks.
  		// Skip update and recomputation if no attributes have changed.
  		m, err := s.Cluster.InternalClient.RowAttrDiff(ctx, &node.URI, index, name, blks)
  		if err == ErrFieldNotFound {
  			continue // field not created remotely yet, skip
  		} else if err != nil {
  			return errors.Wrap(err, "getting differing blocks")
  		} else if len(m) == 0 {
  			continue
  		}
  		s.Stats.CountWithCustomTags("RowAttrDiff", int64(len(m)), 1.0, []string{indexTag, fieldTag, node.ID})
  
  		// Update local copy.
  		if err := f.RowAttrStore().SetBulkAttrs(m); err != nil {
  			return errors.Wrap(err, "setting attrs")
  		}
  
  		// Recompute blocks.
  		blks, err = f.RowAttrStore().Blocks()
  		if err != nil {
  			return errors.Wrap(err, "recomputing blocks")
  		}
  	}
  
  	return nil
  }
docs: // syncField synchronizes field attributes with the rest of the cluster.