pub struct IndexManager { /* private fields */ }Expand description
Index manager that handles index lifecycle and file watching.
Provides two-phase initialization:
new()- Load or refresh index at startupstart_file_watcher()- Start background file watching
Implementations§
Source§impl IndexManager
impl IndexManager
Sourcepub async fn new<P: AsRef<Path>>(
codebase_path: P,
stores: Arc<SharedStores>,
) -> Result<Self>
pub async fn new<P: AsRef<Path>>( codebase_path: P, stores: Arc<SharedStores>, ) -> Result<Self>
Create a new index manager with shared stores.
This is the first method call - should be called at server startup.
§Arguments
codebase_path- Path to the codebase to indexstores- Shared stores for concurrent access (created by caller)
§Returns
Result<Self>- Index manager instance or error
§Behavior
- Checks if index exists and is up-to-date
- ERROR if index doesn’t exist - user must run
codesearch index addfirst - If index exists, performs incremental refresh
- Logs all operations with detailed info
§Errors
- Returns error if index doesn’t exist (user must create index first)
Sourcepub fn stores(&self) -> Arc<SharedStores>
pub fn stores(&self) -> Arc<SharedStores>
Get a reference to the shared stores (for CodesearchService)
Sourcepub async fn new_without_refresh<P: AsRef<Path>>(
codebase_path: P,
stores: Arc<SharedStores>,
) -> Result<Self>
pub async fn new_without_refresh<P: AsRef<Path>>( codebase_path: P, stores: Arc<SharedStores>, ) -> Result<Self>
Create a new index manager WITHOUT performing incremental refresh.
Use this when the caller has already performed the refresh (e.g., MCP server). This avoids FTS lock conflicts by allowing the caller to control when the refresh happens relative to SharedStores creation.
§Arguments
codebase_path- Path to the codebase to indexstores- Shared stores for concurrent access (created by caller)
Sourcepub async fn perform_incremental_refresh_with_stores(
codebase_path: &Path,
db_path: &Path,
stores: &SharedStores,
) -> Result<()>
pub async fn perform_incremental_refresh_with_stores( codebase_path: &Path, db_path: &Path, stores: &SharedStores, ) -> Result<()>
Perform incremental refresh using shared stores.
This checks for changed/deleted files since last index and updates the index accordingly. Uses the shared stores to avoid lock conflicts.
Sourcepub async fn start_watching(&self) -> Result<()>
pub async fn start_watching(&self) -> Result<()>
Start the file system watcher (begin collecting events) without starting the processing loop.
Call this BEFORE a long-running operation (like incremental refresh) to capture
file changes that happen during that operation. Then call start_file_watcher()
afterwards to begin processing the buffered events.
Sourcepub async fn start_file_watcher(
&self,
cancel_token: CancellationToken,
) -> Result<()>
pub async fn start_file_watcher( &self, cancel_token: CancellationToken, ) -> Result<()>
Start the background file watcher.
This is the second method call - should be called after new().
Spawns a background task that watches for file changes and refreshes the index.
§Arguments
cancel_token- Cancellation token for graceful shutdown
§Returns
Result<()>- Success or error
§Behavior
- Spawns a detached background task
- Watches for file modifications, deletions, and renames
- Batches events to avoid overhead with rapid changes
- Flushes batch when no new events for FSW_BATCH_FLUSH_MS
- Logs all file system events and refresh operations
- Continues running even if individual refresh operations fail
- Stops gracefully when the cancellation token is cancelled
Auto Trait Implementations§
impl Freeze for IndexManager
impl !RefUnwindSafe for IndexManager
impl Send for IndexManager
impl Sync for IndexManager
impl Unpin for IndexManager
impl UnsafeUnpin for IndexManager
impl !UnwindSafe for IndexManager
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more