[PATCH] D87450: [clangd] Implement hot index reloading for clangd-index-server

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 11 02:22:50 PDT 2020


kadircet added inline comments.


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:71
 
 std::unique_ptr<clangd::SymbolIndex> openIndex(llvm::StringRef Index) {
   return loadIndex(Index, /*UseIndex=*/true);
----------------
why do we have this extra indirection?


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:86
 
+  clangd::SwapIndex *Index;
+
----------------
why not make this private? also keep using `SymbolIndex`. also you can make this a reference now.


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:224
+// whenever they become available.
+void hotReload(clangd::SwapIndex **Index, llvm::StringRef IndexPath) {
+  llvm::sys::TimePoint<> LastModificationTime =
----------------
why is this taking a double pointer? I think you can just use a reference here for `Index` (i.e. `clangd::SwapIndex &`


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:226
+  llvm::sys::TimePoint<> LastModificationTime =
+      std::chrono::system_clock::now();
+  for (;; std::this_thread::sleep_for(std::chrono::seconds(90))) {
----------------
i think we should rather store the file_status from the original file in here. as we want to reload whenever files size/modification_time has changed.
it doesn't have to be moving forward let alone share the same timezone restrictions and such provided by system_clock::now.

Also it would be nice to use a VFS in here, that way we can move this logic into a helper in the future if other components need similar logic.


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:227
+      std::chrono::system_clock::now();
+  for (;; std::this_thread::sleep_for(std::chrono::seconds(90))) {
+    llvm::sys::fs::file_status Status;
----------------
how's this loop terminated?

I would suggest factoring the loop body into a helper and then having a lambda for periodically running it, while looking for an exit signal.


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:263
 
+  std::thread HotReloadThread(hotReload, &Service.Index, IndexPath);
+
----------------
i think `hotReload` thread creation should also be part of the main.


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:266
   Server->Wait();
 }
 
----------------
you either need to `join` a thread before its destruction or `detach` it from the main thread.


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:313
 
-  std::unique_ptr<clang::clangd::SymbolIndex> Index = openIndex(IndexPath);
+  std::unique_ptr<clang::clangd::SwapIndex> Index(
+      new clang::clangd::SwapIndex(openIndex(IndexPath)));
----------------
nit: `auto Index = std::make_unique<clang::clangd::SwapIndex>(openIndex...);`


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87450/new/

https://reviews.llvm.org/D87450



More information about the cfe-commits mailing list