tbnet::IPacketHandler::HPRetCode duplicate_sender_manager::handlePacket(tbnet::Packet *packet, void *args) { UNUSED(args); if (!packet->isRegularPacket()) { tbnet::ControlPacket *cp = (tbnet::ControlPacket*)packet; log_error("ControlPacket, cmd:%d", cp->getCommand()); have_data_to_send = 1; return tbnet::IPacketHandler::FREE_CHANNEL; } int pcode = packet->getPCode(); log_debug("================= get duplicate response, pcode: %d", pcode); if (TAIR_RESP_DUPLICATE_PACKET == pcode) { response_duplicate* resp = (response_duplicate*)packet; do_duplicate_response(resp->bucket_id, resp->server_id, resp->packet_id); have_data_to_send = 1; } else { log_warn("unknow packet! pcode: %d", pcode); } packet->free(); return tbnet::IPacketHandler::KEEP_CHANNEL; }
tbnet::IPacketHandler::HPRetCode dup_sync_sender_manager::handlePacket(tbnet::Packet *packet, void *args) { int packet_id = reinterpret_cast<long>(args); if (!packet->isRegularPacket()) { tbnet::ControlPacket *cp = (tbnet::ControlPacket*)packet; log_error("cmd:%d,packetid:%d,timeout.", cp->getCommand(),packet_id); handleTimeOutPacket(packet_id); return tbnet::IPacketHandler::FREE_CHANNEL; } int pcode = packet->getPCode(); log_debug("================= get duplicate response, pcode: %d", pcode); if (TAIR_RESP_DUPLICATE_PACKET == pcode) { response_duplicate* resp = (response_duplicate*)packet; log_debug("response packet %d ,bucket =%d, server=%s",resp->packet_id,resp->bucket_id, \ tbsys::CNetUtil::addrToString(resp->server_id).c_str()); int ret = do_duplicate_response(resp->bucket_id, resp->server_id, resp->packet_id); if (0 != ret && TAIR_RETURN_DUPLICATE_ACK_WAIT != ret) { log_error("response packet %d failed,bucket =%d, server=%s, code=%d", resp->packet_id, resp->bucket_id, \ tbsys::CNetUtil::addrToString(resp->server_id).c_str(), ret); } resp->free(); } else if ( pcode == TAIR_RESP_MRETURN_DUP_PACKET) { response_mreturn_dup *resp_dup = dynamic_cast<response_mreturn_dup*>(packet); if (resp_dup == NULL) { log_error("bad packet %d", pcode); } else { log_debug("duplicate response packet %u, bucket = %d, server = %s", resp_dup->packet_id, resp_dup->bucket_id, tbsys::CNetUtil::addrToString(resp_dup->server_id).c_str()); CPacket_wait_Nodes *pnode = NULL; int ret = packets_mgr.doResponse(resp_dup->bucket_id, resp_dup->server_id, resp_dup->packet_id, &pnode); response_mreturn *resp = new response_mreturn(); resp->swap(*resp_dup); if (ret == TAIR_RETURN_SUCCESS && pnode != NULL) { resp->setChannelId(pnode->chid); resp->config_version = pnode->conf_version; if (pnode->conn->postPacket(resp) == false) { delete resp; ret = TAIR_RETURN_DUPLICATE_SEND_ERROR; } } else { delete resp; } } } else if (pcode == TAIR_RESP_PREFIX_INCDEC_PACKET) { response_prefix_incdec *resp = dynamic_cast<response_prefix_incdec*>(packet); if (resp == NULL) { log_error("bad packet %d", pcode); } else { log_debug("duplicate response packet %u, bucket = %d, server = %s", resp->packet_id, resp->bucket_id, tbsys::CNetUtil::addrToString(resp->server_id).c_str()); CPacket_wait_Nodes *pnode = NULL; int ret = packets_mgr.doResponse(resp->bucket_id, resp->server_id, resp->packet_id, &pnode); if (ret == TAIR_RETURN_SUCCESS && pnode != NULL) { resp->server_flag = TAIR_SERVERFLAG_CLIENT; resp->setChannelId(pnode->chid); resp->config_version = pnode->conf_version; if (!pnode->conn->postPacket(resp)) { delete resp; ret = TAIR_RETURN_DUPLICATE_SEND_ERROR; } } } } else { log_warn("unknow packet! pcode: %d", pcode); packet->free(); } return tbnet::IPacketHandler::KEEP_CHANNEL; }