// GetStores get readable stores for http get func (d *Directory) GetStores(bucket, filename string) (n *meta.Needle, stores []string, err error) { var ( store string svrs []string storeMeta *meta.Store ok bool ) if n, err = d.hBase.Get(bucket, filename); err != nil { log.Errorf("hBase.Get error(%v)", err) if err != errors.ErrNeedleNotExist { err = errors.ErrHBase } return } if n == nil { err = errors.ErrNeedleNotExist return } if svrs, ok = d.volumeStore[n.Vid]; !ok { err = errors.ErrZookeeperDataError return } stores = make([]string, 0, len(svrs)) for _, store = range svrs { if storeMeta, ok = d.store[store]; !ok { log.Errorf("store cannot match store:", store) continue } if !storeMeta.CanRead() { continue } stores = append(stores, storeMeta.Api) } if len(stores) == 0 { err = errors.ErrStoreNotAvailable } return }