예제 #1
0
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) );
}
예제 #2
0
    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());
        }
    }