Directory上传
- 调度器计算出分配的vid
- 根据vid找到stores机器列表(/volume里面的信息),将这些机器验证(/rack中的信息)
- 为图片生成唯一的id
- 调用hbase客户端,将图片的元数据存储在hbase数据库中
bucket_{bucket}
表的rowkey是filename,存储key,sha1,mine,status,mtime
bfsmeta
表的rowkey是key,存储vid,cookie,update_time
- 返回结果vid,key,cookie,store机器列表
// UploadStores get writable stores for http upload
func (d *Directory) UploadStores(bucket string, f *meta.File) (n *meta.Needle, stores []string, err error) {
var (
key int64
vid int32
svrs []string
store string
storeMeta *meta.Store
ok bool
)
if vid, err = d.dispatcher.VolumeId(d.group, d.storeVolume); err != nil {
log.Errorf("dispatcher.VolumeId error(%v)", err)
err = errors.ErrStoreNotAvailable
return
}
svrs = d.volumeStore[vid]
stores = make([]string, 0, len(svrs))
for _, store = range svrs {
if storeMeta, ok = d.store[store]; !ok {
err = errors.ErrZookeeperDataError
return
}
stores = append(stores, storeMeta.Api)
}
if key, err = d.genkey.Getkey(); err != nil {
log.Errorf("genkey.Getkey() error(%v)", err)
err = errors.ErrIdNotAvailable
return
}
n = new(meta.Needle)
n.Key = key
n.Vid = vid
n.Cookie = d.cookie()
f.Key = key
if err = d.hBase.Put(bucket, f, n); err != nil {
if err != errors.ErrNeedleExist {
log.Errorf("hBase.Put error(%v)", err)
err = errors.ErrHBase
}
}
return
}