Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sync dev to main for v1.0.4-rc2 #1747

Merged
merged 39 commits into from
Nov 29, 2024
Merged
Changes from 1 commit
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
a5b704c
feat: add file watcher service
namchuai Nov 19, 2024
339459e
some improvement
namchuai Nov 19, 2024
bb69b4e
fix: windows
namchuai Nov 19, 2024
33fea02
fix: linux
namchuai Nov 19, 2024
32cc072
fix: linux
namchuai Nov 19, 2024
b8210a9
Merge branch 'dev' into j/add-file-watcher
namchuai Nov 19, 2024
f253c0b
update
namchuai Nov 20, 2024
53e2d51
fix build
namchuai Nov 20, 2024
f4e6e50
fix build windows
namchuai Nov 20, 2024
63e6a29
fix ci
namchuai Nov 20, 2024
a1a7ce2
update
namchuai Nov 20, 2024
8c4b046
fix linux
namchuai Nov 20, 2024
e77d439
fix windows
namchuai Nov 20, 2024
afe556d
Merge pull request #1705 from janhq/j/add-file-watcher
namchuai Nov 21, 2024
26761a8
chore: update engine API
namchuai Nov 18, 2024
16e7c00
Merge pull request #1698 from janhq/j/update-engine-api
namchuai Nov 22, 2024
8db7e9c
fix: set progress bar width base on terminal width (#1713)
vansangpfiev Nov 22, 2024
64d99d8
Fix the model in the API example
grzegorz-bielski Nov 24, 2024
adfbda1
feat: data migration (#1692)
vansangpfiev Nov 25, 2024
c507569
Merge branch 'dev' into patch-1
gabrielle-ong Nov 25, 2024
aa51b45
chore: docker e2e testing run on selfhosted runner (#1709)
hiento09 Nov 25, 2024
87aab7e
Merge branch 'dev' into patch-1
gabrielle-ong Nov 25, 2024
87b59d4
Merge pull request #1718 from grzegorz-bielski/patch-1
gabrielle-ong Nov 25, 2024
99a7b04
chore: update the star history chart to correctly represent
paopa Nov 25, 2024
ad5ecc1
fix: manually add http date header for windows (#1721)
vansangpfiev Nov 26, 2024
89291b6
Merge branch 'dev' into chore/update-star-history
gabrielle-ong Nov 26, 2024
70167c0
fix: (#4091) model size not displaying
namchuai Nov 26, 2024
f2a30ff
fix: docker nightly build failed (#1727)
hiento09 Nov 26, 2024
e290759
Merge pull request #1725 from janhq/j/fix-model-size
namchuai Nov 26, 2024
e7ad487
Merge branch 'dev' into chore/update-star-history
gabrielle-ong Nov 27, 2024
a4093b5
Merge pull request #1723 from paopa/chore/update-star-history
gabrielle-ong Nov 27, 2024
146e2b6
fix: event listener not work on macos
namchuai Nov 27, 2024
7dd43fb
Merge pull request #1733 from janhq/j/fix-event-listener-macos
namchuai Nov 28, 2024
7b93a71
fix: rounding float
namchuai Nov 28, 2024
43dab3b
Merge pull request #1743 from janhq/j/fix-rounding-float
namchuai Nov 28, 2024
719de33
fix: support path with special characters on windows (#1730)
vansangpfiev Nov 28, 2024
095146a
fix: CLI engine use
namchuai Nov 28, 2024
0cec2fe
Merge pull request #1746 from janhq/fix/cli-engine-use
namchuai Nov 29, 2024
9622b91
Feat cortexcpp e2e cortexllamacpp nightly (#1744)
hiento09 Nov 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions engine/cli/commands/engine_install_cmd.cc
Original file line number Diff line number Diff line change
@@ -183,8 +183,6 @@ bool EngineInstallCmd::Exec(const std::string& engine,
return false;
}

CLI_LOG("Validating download items, please wait..")

if (!dp_res.get())
return false;

2 changes: 0 additions & 2 deletions engine/cli/commands/model_pull_cmd.cc
Original file line number Diff line number Diff line change
@@ -96,8 +96,6 @@ std::optional<std::string> ModelPullCmd::Exec(const std::string& host, int port,

CTL_INF("model: " << model << ", model_id: " << model_id);

// Send request download model to server
CLI_LOG("Validating download items, please wait..")
Json::Value json_data;
json_data["model"] = model;
auto data_str = json_data.toStyledString();
81 changes: 50 additions & 31 deletions engine/services/file_watcher_service.h
Original file line number Diff line number Diff line change
@@ -22,10 +22,12 @@
class FileWatcherService {
private:
#if defined(_WIN32)
HANDLE dirHandle;
HANDLE dir_handle;
#elif defined(__APPLE__)
FSEventStreamRef event_stream;
#else // Linux
int fd;
int wd;
std::unordered_map<int, std::string> watchDescriptors;
#endif

@@ -52,11 +54,11 @@ class FileWatcherService {

void stop() {
#ifdef _WIN32
CloseHandle(dirHandle);
CloseHandle(dir_handle);
#endif

#ifdef Linux
cleanupWatches();
CleanupWatches();
#endif
running = false;
if (watchThread.joinable()) {
@@ -121,49 +123,66 @@ class FileWatcherService {

#elif defined(_WIN32)
void watcherThread() {
dirHandle = CreateFileA(
path.c_str(), FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
dir_handle =
CreateFileA(watchPath.c_str(), FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);

if (dirHandle == INVALID_HANDLE_VALUE) {
if (dir_handle == INVALID_HANDLE_VALUE) {
throw std::runtime_error("Failed to open directory");
}

char buffer[4096];
DWORD bytesReturned;
OVERLAPPED overlapped = {0};
overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
DWORD bytesReturned;

while (running) {
if (ReadDirectoryChangesW(
dirHandle, buffer, sizeof(buffer),
TRUE, // Watch subtree
if (!ReadDirectoryChangesW(
dir_handle, buffer, sizeof(buffer), TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME,
&bytesReturned, &overlapped, NULL)) {
FILE_NOTIFY_INFORMATION* event = (FILE_NOTIFY_INFORMATION*)buffer;
do {
if (event->Action == FILE_ACTION_REMOVED) {
wchar_t fileName[MAX_PATH];
wcsncpy_s(fileName, event->FileName,
event->FileNameLength / sizeof(wchar_t));
fileName[event->FileNameLength / sizeof(wchar_t)] = '\0';
std::wcout << L"Deleted: " << fileName << std::endl;
break;
}

if (WaitForSingleObject(overlapped.hEvent, INFINITE) != WAIT_OBJECT_0) {
break;
}

if (!GetOverlappedResult(dir_handle, &overlapped, &bytesReturned,
FALSE)) {
break;
}

FILE_NOTIFY_INFORMATION* event = (FILE_NOTIFY_INFORMATION*)buffer;
do {
if (event->Action == FILE_ACTION_REMOVED) {
std::wstring fileName(event->FileName,
event->FileNameLength / sizeof(wchar_t));

std::string file_name_str(fileName.begin(), fileName.end());
if (file_name_str.find(".yaml") != std::string::npos ||
file_name_str.find(".yml") != std::string::npos) {
model_service_->ForceIndexingModelList();
}
}

if (event->NextEntryOffset == 0) {
break;
}
event = (FILE_NOTIFY_INFORMATION*)((uint8_t*)event +
event->NextEntryOffset);
} while (true);
}
if (event->NextEntryOffset == 0)
break;
event = (FILE_NOTIFY_INFORMATION*)((uint8_t*)event +
event->NextEntryOffset);
} while (true);

ResetEvent(overlapped.hEvent);
}

CloseHandle(overlapped.hEvent);
CloseHandle(dir_handle);
}

#else // Linux

void addWatch(const std::string& dirPath) {
void AddWatch(const std::string& dirPath) {
wd = inotify_add_watch(fd, dirPath.c_str(),
IN_DELETE | IN_CREATE | IN_DELETE_SELF);
if (wd < 0) {
@@ -175,12 +194,12 @@ class FileWatcherService {
for (const auto& entry :
std::filesystem::recursive_directory_iterator(dirPath)) {
if (std::filesystem::is_directory(entry)) {
addWatch(entry.path().string());
AddWatch(entry.path().string());
}
}
}

void cleanupWatches() {
void CleanupWatches() {
for (const auto& [wd, path] : watchDescriptors) {
inotify_rm_watch(fd, wd);
}
@@ -199,7 +218,7 @@ class FileWatcherService {
}

// Add initial watch on the main directory
addWatch(path);
AddWatch(path);

char buffer[4096];
while (running) {
9 changes: 1 addition & 8 deletions engine/services/model_service.cc
Original file line number Diff line number Diff line change
@@ -116,7 +116,6 @@ cpp::result<DownloadTask, std::string> GetDownloadTask(
void ModelService::ForceIndexingModelList() {
CTL_INF("Force indexing model list");

// bad code, refactor later on
cortex::db::Models modellist_handler;
config::YamlHandler yaml_handler;

@@ -140,16 +139,10 @@ void ModelService::ForceIndexingModelList() {
Json::Value obj = model_config.ToJson();
yaml_handler.Reset();
} catch (const std::exception& e) {
LOG_ERROR << "Failed to load yaml file for model: "
<< model_entry.path_to_model_yaml << ", error: " << e.what();
// remove in db
auto remove_result =
modellist_handler.DeleteModelEntry(model_entry.model);
if (remove_result.has_error()) {
LOG_ERROR << "Failed to remove model in db: " << remove_result.error();
} else {
LOG_INFO << "Removed model in db: " << model_entry.model;
}
// silently ignore result
}
}
}