@@ -220,6 +220,19 @@ impl HostScanner {
220220 Ok ( ( ) )
221221 }
222222
223+ /// Handle unlink events by removing the inode from the inode->path map.
224+ ///
225+ /// The probe already cleared the kernel inode map.
226+ fn handle_unlink_event ( & self , event : & Event ) {
227+ let inode = event. get_inode ( ) ;
228+
229+ if self . inode_map . borrow_mut ( ) . remove ( inode) . is_some ( ) {
230+ self . metrics . scan_inc ( ScanLabels :: InodeRemoved ) ;
231+ }
232+
233+ self . metrics . scan_inc ( ScanLabels :: FileRemoved ) ;
234+ }
235+
223236 /// Periodically notify the host scanner main task that a scan needs
224237 /// to happen.
225238 ///
@@ -246,8 +259,14 @@ impl HostScanner {
246259 }
247260
248261 pub fn start ( mut self ) -> JoinHandle < anyhow:: Result < ( ) > > {
262+ let scan_interval_value = * self . scan_interval . borrow ( ) ;
249263 let scan_trigger = Arc :: new ( Notify :: new ( ) ) ;
250- self . start_scan_notifier ( scan_trigger. clone ( ) ) ;
264+
265+ if scan_interval_value. is_zero ( ) {
266+ warn ! ( "Host scanner periodic scans permanently disabled (scan_interval is 0)" ) ;
267+ } else {
268+ self . start_scan_notifier ( scan_trigger. clone ( ) ) ;
269+ }
251270
252271 tokio:: spawn ( async move {
253272 info ! ( "Starting host scanner..." ) ;
@@ -277,6 +296,11 @@ impl HostScanner {
277296 event. set_old_host_path( host_path) ;
278297 }
279298
299+ // Remove inode from the map
300+ if event. is_unlink( ) {
301+ self . handle_unlink_event( & event) ;
302+ }
303+
280304 let event = Arc :: new( event) ;
281305 if let Err ( e) = self . tx. send( event) {
282306 self . metrics. events. dropped( ) ;
0 commit comments