code: func (cs *CachableSource) Scan() error {
  	lc, err := NewLazySource(cs.root)
  	if err != nil {
  		return err
  	}
  	txn := iradix.New().Txn()
  	err = cs.root.Walk(cs.root.Path(), func(path string, info os.FileInfo, err error) error {
  		if err != nil {
  			return errors.Wrapf(err, "failed to walk %s", path)
  		}
  		rel, err := Rel(cs.root, path)
  		if err != nil {
  			return err
  		}
  		h, err := lc.Hash(rel)
  		if err != nil {
  			return err
  		}
  		txn.Insert([]byte(rel), &fileInfo{sum: h})
  		return nil
  	})
  	if err != nil {
  		return err
  	}
  	cs.mu.Lock()
  	defer cs.mu.Unlock()
  	cs.tree = txn.Commit()
  	return nil
  }
docs: // Scan rescans the cache information from the file system