diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6b5591647..92ab4f59c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,6 @@ name: CI -# Controls when the workflow will run +# Controls when the workflow will run. on: push: branches: [ master ] @@ -9,7 +9,7 @@ on: jobs: unit-test: - # The type of runner that the job will run on + # The type of runner that the job will run on. runs-on: ubuntu-22.04 strategy: matrix: @@ -66,3 +66,34 @@ jobs: - name: Run tests run: ./run_integration_tests.sh + + asan-tests: + # The type of runner that the job will run on. + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3.5.3 + with: + fetch-depth: 0 + + - uses: docker/setup-buildx-action@v2 + - uses: docker/build-push-action@v4 + with: + context: . + file: ./deployment-examples/docker-compose/Dockerfile + build-args: | + ADDITIONAL_BAZEL_FLAGS=--config=asan + target: builder-externals-built + load: true # This brings the build into `docker images` from buildx. + tags: allada/turbo-cache:asan-test + cache-from: type=gha,scope=main + cache-to: type=gha,scope=main,mode=max + + - name: Bazel test + run: | + docker run \ + --rm \ + -e CC=clang \ + -v $PWD:/root/turbo-cache allada/turbo-cache:asan-test \ + bazel test \ + --config=asan \ + //... diff --git a/cas/store/default_store_factory.rs b/cas/store/default_store_factory.rs index 1bf9e1d6b..993157ddd 100644 --- a/cas/store/default_store_factory.rs +++ b/cas/store/default_store_factory.rs @@ -56,7 +56,7 @@ pub fn store_factory<'a>(backend: &'a StoreConfig, store_manager: &'a Arc Arc::new(::new(config).await?), - StoreConfig::ref_store(config) => Arc::new(RefStore::new(config, store_manager.clone())), + StoreConfig::ref_store(config) => Arc::new(RefStore::new(config, Arc::downgrade(store_manager))), StoreConfig::size_partitioning(config) => Arc::new(SizePartitioningStore::new( config, store_factory(&config.lower_store, store_manager).await?, diff --git a/cas/store/ref_store.rs b/cas/store/ref_store.rs index a8eda103f..d34a6eef5 100644 --- a/cas/store/ref_store.rs +++ b/cas/store/ref_store.rs @@ -14,10 +14,10 @@ use std::cell::UnsafeCell; use std::pin::Pin; -use std::sync::Arc; -use std::sync::Mutex; +use std::sync::{Arc, Mutex, Weak}; use async_trait::async_trait; +use error::ResultExt; use buf_channel::{DropCloserReadHalf, DropCloserWriteHalf}; use common::DigestInfo; @@ -37,12 +37,12 @@ unsafe impl Sync for StoreReference {} pub struct RefStore { ref_store_name: String, - store_manager: Arc, + store_manager: Weak, ref_store: StoreReference, } impl RefStore { - pub fn new(config: &config::stores::RefStore, store_manager: Arc) -> Self { + pub fn new(config: &config::stores::RefStore, store_manager: Weak) -> Self { RefStore { ref_store_name: config.name.clone(), store_manager, @@ -75,7 +75,8 @@ impl RefStore { .mux .lock() .map_err(|e| make_err!(Code::Internal, "Failed to lock mutex in ref_store : {:?}", e))?; - if let Some(store) = self.store_manager.get_store(&self.ref_store_name) { + let store_manager = self.store_manager.upgrade().err_tip(|| "Store manager is gone")?; + if let Some(store) = store_manager.get_store(&self.ref_store_name) { unsafe { *ref_store = Some(store.clone()); return Ok((*ref_store).as_ref().unwrap()); diff --git a/cas/store/tests/ref_store_test.rs b/cas/store/tests/ref_store_test.rs index fd64c9995..dd5726780 100644 --- a/cas/store/tests/ref_store_test.rs +++ b/cas/store/tests/ref_store_test.rs @@ -29,7 +29,7 @@ mod ref_store_tests { const VALID_HASH1: &str = "0123456789abcdef000000000000000000010000000000000123456789abcdef"; - fn setup_stores() -> (Arc, Arc) { + fn setup_stores() -> (Arc, Arc, Arc) { let store_manager = Arc::new(StoreManager::new()); let memory_store_owned = Arc::new(MemoryStore::new(&config::stores::MemoryStore::default())); @@ -39,15 +39,15 @@ mod ref_store_tests { &config::stores::RefStore { name: "foo".to_string(), }, - store_manager.clone(), + Arc::downgrade(&store_manager), )); store_manager.add_store("bar", ref_store_owned.clone()); - (memory_store_owned, ref_store_owned) + (store_manager, memory_store_owned, ref_store_owned) } #[tokio::test] async fn has_test() -> Result<(), Error> { - let (memory_store_owned, ref_store_owned) = setup_stores(); + let (_store_manager, memory_store_owned, ref_store_owned) = setup_stores(); const VALUE1: &str = "13"; { @@ -73,7 +73,7 @@ mod ref_store_tests { #[tokio::test] async fn get_test() -> Result<(), Error> { - let (memory_store_owned, ref_store_owned) = setup_stores(); + let (_store_manager, memory_store_owned, ref_store_owned) = setup_stores(); const VALUE1: &str = "13"; { @@ -100,7 +100,7 @@ mod ref_store_tests { #[tokio::test] async fn update_test() -> Result<(), Error> { - let (memory_store_owned, ref_store_owned) = setup_stores(); + let (_store_manager, memory_store_owned, ref_store_owned) = setup_stores(); const VALUE1: &str = "13"; { diff --git a/deployment-examples/docker-compose/Dockerfile b/deployment-examples/docker-compose/Dockerfile index 5fcd6dbea..a277245b0 100644 --- a/deployment-examples/docker-compose/Dockerfile +++ b/deployment-examples/docker-compose/Dockerfile @@ -18,6 +18,8 @@ ARG OS_VERSION=22.04 ARG OPT_LEVEL=opt # Compiler to use. ARG CC=clang +# Additional bazel flags. +ARG ADDITIONAL_BAZEL_FLAGS= # Builder that contains the OS dependencies. @@ -90,17 +92,19 @@ FROM builder-with-externals as builder-externals-built WORKDIR /root/turbo-cache ARG OPT_LEVEL ARG CC +ARG ADDITIONAL_BAZEL_FLAGS COPY proto/ proto/ COPY --from=builder-external-deps /root/external-targets.txt /root/external-targets.txt -RUN bazel build -c ${OPT_LEVEL} --target_pattern_file=/root/external-targets.txt +RUN bazel build -c ${OPT_LEVEL} ${ADDITIONAL_BAZEL_FLAGS} --target_pattern_file=/root/external-targets.txt # Builder to do the remaining build. At this point most of our externals should be built. FROM builder-externals-built as builder ARG OPT_LEVEL ARG CC +ARG ADDITIONAL_BAZEL_FLAGS COPY . . -RUN bazel build -c ${OPT_LEVEL} //cas && \ +RUN bazel build -c ${OPT_LEVEL} ${ADDITIONAL_BAZEL_FLAGS} //cas && \ cp ./bazel-bin/cas/cas /root/turbo-cache-bin