@@ -676,6 +676,44 @@ TEST(CachePool, random_evict_file) {
676676 if (cacheStore) cacheStore->release ();
677677}
678678
679+ TEST (CachePool, open_same_file) {
680+ std::string root = " /tmp/ease/cache/open_same_file/" ;
681+ SetupTestDir (root);
682+ auto mediaFs = new_localfs_adaptor (root.c_str (), ioengine_libaio);
683+ auto alignFs = new_aligned_fs_adaptor (mediaFs, 4 * 1024 , true , true );
684+ auto cacheAllocator = new AlignedAlloc (4 * 1024 );
685+ auto roCachedFs = new_full_file_cached_fs (nullptr , alignFs, 1024 * 1024 ,
686+ 1 , 1000 * 1000 * 1 , 128ul * 1024 * 1024 , cacheAllocator, 0 );
687+ auto cachePool = roCachedFs->get_pool ();
688+ DEFER ({ delete cacheAllocator; delete roCachedFs; });
689+
690+ auto fileName = " /testDir/testfile" ;
691+
692+ uint64_t written = 0 ;
693+ for (int j = 0 ; j < 5 ; j++) {
694+ std::vector<ICacheStore*> cacheStores;
695+ for (int i = 0 ; i < 10 ; i++) {
696+ cacheStores.push_back (cachePool->open (fileName, O_CREAT | O_RDWR, 0644 ));
697+ ASSERT_NE (nullptr , cacheStores.back ());
698+ }
699+
700+ const size_t bufSize = 1024 * 1024 ;
701+ IOVector buffer (*cacheAllocator);
702+ buffer.push_back (bufSize);
703+
704+ for (auto cacheStore : cacheStores) {
705+ if (rand () % 2 == 0 ) {
706+ cacheStore->release ();
707+ } else {
708+ auto ret = cacheStore->do_pwritev2 (buffer.iovec (), buffer.iovcnt (), written, 0 );
709+ EXPECT_EQ (ret, (ssize_t )bufSize);
710+ written += ret;
711+ cacheStore->release ();
712+ }
713+ }
714+ }
715+ }
716+
679717}
680718}
681719int main (int argc, char ** argv) {
0 commit comments