diff --git a/.github/workflows/nix.yaml b/.github/workflows/nix.yaml index 212befa5fe..3b1211474c 100644 --- a/.github/workflows/nix.yaml +++ b/.github/workflows/nix.yaml @@ -134,4 +134,5 @@ jobs: - name: Test nix run run: | + nix run -L .#nativelink-prevent-store-conflict-test nix run -L .#nativelink-is-executable-test diff --git a/flake.nix b/flake.nix index 81a7baaa16..9ac3b92b87 100644 --- a/flake.nix +++ b/flake.nix @@ -133,6 +133,8 @@ local-image-test = pkgs.callPackage ./tools/local-image-test.nix {}; + nativelink-prevent-store-conflict-test = pkgs.callPackage ./tools/nativelink-prevent-store-conflict-test.nix {inherit nativelink;}; + nativelink-is-executable-test = pkgs.callPackage ./tools/nativelink-is-executable-test.nix {inherit nativelink;}; rbe-configs-gen = pkgs.callPackage ./local-remote-execution/rbe-configs-gen.nix {}; @@ -251,7 +253,7 @@ }; }; packages = rec { - inherit publish-ghcr local-image-test nativelink-is-executable-test nativelink nativelink-debug native-cli lre-cc nativelink-worker-init; + inherit publish-ghcr local-image-test nativelink-prevent-store-conflict-test nativelink-is-executable-test nativelink nativelink-debug native-cli lre-cc nativelink-worker-init; default = nativelink; rbe-autogen-lre-cc = rbe-autogen lre-cc; diff --git a/src/bin/nativelink.rs b/src/bin/nativelink.rs index 21f1b073f0..e3bf624396 100644 --- a/src/bin/nativelink.rs +++ b/src/bin/nativelink.rs @@ -243,6 +243,23 @@ async fn inner_main( // Currently we only support http as our socket type. let ListenerConfig::http(http_config) = server_cfg.listener; + // Check if CAS and AC use the same store. + if let Some(cas_config) = &services.cas { + if let Some(ac_config) = &services.ac { + for (instance_name, cas_store_config) in cas_config { + if let Some(ac_store_config) = ac_config.get(instance_name) { + if cas_store_config.cas_store == ac_store_config.ac_store { + return Err(make_err!( + Code::InvalidArgument, + "CAS and AC cannot use the same store '{}' in the config", + cas_store_config.cas_store + ))?; + } + } + } + } + } + let tonic_services = TonicServer::builder() .add_optional_service( services diff --git a/tools/nativelink-prevent-store-conflict-test.nix b/tools/nativelink-prevent-store-conflict-test.nix new file mode 100644 index 0000000000..4306722678 --- /dev/null +++ b/tools/nativelink-prevent-store-conflict-test.nix @@ -0,0 +1,72 @@ +{ + nativelink, + writeShellScriptBin, +}: +writeShellScriptBin "prevent-store-conflict-test" '' + set -xuo pipefail + + cat > store_conflict_test.json <&2 + exit 1 + fi +''