int cmd_stat_file_meta(const VSTRING& param) { int ret = TFS_SUCCESS; const char* file_path = expand_path(const_cast<string&>(param[0])); char rs_addr[257]; FragInfo frag_info_; int size = param.size(); if (size > 1) { strncpy(rs_addr, param[1].c_str(), 256); rs_addr[256] = '\0'; printf("rs_addr: %s\n", rs_addr); } if (size > 2) { app_id = strtoll(param[2].c_str(), NULL, 10); } if (size > 3) { uid = strtoll(param[3].c_str(), NULL, 10); } NameMetaClientImpl impl; ret = impl.initialize(rs_addr); if (TFS_SUCCESS != ret) { TBSYS_LOG(DEBUG, "meta client login rs_addr: %s fail, ret: %d", rs_addr, ret); } else { ret = impl.read_frag_info(app_id, uid, file_path, frag_info_); } //stat the detail ToolUtil::print_info(ret, "stat %s", file_path); if (TFS_SUCCESS == ret) { int32_t cluster_id = frag_info_.cluster_id_; std::vector<FragMeta> vFragMeta = frag_info_.v_frag_meta_; std::vector<FragMeta>::iterator iter; fprintf(stdout, " FILE_NAME\t BLOCK_ID\t FILE_ID\t OFFSET\t SIZE\n"); for (iter = vFragMeta.begin(); iter < vFragMeta.end(); iter++) { FSName fsname(iter->block_id_, iter->file_id_, cluster_id); fprintf(stdout, " %s\t" " %u\t" " %" PRI64_PREFIX "u\t" " %"PRI64_PREFIX"d\t" " %d\n", fsname.get_name(), iter->block_id_, iter->file_id_, iter->offset_, iter->size_); } } return ret; }
int check(NameMetaClientImpl &client ,string path) { string new_path; string now_name; std::vector<FileMetaInfo> meta_info; std::vector<FileMetaInfo>::const_iterator it; client.ls_dir(app_id, uid, path.c_str(), meta_info, false); TBSYS_LOG(DEBUG, "vector num %lu", meta_info.size()); for(it = meta_info.begin(); it != meta_info.end(); ++it) { now_name = it->name_; new_path = path + now_name; if(it->id_ == 0)//file { TBSYS_LOG(DEBUG, "this is file %s", new_path.c_str()); FragInfo *frag_info = new FragInfo(); client.read_frag_info(app_id, uid, new_path.c_str(), *frag_info); char *bucket_name = new char[256]; sprintf(bucket_name, "%ld^%ld", app_id, uid); ObjectInfo *base_object_info = new ObjectInfo(); ObjectInfo *object_info = new ObjectInfo(); UserInfo *user_info = new UserInfo(); bool still_have = false; int64_t offset = 0; int64_t length = it->size_; int ret = TFS_SUCCESS; do { int64_t read_size = 0; ret = tfs::client::KvMetaHelper::do_get_object(new_server_id, bucket_name, new_path.c_str() + 1, offset, length, object_info, &still_have, *user_info); if (ret == EXIT_OBJECT_NOT_EXIST) { TBSYS_LOG(ERROR, "get_obejct |%s|%s| object not exist",bucket_name,new_path.c_str()); break; } else if (ret != TFS_SUCCESS) { TBSYS_LOG(ERROR, "get_obejct |%s|%s| unknow error",bucket_name,new_path.c_str()); break; } if (offset == 0) { *base_object_info = *object_info; base_object_info->v_tfs_file_info_.clear(); } //todo better for(size_t j = 0; j < object_info->v_tfs_file_info_.size(); ++j) { if (object_info->v_tfs_file_info_[j].offset_ < offset) { continue; } base_object_info->v_tfs_file_info_.push_back(object_info->v_tfs_file_info_[j]); read_size += object_info->v_tfs_file_info_[j].file_size_; } offset += read_size; length -= read_size; }while(still_have && length > 0); if (TFS_SUCCESS == ret) { //check if (abs(it->create_time_ - base_object_info->meta_info_.create_time_) > 60) { TBSYS_LOG(INFO, "[DIFF_INFO] bucket:%s object:%s create_time is diff old:%d new:%"PRI64_PREFIX"d", bucket_name, new_path.c_str(), it->create_time_, base_object_info->meta_info_.create_time_); } if (abs(it->modify_time_ - base_object_info->meta_info_.modify_time_) > 60) { TBSYS_LOG(INFO, "[DIFF_INFO] bucket:%s object:%s modify_time is diff old:%d new:%"PRI64_PREFIX"d", bucket_name, new_path.c_str(), it->modify_time_, base_object_info->meta_info_.modify_time_); } if (it->size_ != base_object_info->meta_info_.big_file_size_) { TBSYS_LOG(INFO, "[DIFF_INFO] bucket:%s object:%s object_size is diff old:%"PRI64_PREFIX"d new:%"PRI64_PREFIX"d", bucket_name, new_path.c_str(), it->size_, base_object_info->meta_info_.big_file_size_); } if (frag_info->v_frag_meta_.size() == base_object_info->v_tfs_file_info_.size()) { TBSYS_LOG(DEBUG, " now size equal is %lu",frag_info->v_frag_meta_.size()); for(size_t i = 0; i < frag_info->v_frag_meta_.size(); ++i) { if (frag_info->cluster_id_ != base_object_info->v_tfs_file_info_[i].cluster_id_) { TBSYS_LOG(INFO, "[DIFF_INFO] bucket:%s object:%s cluster_id is diff old:%d new:%d", bucket_name, new_path.c_str(), frag_info->cluster_id_, base_object_info->v_tfs_file_info_[i].cluster_id_); } if ((int64_t)(frag_info->v_frag_meta_[i].file_id_) != base_object_info->v_tfs_file_info_[i].file_id_) { TBSYS_LOG(INFO, "[DIFF_INFO] bucket:%s object:%s file_id is diff old:%"PRI64_PREFIX"d new:%"PRI64_PREFIX"d", bucket_name, new_path.c_str(), frag_info->v_frag_meta_[i].file_id_, base_object_info->v_tfs_file_info_[i].file_id_); } if (frag_info->v_frag_meta_[i].offset_ != base_object_info->v_tfs_file_info_[i].offset_) { TBSYS_LOG(INFO, "[DIFF_INFO] bucket:%s object:%s offset is diff old:%"PRI64_PREFIX"d new:%"PRI64_PREFIX"d", bucket_name, new_path.c_str(), frag_info->v_frag_meta_[i].offset_, base_object_info->v_tfs_file_info_[i].offset_); } if (frag_info->v_frag_meta_[i].block_id_ != base_object_info->v_tfs_file_info_[i].block_id_) { TBSYS_LOG(INFO, "[DIFF_INFO] bucket:%s object:%s block_id is diff old:%d new:%"PRI64_PREFIX"d", bucket_name, new_path.c_str(), frag_info->v_frag_meta_[i].block_id_, base_object_info->v_tfs_file_info_[i].block_id_); } if (frag_info->v_frag_meta_[i].size_ != base_object_info->v_tfs_file_info_[i].file_size_) { TBSYS_LOG(INFO, "[DIFF_INFO] bucket:%s object:%s frag_size is diff old:%d new:%"PRI64_PREFIX"d", bucket_name, new_path.c_str(), frag_info->v_frag_meta_[i].size_, base_object_info->v_tfs_file_info_[i].file_size_); } // old_meta TBSYS_LOG(DEBUG,"old_meta-> cluster_id:%d, file_id:%"PRI64_PREFIX"d, offset:%"PRI64_PREFIX"d, block_id:%d, size:%d", frag_info->cluster_id_, frag_info->v_frag_meta_[i].file_id_, frag_info->v_frag_meta_[i].offset_, frag_info->v_frag_meta_[i].block_id_, frag_info->v_frag_meta_[i].size_); //new kv_meta TBSYS_LOG(DEBUG,"new_meta-> cluster_id:%d, file_id:%"PRI64_PREFIX"d, offset:%"PRI64_PREFIX"d, block_id:%ld, size:%ld", base_object_info->v_tfs_file_info_[i].cluster_id_, base_object_info->v_tfs_file_info_[i].file_id_, base_object_info->v_tfs_file_info_[i].offset_, base_object_info->v_tfs_file_info_[i].block_id_, base_object_info->v_tfs_file_info_[i].file_size_); } } else { TBSYS_LOG(INFO, "[DIFF_INFO] bucket:%s object:%s frag_size is diff old:%lu new:%lu", bucket_name, new_path.c_str(), frag_info->v_frag_meta_.size(), base_object_info->v_tfs_file_info_.size()); } } delete user_info; delete object_info; delete base_object_info; delete[] bucket_name; delete frag_info; continue; } new_path += "/"; check(client, new_path); } return 0; }