code: func (t *tOps) open(f *tFile) (ch *cache.Handle, err error) {
  	ch = t.cache.Get(0, uint64(f.fd.Num), func() (size int, value cache.Value) {
  		var r storage.Reader
  		r, err = t.s.stor.Open(f.fd)
  		if err != nil {
  			return 0, nil
  		}
  
  		var bcache *cache.NamespaceGetter
  		if t.bcache != nil {
  			bcache = &cache.NamespaceGetter{Cache: t.bcache, NS: uint64(f.fd.Num)}
  		}
  
  		var tr *table.Reader
  		tr, err = table.NewReader(r, f.size, f.fd, bcache, t.bpool, t.s.o.Options)
  		if err != nil {
  			r.Close()
  			return 0, nil
  		}
  		return 1, tr
  
  	})
  	if ch == nil && err == nil {
  		err = ErrClosed
  	}
  	return
  }
docs: // Opens table. It returns a cache handle, which should
  // be released after use.