diff options
author | Tim Barron <tjbarron@google.com> | 2022-08-11 17:05:22 -0700 |
---|---|---|
committer | Tim Barron <tjbarron@google.com> | 2022-08-11 17:05:22 -0700 |
commit | 87267cbc5531600072a283ba0c9500c3fcac87af (patch) | |
tree | 2ec5c19afb1f4d5ee229d0619c25b2f2819ccea0 /icing/file/filesystem.cc | |
parent | 7c93c404e1fb4ed5e35326245ebc820ed774c6b2 (diff) | |
download | icing-87267cbc5531600072a283ba0c9500c3fcac87af.tar.gz |
Sync from upstream.
Descriptions:
======================================================================
Implement new version of ResultState and ResultStateManager to 1)
enforce a page byte size limit and 2) improve handling of pagination
when we encounter deleted documents.
======================================================================
Fix bugs in IcingDynamicTrie::Delete.
======================================================================
Implement IcingDynamicTrie::IsBranchingTerm.
======================================================================
Change Icing default logging level to INFO
======================================================================
Refactor KeyMapper class to be an interface.
======================================================================
Improve NamespaceChecker logic to improve Suggest latency.
======================================================================
Change icing native log tag to "AppSearchIcing"
======================================================================
Implement Index Compaction rather than rebuilding index during
Compaction.
======================================================================
Implement reverse iterator for IcingDynamicTrie
======================================================================
Avoid adding unnecessary branch points during index compaction
======================================================================
Invalidate expired result states when adding to/retrieving from
ResultStateManager.
======================================================================
Add new methods (MutableView, MutableArrayView, Append, Allocate) to
FileBackedVector
======================================================================
Create and implement PersistentHashMap class.
======================================================================
Implement RFC822 Tokenizer
======================================================================
Remove uses of StringPrintf in ICING_LOG statements
======================================================================
Properly set query latency when an error is encountered or results are
empty.
======================================================================
Bug: 146903474
Bug: 152934343
Bug: 193919210
Bug: 193453081
Bug: 231368517
Bug: 235395538
Bug: 236412165
Change-Id: I8aa278cebb12b25b39deb0ef584c0f198952659d
Diffstat (limited to 'icing/file/filesystem.cc')
-rw-r--r-- | icing/file/filesystem.cc | 97 |
1 files changed, 33 insertions, 64 deletions
diff --git a/icing/file/filesystem.cc b/icing/file/filesystem.cc index 82b8d98..10b77db 100644 --- a/icing/file/filesystem.cc +++ b/icing/file/filesystem.cc @@ -63,18 +63,16 @@ void LogOpenFileDescriptors() { constexpr int kMaxFileDescriptorsToStat = 4096; struct rlimit rlim = {0, 0}; if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "getrlimit() failed (errno=%d)", errno); + ICING_LOG(ERROR) << "getrlimit() failed (errno=" << errno << ")"; return; } int fd_lim = rlim.rlim_cur; if (fd_lim > kMaxFileDescriptorsToStat) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Maximum number of file descriptors (%d) too large.", fd_lim); + ICING_LOG(ERROR) << "Maximum number of file descriptors (" << fd_lim + << ") too large."; fd_lim = kMaxFileDescriptorsToStat; } - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Listing up to %d file descriptors.", fd_lim); + ICING_LOG(ERROR) << "Listing up to " << fd_lim << " file descriptors."; // Verify that /proc/self/fd is a directory. If not, procfs is not mounted or // inaccessible for some other reason. In that case, there's no point trying @@ -96,15 +94,12 @@ void LogOpenFileDescriptors() { if (len >= 0) { // Zero-terminate the buffer, because readlink() won't. target[len < target_size ? len : target_size - 1] = '\0'; - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("fd %d -> \"%s\"", fd, - target); + ICING_LOG(ERROR) << "fd " << fd << " -> \"" << target << "\""; } else if (errno != ENOENT) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("fd %d -> ? (errno=%d)", - fd, errno); + ICING_LOG(ERROR) << "fd " << fd << " -> ? (errno=" << errno << ")"; } } - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "File descriptor list complete."); + ICING_LOG(ERROR) << "File descriptor list complete."; } // Logs an error formatted as: desc1 + file_name + desc2 + strerror(errnum). @@ -113,8 +108,7 @@ void LogOpenFileDescriptors() { // file descriptors (see LogOpenFileDescriptors() above). void LogOpenError(const char* desc1, const char* file_name, const char* desc2, int errnum) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "%s%s%s%s", desc1, file_name, desc2, strerror(errnum)); + ICING_LOG(ERROR) << desc1 << file_name << desc2 << strerror(errnum); if (errnum == EMFILE) { LogOpenFileDescriptors(); } @@ -155,8 +149,7 @@ bool ListDirectoryInternal(const char* dir_name, } } if (closedir(dir) != 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Error closing %s: %s", dir_name, strerror(errno)); + ICING_LOG(ERROR) << "Error closing " << dir_name << " " << strerror(errno); } return true; } @@ -179,11 +172,10 @@ void ScopedFd::reset(int fd) { const int64_t Filesystem::kBadFileSize; bool Filesystem::DeleteFile(const char* file_name) const { - ICING_VLOG(1) << IcingStringUtil::StringPrintf("Deleting file %s", file_name); + ICING_VLOG(1) << "Deleting file " << file_name; int ret = unlink(file_name); if (ret != 0 && errno != ENOENT) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Deleting file %s failed: %s", file_name, strerror(errno)); + ICING_LOG(ERROR) << "Deleting file " << file_name << " failed: " << strerror(errno); return false; } return true; @@ -192,8 +184,7 @@ bool Filesystem::DeleteFile(const char* file_name) const { bool Filesystem::DeleteDirectory(const char* dir_name) const { int ret = rmdir(dir_name); if (ret != 0 && errno != ENOENT) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Deleting directory %s failed: %s", dir_name, strerror(errno)); + ICING_LOG(ERROR) << "Deleting directory " << dir_name << " failed: " << strerror(errno); return false; } return true; @@ -206,8 +197,7 @@ bool Filesystem::DeleteDirectoryRecursively(const char* dir_name) const { if (errno == ENOENT) { return true; // If directory didn't exist, this was successful. } - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Stat %s failed: %s", dir_name, strerror(errno)); + ICING_LOG(ERROR) << "Stat " << dir_name << " failed: " << strerror(errno); return false; } vector<std::string> entries; @@ -220,8 +210,7 @@ bool Filesystem::DeleteDirectoryRecursively(const char* dir_name) const { ++i) { std::string filename = std::string(dir_name) + '/' + *i; if (stat(filename.c_str(), &st) < 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Stat %s failed: %s", filename.c_str(), strerror(errno)); + ICING_LOG(ERROR) << "Stat " << filename << " failed: " << strerror(errno); success = false; } else if (S_ISDIR(st.st_mode)) { success = DeleteDirectoryRecursively(filename.c_str()) && success; @@ -244,8 +233,7 @@ bool Filesystem::FileExists(const char* file_name) const { exists = S_ISREG(st.st_mode) != 0; } else { if (errno != ENOENT) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Unable to stat file %s: %s", file_name, strerror(errno)); + ICING_LOG(ERROR) << "Unable to stat file " << file_name << ": " << strerror(errno); } exists = false; } @@ -259,8 +247,7 @@ bool Filesystem::DirectoryExists(const char* dir_name) const { exists = S_ISDIR(st.st_mode) != 0; } else { if (errno != ENOENT) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Unable to stat directory %s: %s", dir_name, strerror(errno)); + ICING_LOG(ERROR) << "Unable to stat directory " << dir_name << ": " << strerror(errno); } exists = false; } @@ -316,8 +303,7 @@ bool Filesystem::GetMatchingFiles(const char* glob, int basename_idx = GetBasenameIndex(glob); if (basename_idx == 0) { // We need a directory. - ICING_VLOG(1) << IcingStringUtil::StringPrintf( - "Expected directory, no matching files for: %s", glob); + ICING_VLOG(1) << "Expected directory, no matching files for: " << glob; return true; } const char* basename_glob = glob + basename_idx; @@ -372,8 +358,7 @@ int Filesystem::OpenForRead(const char* file_name) const { int64_t Filesystem::GetFileSize(int fd) const { struct stat st; if (fstat(fd, &st) < 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Unable to stat file: %s", - strerror(errno)); + ICING_LOG(ERROR) << "Unable to stat file: " << strerror(errno); return kBadFileSize; } return st.st_size; @@ -383,11 +368,9 @@ int64_t Filesystem::GetFileSize(const char* filename) const { struct stat st; if (stat(filename, &st) < 0) { if (errno == ENOENT) { - ICING_VLOG(1) << IcingStringUtil::StringPrintf( - "Unable to stat file %s: %s", filename, strerror(errno)); + ICING_VLOG(1) << "Unable to stat file " << filename << ": " << strerror(errno); } else { - ICING_LOG(WARNING) << IcingStringUtil::StringPrintf( - "Unable to stat file %s: %s", filename, strerror(errno)); + ICING_LOG(WARNING) << "Unable to stat file " << filename << ": " << strerror(errno); } return kBadFileSize; } @@ -396,8 +379,7 @@ int64_t Filesystem::GetFileSize(const char* filename) const { bool Filesystem::Truncate(int fd, int64_t new_size) const { if (ftruncate(fd, new_size) != 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Unable to truncate file: %s", strerror(errno)); + ICING_LOG(ERROR) << "Unable to truncate file: " << strerror(errno); return false; } lseek(fd, new_size, SEEK_SET); @@ -416,8 +398,7 @@ bool Filesystem::Truncate(const char* filename, int64_t new_size) const { bool Filesystem::Grow(int fd, int64_t new_size) const { if (ftruncate(fd, new_size) != 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Unable to grow file: %s", - strerror(errno)); + ICING_LOG(ERROR) << "Unable to grow file: " << strerror(errno); return false; } @@ -442,8 +423,7 @@ bool Filesystem::Write(int fd, const void* data, size_t data_size) const { size_t chunk_size = std::min<size_t>(write_len, 64u * 1024); ssize_t wrote = write(fd, data, chunk_size); if (wrote < 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Bad write: %s", - strerror(errno)); + ICING_LOG(ERROR) << "Bad write: " << strerror(errno); return false; } data = static_cast<const uint8_t*>(data) + wrote; @@ -521,8 +501,7 @@ bool Filesystem::CopyDirectory(const char* src_dir, const char* dst_dir, } } if (closedir(dir) != 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Error closing %s: %s", - src_dir, strerror(errno)); + ICING_LOG(ERROR) << "Error closing " << src_dir << ": " << strerror(errno); } return true; } @@ -535,8 +514,7 @@ bool Filesystem::PWrite(int fd, off_t offset, const void* data, size_t chunk_size = std::min<size_t>(write_len, 64u * 1024); ssize_t wrote = pwrite(fd, data, chunk_size, offset); if (wrote < 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Bad write: %s", - strerror(errno)); + ICING_LOG(ERROR) << "Bad write: " << strerror(errno); return false; } data = static_cast<const uint8_t*>(data) + wrote; @@ -561,8 +539,7 @@ bool Filesystem::PWrite(const char* filename, off_t offset, const void* data, bool Filesystem::Read(int fd, void* buf, size_t buf_size) const { ssize_t read_status = read(fd, buf, buf_size); if (read_status < 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Bad read: %s", - strerror(errno)); + ICING_LOG(ERROR) << "Bad read: " << strerror(errno); return false; } return true; @@ -582,8 +559,7 @@ bool Filesystem::Read(const char* filename, void* buf, size_t buf_size) const { bool Filesystem::PRead(int fd, void* buf, size_t buf_size, off_t offset) const { ssize_t read_status = pread(fd, buf, buf_size, offset); if (read_status < 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Bad read: %s", - strerror(errno)); + ICING_LOG(ERROR) << "Bad read: " << strerror(errno); return false; } return true; @@ -609,8 +585,7 @@ bool Filesystem::DataSync(int fd) const { #endif if (result < 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Unable to sync data: %s", - strerror(errno)); + ICING_LOG(ERROR) << "Unable to sync data: " << strerror(errno); return false; } return true; @@ -618,9 +593,7 @@ bool Filesystem::DataSync(int fd) const { bool Filesystem::RenameFile(const char* old_name, const char* new_name) const { if (rename(old_name, new_name) < 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Unable to rename file %s to %s: %s", old_name, new_name, - strerror(errno)); + ICING_LOG(ERROR) << "Unable to rename file " << old_name << " to " << new_name << ": " << strerror(errno); return false; } return true; @@ -658,8 +631,7 @@ bool Filesystem::CreateDirectory(const char* dir_name) const { if (mkdir(dir_name, S_IRUSR | S_IWUSR | S_IXUSR) == 0) { success = true; } else { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf( - "Creating directory %s failed: %s", dir_name, strerror(errno)); + ICING_LOG(ERROR) << "Creating directory " << dir_name << " failed: " << strerror(errno); } } return success; @@ -679,8 +651,7 @@ bool Filesystem::CreateDirectoryRecursively(const char* dir_name) const { int64_t Filesystem::GetDiskUsage(int fd) const { struct stat st; if (fstat(fd, &st) < 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Unable to stat file: %s", - strerror(errno)); + ICING_LOG(ERROR) << "Unable to stat file: " << strerror(errno); return kBadFileSize; } return st.st_blocks * kStatBlockSize; @@ -689,8 +660,7 @@ int64_t Filesystem::GetDiskUsage(int fd) const { int64_t Filesystem::GetFileDiskUsage(const char* path) const { struct stat st; if (stat(path, &st) != 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Unable to stat %s: %s", - path, strerror(errno)); + ICING_LOG(ERROR) << "Unable to stat " << path << ": " << strerror(errno); return kBadFileSize; } return st.st_blocks * kStatBlockSize; @@ -699,8 +669,7 @@ int64_t Filesystem::GetFileDiskUsage(const char* path) const { int64_t Filesystem::GetDiskUsage(const char* path) const { struct stat st; if (stat(path, &st) != 0) { - ICING_LOG(ERROR) << IcingStringUtil::StringPrintf("Unable to stat %s: %s", - path, strerror(errno)); + ICING_LOG(ERROR) << "Unable to stat " << path << ": " << strerror(errno); return kBadFileSize; } int64_t result = st.st_blocks * kStatBlockSize; |