void CacheManagerTest::testFile() { CacheManager * cache = Factory::GetCacheManager(); const unsigned long long bigNumber = 1024LL * 1024 * 1024 * 1024; unsigned long long number = 0; CPPUNIT_ASSERT( false == cache->ExistFile(0) ); CPPUNIT_ASSERT( false == cache->ExistFile(1) ); CPPUNIT_ASSERT( true == cache->CreateNewFile(number) ); CPPUNIT_ASSERT( 1 == number ); CPPUNIT_ASSERT( true == cache->CreateNewFile(number) ); CPPUNIT_ASSERT( 2 == number ); Factory::ReleaseCacheManager(); Factory::CreateCacheManager(); cache = Factory::GetCacheManager(); CPPUNIT_ASSERT( false == cache->ExistFile(0) ); CPPUNIT_ASSERT( true == cache->ExistFile(1) ); CPPUNIT_ASSERT( true == cache->ExistFile(2) ); CPPUNIT_ASSERT( false == cache->ExistFile(3) ); CPPUNIT_ASSERT( true == cache->CreateFile(bigNumber) ); CPPUNIT_ASSERT( false == cache->ExistFile(bigNumber - 1) ); CPPUNIT_ASSERT( true == cache->ExistFile(bigNumber) ); CPPUNIT_ASSERT( true == cache->CreateNewFile(number) ); CPPUNIT_ASSERT( bigNumber + 1 == number ); CPPUNIT_ASSERT( true == cache->ExistFile(bigNumber + 1) ); Factory::ReleaseCacheManager(); Factory::CreateCacheManager(); cache = Factory::GetCacheManager(); CPPUNIT_ASSERT( false == cache->ExistFile(0) ); CPPUNIT_ASSERT( true == cache->ExistFile(1) ); CPPUNIT_ASSERT( true == cache->ExistFile(2) ); CPPUNIT_ASSERT( false == cache->ExistFile(3) ); CPPUNIT_ASSERT( false == cache->ExistFile(bigNumber - 1) ); CPPUNIT_ASSERT( true == cache->ExistFile(bigNumber) ); CPPUNIT_ASSERT( true == cache->ExistFile(bigNumber + 1) ); CPPUNIT_ASSERT( true == cache->CreateNewFile(number) ); CPPUNIT_ASSERT_MESSAGE( boost::lexical_cast<string>(number), bigNumber + 2 == number ); CPPUNIT_ASSERT( true == cache->ExistFile(bigNumber + 2) ); for ( unsigned long long i = 0; i < 4; ++ i ) { CPPUNIT_ASSERT( true == cache->DeleteFile(i) ); CPPUNIT_ASSERT( false == cache->ExistFile(i) ); } for ( unsigned long long i = bigNumber - 1; i < bigNumber + 3; ++ i ) { CPPUNIT_ASSERT( true == cache->DeleteFile(i) ); CPPUNIT_ASSERT( false == cache->ExistFile(i) ); } CPPUNIT_ASSERT( true == cache->CreateNewFile(number) ); CPPUNIT_ASSERT_MESSAGE( boost::lexical_cast<string>(number), bigNumber + 3 == number ); CPPUNIT_ASSERT( true == cache->ExistFile(bigNumber + 3) ); }
void CacheMonitorServer::ScanFolder(const fs::path & folder) { CacheManager * cache = Factory::GetCacheManager(); fs::path folderMeta = Factory::GetMetaFolder() / Factory::GetService(); try { fs::directory_iterator end; for ( fs::directory_iterator i(folder); i != end; ++ i ) { if ( fs::is_directory(i->status()) ) { ScanFolder(i->path()); } else { struct stat stat; if ( 0 != ::stat(i->path().string().c_str(),&stat) ) { continue; } ExtendedAttribute ea(i->path()); unsigned long long number; int valuesize; if ( ! ea.GetValue( Inode::ATTRIBUTE_NUMBER, &number, sizeof(number), valuesize ) ) { continue; } long state; if ( ! ea.GetValue( Inode::ATTRIBUTE_STATE, &state, sizeof(state), valuesize) ) { continue; } if ( state != Inode::StateBegin ) { continue; } long long size = 0; if ( ! ea.GetValue( Inode::ATTRIBUTE_SIZE, &size, sizeof(size), valuesize) ) { continue; } if ( size <= 0 ) { continue; } if ( ! cache->ExistFile(number) ) { continue; } vector<FileInfo> files; FileMap::iterator iter = files_.insert( FileMap::value_type(stat.st_atime,files) ).first; FileInfo file; file.service = Factory::GetService(); file.path = i->path().string().substr( folderMeta.string().size() ); iter->second.push_back(file); } } } catch ( const boost::filesystem::filesystem_error& e ) { LogError(e.what()); } catch ( const std::exception & e ) { LogError(e.what()); } }