Files
oceanbase/unittest/observer/test_net_performance.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

165 lines
3.5 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#define USING_LOG_PREFIX SERVER
#include "test_net_performance.h"
#include "omt/all_mock.h"
#include "observer/ob_srv_network_frame.h"
#include "observer/omt/ob_multi_tenant.h"
#include "observer/omt/ob_worker_processor.h"
using namespace oceanbase::common;
using namespace oceanbase::observer;
using namespace oceanbase::omt;
using namespace oceanbase::obrpc;
using namespace oceanbase::unittest;
static ObGlobalContext gctx;
int64_t ccnt = 6;
int64_t iocnt = 6;
int64_t scnt = 6;
int64_t msgcnt = 10000;
int main(int argc, char *argv[])
{
int ret = OB_SUCCESS;
all_mock_init();
if (!parse_arg(argc, argv)) {
return 1;
}
static ObSrvNetworkFrame frame(gctx);
if (OB_FAIL(start_frame(frame))) {
LOG_ERROR("start frame fail");
} else {
//frame.wait();
}
TestProxy proxy;
frame.get_proxy(proxy);
Client c(proxy);
c.set_thread_count((int)ccnt);
c.start();
c.wait();
//frame.wait();
return 0;
}
namespace oceanbase
{
namespace unittest
{
class Processor
: public ObIWorkerProcessor
{
public:
Processor()
{
ObRpcResultCode rcode;
rcode.serialize(pbuf_, 1024L, pbuf_len_);
}
virtual int process(rpc::ObRequest &req)
{
int ret = OB_SUCCESS;
const ObRpcPacket &rpacket = reinterpret_cast<const ObRpcPacket&>(req.get_packet());
ObRpcPacketCode pcode = rpacket.get_pcode();
void *buf = easy_pool_alloc(req.get_request()->ms->pool, sizeof (ObRpcPacket));
ObRpcPacket *packet = new (buf) ObRpcPacket();
packet->set_pcode(pcode);
packet->set_chid(rpacket.get_chid());
packet->set_content(pbuf_, pbuf_len_);
packet->set_session_id(0);
packet->set_trace_id(common::ObCurTraceId::get());
packet->set_resp();
packet->calc_checksum();
req.get_request()->opacket = packet;
easy_request_wakeup(req.get_request());
return ret;
};
private:
char pbuf_[1024];
int64_t pbuf_len_;
}; // end of class Processor
void Client::run(obsys::CThread *thread, void *arg)
{
UNUSED(arg);
int64_t cnt = msgcnt;
while (cnt--) {
proxy_.to(ObAddr(ObAddr::IPV4, "127.0.0.1", 2500))
.by(500)
.test();
}
}
int start_frame(ObSrvNetworkFrame &frame)
{
int ret = OB_SUCCESS;
static Processor p;
static ObMultiTenant mt(p);
mt.init(ObAddr());
mt.add_tenant(500, (double)scnt / 4, (double)scnt / 4);
mt.start();
gctx.config_ = &ObServerConfig::get_instance();
gctx.omt_ = &mt;
GCONF.net_thread_count = iocnt;
if (OB_FAIL(frame.init())) {
LOG_ERROR("init net frame fail", K(ret));
} else if (OB_FAIL(frame.start())) {
LOG_ERROR("start net frame fail", K(ret));
}
return ret;
}
bool parse_arg(int argc, char *argv[])
{
int idx = 0;
if (++idx < argc) {
ccnt = strtol(argv[idx], NULL, 10);
}
if (++idx < argc) {
iocnt = strtol(argv[idx], NULL, 10);
}
if (++idx < argc) {
scnt = strtol(argv[idx], NULL, 10);
}
if (++idx < argc) {
msgcnt = strtol(argv[idx], NULL, 10);
}
return ccnt > 0 && iocnt > 0 && scnt > 0 && msgcnt > 0;
}
} // end of namespace unittest
} // end of namespace oceanbase