165 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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
 | 
