Example #1
0
void FsDirectoryImpl::createFile(const std::string& filename, int maxChunkSize, short replication)
{
    Path path(filename);
    DirNode* pDirNode;

    if (path.isPureDir()){
        LOG4CPLUS_WARN(m_logger, "the filename is pure dir :" << filename);
        throw InvalidFileOrDirName("the filename is pure dir");
    }

    if( (pDirNode = m_pDirTree->createDirNodes(path.getDirName())) ) {
        if (pDirNode->findFile(path.getFileName())){
            LOG4CPLUS_WARN(m_logger, "file already exist :" << path.getFileName());
            throw FileOrDirAlreadyExists("file already exist error");
        }

        INode inode(path.getFileName(), replication, maxChunkSize);

        //->addFile should have bool return value     
        pDirNode->addFile(inode);

    }
    else{
        LOG4CPLUS_WARN(m_logger, "the path name is invalid : " << path.getDirName());
        throw InvalidFileOrDirName("the path name is invalid");
    }
}
Example #2
0
FileHandler VirtualDiskNode::openFile(MyString path)
{
    if (!isNormalizedPath(path))
    {
        assert(0);
        return FileHandler(nullptr);
    }
    path = path.toLower();
    MyString dir_path = dirname(path);
    DirNode* parent = getDirNode(dir_path);
    if (!parent)
        return FileHandler(nullptr);
    MyString file_name = basename(path);
    // 文件至少被存放在根目录之下
    if (file_name.isEmpty())
    {
        return FileHandler(nullptr);
    }
    int file = parent->findFile(file_name);
    if (file == -1)
    {
        return FileHandler(nullptr);
    }
    else
    {
        return FileHandler(parent->getFileRef(file));
    }
}
Example #3
0
void FsDirectoryImpl::deleteFile(const std::string& filename, Chunks& deletedChunks)
{
    Path path(filename);
    DirNode* pDirNode;
    INode* pINode;

    //preconditions check
    if (path.isPureDir() ){
        LOG4CPLUS_WARN(m_logger, "deleteFile, but filename is a pure dir " << filename);
        throw InvalidFileOrDirName("deleteFile : is pure dir");
    }
    
    //#TODO, lock

    pDirNode = m_pDirTree->findDirNode(path.getDirName());
    if(!pDirNode) {
        LOG4CPLUS_WARN(m_logger, "directory not exist :" << path.getDirName());
        throw NoSuchFileOrDir("deleteFile : directory");
    }

    if (!(pINode = pDirNode->findFile(path.getFileName()))){
        LOG4CPLUS_WARN(m_logger, "file not exist : " << path.getFileName());
        throw NoSuchFileOrDir("deleteFile : filename");
    }

    Chunks chunks = pINode->getChunks();
    deletedChunks.assign(chunks.begin(), chunks.end());

    //#BUGFIX, [#13] INode:findChunk segment fatal error
    //ChunkTable not synchronized with deleteFile
    //
    for( int i = 0; i < chunks.size() ; i++){
        m_pChunkTable->deleteItem(chunks[i].id);
    }

    //#BUGFIX, [#17] INode:findChunk segment fatal error
    //NewChunkTable not synchronized with deleteFile
    //
    vector<Long> deleteNewChunkIds;
    if(m_pNewChunkTable->deleteItem(pINode, deleteNewChunkIds)){
        string chunkIdList;
        for (int i = 0 ; i < deleteNewChunkIds.size(); i++){
            chunkIdList += deleteNewChunkIds[i];
            chunkIdList += " ";
        }
        LOG4CPLUS_WARN(m_logger, "delete newchunks not committed: " << chunkIdList);
    }

    pDirNode->deleteFile(path.getFileName());
}
Example #4
0
bool VirtualDiskNode::isFile(MyString path) const
{
    if (!isNormalizedPath(path))
    {
        assert(0);
        return false;
    }
    path = path.toLower();
    MyString dir_path = dirname(path);
    DirNode* parent = const_cast<VirtualDiskNode*>(this)->getDirNode(dir_path);
    if (!parent)
        return false;
    MyString name = basename(path);
    int file = parent->findFile(name);
    return file != -1;
}
Example #5
0
bool FsDirectoryImpl::exists(const std::string &name)
{
    Path path(name);
    DirNode* pDirNode;

    if ( path.isPureDir() ) {
        //pure directory name
        pDirNode = m_pDirTree->findDirNode(name);
        return (pDirNode != NULL);
    }    
    else{
        //contains file name
        pDirNode = m_pDirTree->findDirNode(path.getDirName());
        
        if(!pDirNode) return false;

        return (NULL != pDirNode->findFile(path.getFileName()));
    }
}
Example #6
0
void VirtualDiskNode::deleteFile(MyString path)
{
    if (!isNormalizedPath(path))
    {
        assert(0);
        return;
    }
    path = path.toLower();
    MyString dir_path = dirname(path);
    DirNode* parent = getDirNode(dir_path);
    if (!parent)
        return;
    MyString file_name = basename(path);
    assert(!file_name.isEmpty());
    int file = parent->findFile(file_name);
    if (file != -1)
    {
        parent->removeFile(file);
    }
    return;
}
Example #7
0
INode* DirTree::findINode(const std::string &name) const
{
    DirNode *pNode;
    INode   *pInode;
    Path    path(name);

    if ( (pNode = findDirNode(name)) ) {
        if (path.isPureDir()) {
            return pNode->getINode();
        }
        else {
            //try file node first
            pInode = pNode->findFile(path.getFileName());
            if(pInode) return pInode;
            
            //try dir node then
            DirNode *pDirNode = pNode->findChild(path.getFileName());
            if(pDirNode) return pDirNode->getINode();
            else return NULL;
        }
    }

    return NULL;
}
Example #8
0
FileHandler VirtualDiskNode::createFile(MyString path)
{
    if (!isNormalizedPath(path))
    {
        assert(0);
        return FileHandler(nullptr);
    }
    MyString dir_path = dirname(path).toLower();
    DirNode* parent = getDirNode(dir_path);
    if (!parent)
        return FileHandler(nullptr);
    // 文件名创建时保留大小写
    MyString file_name = basename(path);
    if (parent->findFile(file_name) != -1)
    {
        return FileHandler(nullptr);
    }

    FileNode* nfile = parent->addFile();
    assert(nfile);
    nfile->set_name(file_name);
    nfile->set_path(path.toLower());
    return FileHandler(nfile);
}