コード例 #1
0
ファイル: rack_table.cpp プロジェクト: chenchu0910/mooon
CRack* CRackTable::add_rack(uint32_t rack_id)
{        
    if (!is_valid_rack_id(rack_id)) return NULL;    
    sys::WriteLockHelper write_lock(_lock);

    // 节点已经存在
    if (_rack_array[rack_id] != NULL) return NULL;
        
    _rack_array[rack_id] = new CRack(rack_id);
    _rack_array[rack_id]->inc_refcount();
    return _rack_array[rack_id];
}
コード例 #2
0
ファイル: rack_table.cpp プロジェクト: chenchu0910/mooon
void CRackTable::del_rack(CRack* rack)
{
    uint32_t rack_id = rack->get_id();
    if (is_valid_rack_id(rack_id))
    {    
        sys::WriteLockHelper write_lock(_lock);
        if (_rack_array[rack_id] != NULL)
        {        
            //delete _rack_array[rack_id];
            _rack_array[rack_id]->dec_refcount();
            _rack_array[rack_id] = NULL;
        }
    }
}
コード例 #3
0
ファイル: rack_table.cpp プロジェクト: chenchu0910/mooon
bool CRackTable::rack_exist(uint32_t rack_id)
{       
    sys::ReadLockHelper read_lock(_lock);
    return is_valid_rack_id(rack_id)? (_rack_array[rack_id] != NULL): false;
}
コード例 #4
0
ファイル: node_table.cpp プロジェクト: KashingLee/mooon
void CNodeTable::load(const char* filename, bool ignore_duplicate)
{
    FILE* fp = fopen(filename, "r");
    if (NULL == fp)
        throw sys::CSyscallException(errno, __FILE__, __LINE__);

    sys::CloseHelper<FILE*> ch(fp);
    sys::WriteLockHelper write_lock(_lock);

    try
    {        
        int idc_id = 0;
        int node_id = 0;
        int rack_id = 0;        
        int node_type = 0;                
        char node_ip_str[IP_ADDRESS_MAX];
        char check_field[100]; /** 用来探测是否多了一些字段 */
        
        char line[LINE_MAX];
        int line_number = 0;

        while (fgets(line, sizeof(line)-1, fp))
        {
            ++line_number;

            // 跳过注释
            if ('#' == line[0]) continue;
            // 跳过空行
            if ('\n' == line[0]) continue;
 
            // 共5个有效字段
            int field_count = sscanf(line, "%d%s%d%d%d%s", &node_id, node_ip_str, &node_type, &rack_id, &idc_id, check_field);
            if (field_count != 5) // 字段个数不对
                throw util::CFileFormatException(filename, line_number, field_count);

            // 节点ID过大
            if (!is_valid_node_id(node_id))
                throw util::CFileFormatException(filename, line_number, 1);
        
            // IP格式不对
            if (!net::CUtil::valid_ipv4(node_ip_str))
                throw util::CFileFormatException(filename, line_number, 2);

            int node_ip = net::CUtil::convert_ipv4(node_ip_str);
            if (0 == node_ip)
                throw util::CFileFormatException(filename, line_number, 2);
                        
            // 节点类型不对
            if ((node_type != 0) && (node_type != 1))
                throw util::CFileFormatException(filename, line_number, 3);

            // rack error
            if ((rack_id != -1) && (!is_valid_rack_id(rack_id)))
                throw util::CFileFormatException(filename, line_number, 4);

            // idc error
            if ((idc_id != -1) && (!is_valid_idc_id(idc_id)))         
                throw util::CFileFormatException(filename, line_number, 5);

            // node_type等于1表示为受控节点,如果等于0则表示为非控节点
            CNode* node = do_add_node(node_id, node_ip, 1==node_type);         
            if (NULL == node) // 除非节点已经存在,否则不会为NULL
            {
                if (!ignore_duplicate)
                    throw util::CFileFormatException(filename, line_number, 0);
            }
            else
            {            
                if (idc_id > -1)
                    node->set_owner_idc_id(idc_id);
                if (rack_id > -1)
                    node->set_owner_rack_id(rack_id);
            }
        }
    }
    catch (util::CFileFormatException& ex)
    {
        //fclose(fp); // 使用了CloseHelper,会自动关闭的
        clear_nodes();
        throw;
    }
}