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]; }
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; } } }
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; }
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; } }