Skip to content
Snippets Groups Projects
Commit a36ac10c authored by Sergey Yakubov's avatar Sergey Yakubov
Browse files

use buffer not to send files twice after directory creation

parent 63de426b
Branches
Tags
No related merge requests found
#include "system_folder_watch_linux.h"
#include <algorithm>
#include "event_monitor_error.h"
#include "eventmon_logger.h"
......@@ -94,7 +95,11 @@ Error SystemFolderWatch::ProcessFileEvent(const InotifyEvent& event, FilesToSend
return err;
}
GetDefaultEventMonLogger()->Debug(((event.GetMask() & IN_CLOSE_WRITE) ? "file closed: " : "file moved: ") + fname);
processed_filenames_[processed_filenames_counter_] = fname;
processed_filenames_counter_++;
if (processed_filenames_counter_ == kProcessedFilenamesBufLen) {
processed_filenames_counter_ = 0;
}
files->emplace_back(std::move(fname));
return nullptr;
}
......@@ -109,8 +114,13 @@ Error SystemFolderWatch::AddExistingFilesToEvents(const std::string& full_path,
}
for (auto& file : files) {
std::string fname = rel_path + kPathSeparator + std::move(file.name);
file_events->emplace_back(fname);
GetDefaultEventMonLogger()->Warning("manually added file to events, double send possible : " + fname);
if ( std::none_of(processed_filenames_.begin(), processed_filenames_.end(),
[&fname](const std::string & processed) {
return fname == processed;
})) {
file_events->emplace_back(fname);
GetDefaultEventMonLogger()->Debug("manually added file to events: " + fname);
}
}
return nullptr;
......@@ -233,7 +243,8 @@ FilesToSend SystemFolderWatch::GetFileList(Error* err) {
return events;
}
SystemFolderWatch::SystemFolderWatch() : io__{GenerateDefaultIO()}, inotify__{new Inotify()}, buffer_{new char[kBufLen]} {
SystemFolderWatch::SystemFolderWatch() : io__{GenerateDefaultIO()}, inotify__{new Inotify()}, buffer_{new char[kBufLen]},
processed_filenames_(kProcessedFilenamesBufLen, "") {
}
}
\ No newline at end of file
......@@ -57,6 +57,9 @@ class SystemFolderWatch {
std::map<int, std::string> watched_folders_paths_;
int watch_fd_ = -1;
std::string root_folder_;
const uint64_t kProcessedFilenamesBufLen = 1000;
std::vector<std::string> processed_filenames_;
uint64_t processed_filenames_counter_ = 0;
};
bool DirectoryEvent(const InotifyEvent& event);
......
......@@ -341,5 +341,25 @@ TEST_F(SystemFolderWatchTests, ProcessMoveFolder) {
ASSERT_THAT(err, Eq(nullptr));
}
TEST_F(SystemFolderWatchTests, ProcessCreateFolderWithFilesInItWhenFileWasAlreadyNoticed) {
MockStartMonitoring();
AddEventToBuffer("folder/file1", IN_CLOSE_WRITE, expected_fds[0]);
AddEventToBuffer("folder", IN_ISDIR | IN_CREATE, expected_fds[0]);
ExpectRead();
ExpectCreateFolder("folder", true);
Error err;
auto events = watch.GetFileList(&err);
ASSERT_THAT(events.size(), Eq(2));
ASSERT_THAT(events[0].c_str(), StrEq("test1/folder/file1"));
ASSERT_THAT(events[1].c_str(), StrEq("test1/folder/subfolder/file2"));
ASSERT_THAT(err, Eq(nullptr));
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment