fix switch to follower forcedly will failed due to no memory
This commit is contained in:
		@ -1953,9 +1953,11 @@ TEST_F(ObTestTx, distributed_tx_coordinator_switch_to_follower_forcedly_in_prepa
 | 
			
		||||
  n1->add_drop_msg_type(TX_2PC_PREPARE_RESP);
 | 
			
		||||
 | 
			
		||||
  int commit_ret = OB_SUCCESS;
 | 
			
		||||
  // async start commit
 | 
			
		||||
  std::thread t(do_async_commit, n1, std::ref(tx), std::ref(commit_ret));
 | 
			
		||||
  usleep(100 * 1000);
 | 
			
		||||
 | 
			
		||||
  // wait coordinator into prepare state
 | 
			
		||||
  ObPartTransCtx *n1_ctx = NULL;
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, n1->get_tx_ctx(n1->ls_id_, tx.tx_id_, n1_ctx));
 | 
			
		||||
  int i = 0;
 | 
			
		||||
@ -1965,28 +1967,27 @@ TEST_F(ObTestTx, distributed_tx_coordinator_switch_to_follower_forcedly_in_prepa
 | 
			
		||||
  ASSERT_NE(i, 1001);
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, n1->revert_tx_ctx(n1_ctx));
 | 
			
		||||
 | 
			
		||||
  // switch coordinator to follower forcedly
 | 
			
		||||
  ObLSTxCtxMgr *ls_tx_ctx_mgr1 = NULL;
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, n1->txs_.tx_ctx_mgr_.get_ls_tx_ctx_mgr(n1->ls_id_, ls_tx_ctx_mgr1));
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, ls_tx_ctx_mgr1->switch_to_follower_forcedly());
 | 
			
		||||
  n1->wait_all_redolog_applied();
 | 
			
		||||
 | 
			
		||||
  // n3 takeover as leader
 | 
			
		||||
  ReplayLogEntryFunctor functor(n3);
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, n3->fake_tx_log_adapter_->replay_all(functor));
 | 
			
		||||
 | 
			
		||||
  ObLSTxCtxMgr *ls_tx_ctx_mgr3 = NULL;
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, n3->txs_.tx_ctx_mgr_.get_ls_tx_ctx_mgr(n3->ls_id_, ls_tx_ctx_mgr3));
 | 
			
		||||
 | 
			
		||||
  ObTxNode::get_location_adapter_().update_localtion(n3->ls_id_, n3->addr_);
 | 
			
		||||
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, ls_tx_ctx_mgr3->switch_to_leader());
 | 
			
		||||
  n3->wait_all_redolog_applied();
 | 
			
		||||
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, n2->wait_all_tx_ctx_is_destoryed());
 | 
			
		||||
 | 
			
		||||
  // wait commit complete on scheduler
 | 
			
		||||
  t.join();
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, commit_ret);
 | 
			
		||||
 | 
			
		||||
  n3->del_drop_msg_type(TX_2PC_CLEAR_REQ);
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, n3->wait_all_tx_ctx_is_destoryed());
 | 
			
		||||
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, n1->release_tx(tx));
 | 
			
		||||
 | 
			
		||||
@ -221,13 +221,14 @@ private:
 | 
			
		||||
    ObLSTxCtxMgr *ls_tx_ctx_mgr = NULL;
 | 
			
		||||
    OZ(txs_.tx_ctx_mgr_.get_ls_tx_ctx_mgr(ls_id_, ls_tx_ctx_mgr));
 | 
			
		||||
    int i = 0;
 | 
			
		||||
    for (i = 0; i < 2000; ++i) {
 | 
			
		||||
      if (0 == ls_tx_ctx_mgr->get_tx_ctx_count()) break;
 | 
			
		||||
    int tx_count = ls_tx_ctx_mgr->get_tx_ctx_count();
 | 
			
		||||
    for (i = 0; tx_count > 0 && i < 2000; ++i) {
 | 
			
		||||
      tx_count = ls_tx_ctx_mgr->get_tx_ctx_count();
 | 
			
		||||
      usleep(500);
 | 
			
		||||
    }
 | 
			
		||||
    if (2000 == i) {
 | 
			
		||||
      ret = OB_ERR_UNEXPECTED;
 | 
			
		||||
      LOG_INFO("print all tx begin", K(ret));
 | 
			
		||||
      LOG_INFO("wait all tx ctx destoryed fail, print all tx:", K(tx_count));
 | 
			
		||||
      const bool verbose = true;
 | 
			
		||||
      ls_tx_ctx_mgr->print_all_tx_ctx(ObLSTxCtxMgr::MAX_HASH_ITEM_PRINT, verbose);
 | 
			
		||||
      LOG_INFO("print all tx end", K(ret));
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user