| @@ -20,6 +20,93 @@ func NewCommandService(db *mydb.DB) *CommandService { | |||||
| } | } | ||||
| } | } | ||||
| func (service *CommandService) Read(msg *ramsg.ReadCommand) ramsg.ReadResp { | |||||
| var hashes []string | |||||
| blockIDs := []int{0} | |||||
| // 查询文件对象 | |||||
| object, err := service.db.QueryObjectByID(msg.BucketID, msg.ObjectID) | |||||
| if err != nil { | |||||
| log.WithField("BucketID", msg.BucketID). | |||||
| WithField("ObjectID", msg.ObjectID). | |||||
| Warnf("query Object failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query Object failed") | |||||
| } | |||||
| var nodeIPs []string | |||||
| //-若redundancy是rep,查询对象副本表, 获得repHash | |||||
| if object.Redundancy == consts.REDUNDANCY_REP { | |||||
| objectRep, err := service.db.QueryObjectRep(object.ObjectID) | |||||
| if err != nil { | |||||
| log.WithField("ObjectID", object.ObjectID). | |||||
| Warnf("query ObjectRep failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query ObjectRep failed") | |||||
| } | |||||
| hashes = append(hashes, objectRep.RepHash) | |||||
| nodes, err := service.db.QueryCacheNodeByBlockHash(objectRep.RepHash) | |||||
| if err != nil { | |||||
| log.WithField("RepHash", objectRep.RepHash). | |||||
| Warnf("query Cache failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query Cache failed") | |||||
| } | |||||
| for _, node := range nodes { | |||||
| nodeIPs = append(nodeIPs, node.IP) | |||||
| } | |||||
| } else { | |||||
| blocks, err := service.db.QueryObjectBlock(object.ObjectID) | |||||
| if err != nil { | |||||
| log.WithField("ObjectID", object.ObjectID). | |||||
| Warnf("query Object Block failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query Object Block failed") | |||||
| } | |||||
| ecPolicies := *utils.GetEcPolicy() | |||||
| ecPolicy := ecPolicies[*object.ECName] | |||||
| ecN := ecPolicy.GetN() | |||||
| ecK := ecPolicy.GetK() | |||||
| nodeIPs = make([]string, ecN) | |||||
| hashes = make([]string, ecN) | |||||
| for _, tt := range blocks { | |||||
| id := tt.InnerID | |||||
| hash := tt.BlockHash | |||||
| hashes[id] = hash //这里有问题,采取的其实是直接顺序读的方式,等待加入自适应读模块 | |||||
| nodes, err := service.db.QueryCacheNodeByBlockHash(hash) | |||||
| if err != nil { | |||||
| log.WithField("BlockHash", hash). | |||||
| Warnf("query Cache failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query Cache failed") | |||||
| } | |||||
| if len(nodes) == 0 { | |||||
| log.WithField("BlockHash", hash). | |||||
| Warnf("No node cache the block data for the BlockHash") | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "No node cache the block data for the BlockHash") | |||||
| } | |||||
| nodeIPs[id] = nodes[0].IP | |||||
| } | |||||
| //这里也有和上面一样的问题 | |||||
| for i := 1; i < ecK; i++ { | |||||
| blockIDs = append(blockIDs, i) | |||||
| } | |||||
| } | |||||
| return ramsg.NewCoorReadRespOK( | |||||
| object.Redundancy, | |||||
| nodeIPs, | |||||
| hashes, | |||||
| blockIDs, | |||||
| object.ECName, | |||||
| object.FileSizeInBytes, | |||||
| ) | |||||
| } | |||||
| func (service *CommandService) Move(msg *ramsg.MoveCommand) ramsg.MoveResp { | func (service *CommandService) Move(msg *ramsg.MoveCommand) ramsg.MoveResp { | ||||
| //查询数据库,获取冗余类型,冗余参数 | //查询数据库,获取冗余类型,冗余参数 | ||||
| //jh:使用command中的bucketname和objectname查询对象表,获得redundancy,EcName,fileSizeInBytes | //jh:使用command中的bucketname和objectname查询对象表,获得redundancy,EcName,fileSizeInBytes | ||||
| @@ -154,93 +241,6 @@ func (service *CommandService) WriteRepHash(msg *ramsg.WriteRepHashCommand) rams | |||||
| return ramsg.NewCoorWriteHashRespOK() | return ramsg.NewCoorWriteHashRespOK() | ||||
| } | } | ||||
| func (service *CommandService) Read(msg *ramsg.ReadCommand) ramsg.ReadResp { | |||||
| var hashes []string | |||||
| blockIDs := []int{0} | |||||
| // 查询文件对象 | |||||
| object, err := service.db.QueryObjectByFullName(msg.BucketName, msg.ObjectName) | |||||
| if err != nil { | |||||
| log.WithField("BucketName", msg.BucketName). | |||||
| WithField("ObjectName", msg.ObjectName). | |||||
| Warnf("query Object failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query Object failed") | |||||
| } | |||||
| var nodeIPs []string | |||||
| //-若redundancy是rep,查询对象副本表, 获得repHash | |||||
| if object.Redundancy == consts.REDUNDANCY_REP { | |||||
| objectRep, err := service.db.QueryObjectRep(object.ObjectID) | |||||
| if err != nil { | |||||
| log.WithField("ObjectID", object.ObjectID). | |||||
| Warnf("query ObjectRep failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query ObjectRep failed") | |||||
| } | |||||
| hashes = append(hashes, objectRep.RepHash) | |||||
| nodes, err := service.db.QueryCacheNodeByBlockHash(objectRep.RepHash) | |||||
| if err != nil { | |||||
| log.WithField("RepHash", objectRep.RepHash). | |||||
| Warnf("query Cache failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query Cache failed") | |||||
| } | |||||
| for _, node := range nodes { | |||||
| nodeIPs = append(nodeIPs, node.IP) | |||||
| } | |||||
| } else { | |||||
| blocks, err := service.db.QueryObjectBlock(object.ObjectID) | |||||
| if err != nil { | |||||
| log.WithField("ObjectID", object.ObjectID). | |||||
| Warnf("query Object Block failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query Object Block failed") | |||||
| } | |||||
| ecPolicies := *utils.GetEcPolicy() | |||||
| ecPolicy := ecPolicies[*object.ECName] | |||||
| ecN := ecPolicy.GetN() | |||||
| ecK := ecPolicy.GetK() | |||||
| nodeIPs = make([]string, ecN) | |||||
| hashes = make([]string, ecN) | |||||
| for _, tt := range blocks { | |||||
| id := tt.InnerID | |||||
| hash := tt.BlockHash | |||||
| hashes[id] = hash //这里有问题,采取的其实是直接顺序读的方式,等待加入自适应读模块 | |||||
| nodes, err := service.db.QueryCacheNodeByBlockHash(hash) | |||||
| if err != nil { | |||||
| log.WithField("BlockHash", hash). | |||||
| Warnf("query Cache failed, err: %s", err.Error()) | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "query Cache failed") | |||||
| } | |||||
| if len(nodes) == 0 { | |||||
| log.WithField("BlockHash", hash). | |||||
| Warnf("No node cache the block data for the BlockHash") | |||||
| return ramsg.NewCoorReadRespFailed(errorcode.OPERATION_FAILED, "No node cache the block data for the BlockHash") | |||||
| } | |||||
| nodeIPs[id] = nodes[0].IP | |||||
| } | |||||
| //这里也有和上面一样的问题 | |||||
| for i := 1; i < ecK; i++ { | |||||
| blockIDs = append(blockIDs, i) | |||||
| } | |||||
| } | |||||
| return ramsg.NewCoorReadRespOK( | |||||
| object.Redundancy, | |||||
| nodeIPs, | |||||
| hashes, | |||||
| blockIDs, | |||||
| object.ECName, | |||||
| object.FileSizeInBytes, | |||||
| ) | |||||
| } | |||||
| func (service *CommandService) TempCacheReport(msg *ramsg.TempCacheReport) { | func (service *CommandService) TempCacheReport(msg *ramsg.TempCacheReport) { | ||||
| service.db.BatchInsertOrUpdateCache(msg.Hashes, msg.NodeID) | service.db.BatchInsertOrUpdateCache(msg.Hashes, msg.NodeID) | ||||
| } | } | ||||