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;
   }
Exemple #2
0
  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;
  }