SSTableReader internal implementation.
| 20 | |
| 21 | // SSTableReader internal implementation. |
| 22 | bool SSTableReader::Impl::LoadFileInfo(File *file_base, |
| 23 | hfile::DataIndex *data_index, |
| 24 | hfile::FileInfo *file_info, |
| 25 | hfile::FileTrailer *file_trailer) { |
| 26 | // Load file trailer |
| 27 | const int tailer_size = hfile::FileTrailer::TrailerSize(); |
| 28 | bool s = file_base->Seek(-tailer_size, SEEK_END); |
| 29 | |
| 30 | int64_t current_pos = file_base->Tell(); |
| 31 | file_base->Seek(0, SEEK_END); |
| 32 | LOG(INFO)<< "current_pos:" << current_pos << ", file size:" << file_base->Tell(); |
| 33 | file_base->Seek(current_pos, SEEK_SET); |
| 34 | |
| 35 | if (!s) { |
| 36 | LOG(ERROR)<< "Fail to seek"; |
| 37 | return false; |
| 38 | } |
| 39 | std::string buffer; |
| 40 | buffer.resize(tailer_size); |
| 41 | int64_t size = file_base->Read((void*) buffer.c_str(), tailer_size); |
| 42 | if (tailer_size != size) { |
| 43 | LOG(ERROR)<< "Read file trailer failed. read size:" << buffer.size() |
| 44 | << ",TrailerSize: " << tailer_size; |
| 45 | return false; |
| 46 | } |
| 47 | if (!file_trailer->DecodeFromString(buffer)) { |
| 48 | LOG(ERROR)<< "parse file trailer failed, invalid format!"; |
| 49 | return false; |
| 50 | } |
| 51 | |
| 52 | // if don't need file info, just return |
| 53 | if (!file_info) |
| 54 | return true; |
| 55 | int64_t file_info_length = file_trailer->data_index_offset() |
| 56 | - file_trailer->file_info_offset(); |
| 57 | if (file_info_length < 0) { |
| 58 | LOG(ERROR)<< "get invalid file info length: " << file_info_length; |
| 59 | return false; |
| 60 | } |
| 61 | |
| 62 | s = file_base->Seek(file_trailer->file_info_offset(), SEEK_SET); |
| 63 | if (!s) { |
| 64 | LOG(ERROR)<< "Fail to seek file"; |
| 65 | return false; |
| 66 | } |
| 67 | |
| 68 | buffer.resize(file_info_length); |
| 69 | size = file_base->Read((void*) buffer.c_str(), file_info_length); |
| 70 | if (size != file_info_length) { |
| 71 | LOG(ERROR)<< "read file info failed"; |
| 72 | return false; |
| 73 | } |
| 74 | |
| 75 | if (!file_info->DecodeFromString(buffer)) { |
| 76 | LOG(ERROR)<< "parse file info failed, invalid format!"; |
| 77 | return false; |
| 78 | } |
| 79 |
nothing calls this directly
no test coverage detected