block_id_counter FileManagerPosix::getMaxUsedBlockCounter(const block_id_domain block_domain) const { const string block_domain_str(ToZeroPaddedString(block_domain, kBlockIdDomainLengthInDigits)); string glob_pattern(storage_path_); glob_pattern.append("qsblk_"); glob_pattern.append(block_domain_str); glob_pattern.append("_*.qsb"); glob_t glob_result; glob(glob_pattern.c_str(), 0, nullptr, &glob_result); string filename_pattern(storage_path_); filename_pattern.append("qsblk_"); filename_pattern.append(block_domain_str); filename_pattern.append("_%"); filename_pattern.append(SCNu64); filename_pattern.append(".qsb"); block_id_counter counter_max = 0, counter; if (glob_result.gl_pathc > 0 && sscanf(glob_result.gl_pathv[glob_result.gl_pathc - 1], filename_pattern.c_str(), &counter) == 1 && counter > counter_max) { counter_max = counter; } globfree(&glob_result); return counter_max; }
block_id_counter FileManagerHdfs::getMaxUsedBlockCounter(const block_id_domain block_domain) const { int num_files = 0; hdfsFileInfo *file_infos = hdfsListDirectory(hdfs_, storage_path_.c_str(), &num_files); if (file_infos == nullptr) { if (errno != ENOENT) { LOG_WARNING("Failed to list file info with error: " << strerror(errno)); } return 0; } string filename_pattern("/qsblk_"); filename_pattern.append(ToZeroPaddedString(block_domain, kBlockIdDomainLengthInDigits)); filename_pattern.append("_%"); filename_pattern.append(SCNu64); filename_pattern.append(".qsb"); block_id_counter counter_max = 0, counter; for (int i = 0; i < num_files; ++i) { // NOTE(zuyu): mName looks like // "/user/<username>/<storage_path_>/qsblk_<block_domain>_[0-9]*.qsb". const char *filename = std::strrchr(file_infos[i].mName, '/'); if (filename != nullptr && sscanf(filename, filename_pattern.c_str(), &counter) == 1 && counter > counter_max) { counter_max = counter; } } hdfsFreeFileInfo(file_infos, num_files); return counter_max; }
block_id_counter FileManagerWindows::getMaxUsedBlockCounter(const block_id_domain block_domain) const { const string block_domain_str(ToZeroPaddedString(block_domain, kBlockIdDomainLengthInDigits)); string glob_pattern(storage_path_); glob_pattern.append("qsblk_"); glob_pattern.append(block_domain_str); glob_pattern.append("_*.qsb"); WIN32_FIND_DATA find_data; HANDLE find_handle = INVALID_HANDLE_VALUE; DWORD error_code = 0; find_handle = FindFirstFile(glob_pattern.c_str(), &find_data); if (find_handle == INVALID_HANDLE_VALUE) { error_code = GetLastError(); if (error_code != ERROR_FILE_NOT_FOUND) { LOG(ERROR) << "Failed to retrieve blockfiles with error_code: " << error_code; } return 0; } string filename_pattern("qsblk_"); filename_pattern.append(block_domain_str); filename_pattern.append("_%"); filename_pattern.append(SCNu64); filename_pattern.append(".qsb"); block_id_counter counter_max = 0, counter; do { if (sscanf(find_data.cFileName, filename_pattern.c_str(), &counter) == 1 && counter > counter_max) { counter_max = counter; } } while (FindNextFile(find_handle, &find_data) != 0); error_code = GetLastError(); if (error_code != ERROR_NO_MORE_FILES) { LOG(ERROR) << "Failed to FindNextFile with error_code: " << error_code; } if (FindClose(find_handle) == 0) { LOG(ERROR) << "Failed to close the file with error_code: " << GetLastError(); } return counter_max; }