Skip to content

Commit

Permalink
report file changes on fresh instance
Browse files Browse the repository at this point in the history
Summary: Actual fix of the bug. Watchman checks `disable_watchman_empty_on_fresh_instance` config setting, but it's rolled out 100%, so report changes in edenfs unconditionally.

Reviewed By: jdelliot

Differential Revision: D69791442

fbshipit-source-id: 951a5a069f41e06b9f6a6363f43abdb4811a94d2
  • Loading branch information
Yury Samkevich authored and facebook-github-bot committed Feb 18, 2025
1 parent 6403a89 commit 108d489
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 11 deletions.
27 changes: 18 additions & 9 deletions app/buck2_file_watcher/src/edenfs/interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -542,28 +542,37 @@ impl EdenFsFileWatcher {
let dice = dice.unstable_take();

// Get mergebase state
let last_mergebase = self.last_mergebase.read().await.clone();
let mergebase = self.mergebase.read().await.clone();
let branched_from_revision_timestamp = mergebase.as_ref().map(|m| m.timestamp);
let branched_from_global_rev = mergebase.as_ref().and_then(|m| m.global_rev);
let last_mergebase_info = self.last_mergebase.read().await.clone();
let mergebase_info = self.mergebase.read().await.clone();
let mergebase = mergebase_info.as_ref().map(|m| m.mergebase.clone());
let branched_from_revision_timestamp = mergebase_info.as_ref().map(|m| m.timestamp);
let branched_from_global_rev = mergebase_info.as_ref().and_then(|m| m.global_rev);

let mut base_stats = buck2_data::FileWatcherStats {
fresh_instance: true,
branched_from_revision: mergebase.as_ref().map(|m| m.mergebase.clone()),
branched_from_revision: mergebase.clone(),
branched_from_global_rev,
branched_from_revision_timestamp,
watchman_version: None,
fresh_instance_data: Some(buck2_data::FreshInstance {
new_mergebase: last_mergebase.is_none() || last_mergebase != mergebase,
new_mergebase: last_mergebase_info.is_none()
|| last_mergebase_info != mergebase_info,
cleared_dice: true,
cleared_dep_files: true,
}),
..Default::default()
};

base_stats.incomplete_events_reason = Some("Large or Unknown change".to_owned());

Ok((FileWatcherStats::new(base_stats, 0), dice))
if let Some(mergebase) = mergebase {
let mut tracker = FileChangeTracker::new();
let mut stats = FileWatcherStats::new(base_stats, 0);
self.process_sapling_status(&mut tracker, &mut stats, mergebase, None)
.await?;
Ok((stats, dice))
} else {
base_stats.incomplete_events_reason = Some("Large or Unknown change".to_owned());
Ok((FileWatcherStats::new(base_stats, 0), dice))
}
}

// Compute and update the mergebase.
Expand Down
17 changes: 15 additions & 2 deletions tests/core/io/test_edenfs.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,13 @@
import subprocess

from buck2.tests.core.common.io.file_watcher import (
FileWatcherEvent,
FileWatcherEventType,
FileWatcherKind,
FileWatcherProvider,
get_file_watcher_events,
)

from buck2.tests.core.common.io.file_watcher_dir_tests import (
run_create_directory_test,
run_remove_directory_test,
Expand All @@ -35,6 +39,7 @@
from buck2.tests.core.common.io.file_watcher_tests import (
FileSystemType,
setup_file_watcher_test,
verify_results,
)

from buck2.tests.e2e_util.api.buck import Buck
Expand Down Expand Up @@ -164,7 +169,15 @@ async def test_edenfs_files_report_on_fresh_instance(buck: Buck) -> None:
await setup_file_watcher_scm_test(buck)
await buck.kill()

required = [
FileWatcherEvent(
FileWatcherEventType.CREATE, FileWatcherKind.FILE, "root//files/ghi"
),
FileWatcherEvent(
FileWatcherEventType.CREATE, FileWatcherKind.FILE, "root//files/jkl"
),
]

is_fresh_instance, results = await get_file_watcher_events(buck)
assert is_fresh_instance
# this is a bug, we should report file changes
assert results == []
verify_results(results, required)

0 comments on commit 108d489

Please sign in to comment.