[CP] [Bugfix] fix multi database authentication failure

This commit is contained in:
WeiXinChan
2023-10-13 02:44:04 +00:00
committed by ob-robot
parent 7f69ea77cc
commit 79253707a7
3 changed files with 16 additions and 16 deletions

View File

@ -258,7 +258,7 @@ int ObTableApiSessPoolMgr::ObTableApiSessEliminationTask::run_recycle_retired_se
/* /*
init session pool init session pool
- init key_node_map_ which is a hashmap, key is user_id, value is ObTableApiSessNode* - init key_node_map_ which is a hashmap, key is ObTableApiCredential.hash_val_, value is ObTableApiSessNode*
*/ */
int ObTableApiSessPool::init(int64_t hash_bucket/* = SESS_POOL_DEFAULT_BUCKET_NUM */) int ObTableApiSessPool::init(int64_t hash_bucket/* = SESS_POOL_DEFAULT_BUCKET_NUM */)
{ {
@ -432,7 +432,7 @@ int ObTableApiSessPool::get_sess_node(uint64_t key,
3.1 if there is no session node val in node list, extend it. 3.1 if there is no session node val in node list, extend it.
struct pool { struct pool {
map: [user_id0:node1][user_id2:node:2] map: [key1:node1][key2:node:2]
} }
struct node { struct node {
@ -445,7 +445,7 @@ int ObTableApiSessPool::get_sess_info(ObTableApiCredential &credential, ObTableA
ObTableApiSessNode *sess_node = nullptr; ObTableApiSessNode *sess_node = nullptr;
bool need_extend = false; bool need_extend = false;
if (OB_FAIL(get_sess_node(credential.user_id_, sess_node))) { // first get if (OB_FAIL(get_sess_node(credential.hash_val_, sess_node))) { // first get
if (OB_HASH_NOT_EXIST != ret) { if (OB_HASH_NOT_EXIST != ret) {
LOG_WARN("fail to get sess node", K(ret), K(credential)); LOG_WARN("fail to get sess node", K(ret), K(credential));
} }
@ -455,7 +455,7 @@ int ObTableApiSessPool::get_sess_info(ObTableApiCredential &credential, ObTableA
// do nothing // do nothing
} else if (OB_UNLIKELY(OB_HASH_NOT_EXIST == ret) && OB_FAIL(create_and_add_node_safe(credential))) { // not exist, create } else if (OB_UNLIKELY(OB_HASH_NOT_EXIST == ret) && OB_FAIL(create_and_add_node_safe(credential))) { // not exist, create
LOG_WARN("fail to create and add session node", K(ret), K(credential)); LOG_WARN("fail to create and add session node", K(ret), K(credential));
} else if (OB_UNLIKELY(OB_ISNULL(sess_node)) && OB_FAIL(get_sess_node(credential.user_id_, sess_node))) { // get again } else if (OB_UNLIKELY(OB_ISNULL(sess_node)) && OB_FAIL(get_sess_node(credential.hash_val_, sess_node))) { // get again
LOG_WARN("fail to get sess node", K(ret), K(credential)); LOG_WARN("fail to get sess node", K(ret), K(credential));
} else if (OB_UNLIKELY(OB_ISNULL(sess_node))) { } else if (OB_UNLIKELY(OB_ISNULL(sess_node))) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
@ -511,9 +511,9 @@ int ObTableApiSessPool::create_and_add_node_safe(ObTableApiCredential &credentia
ObTableApiSessNode *node = nullptr; ObTableApiSessNode *node = nullptr;
if (OB_FAIL(create_node_safe(credential, node))) { if (OB_FAIL(create_node_safe(credential, node))) {
LOG_WARN("fail to create node", K(ret), K(credential)); LOG_WARN("fail to create node", K(ret), K(credential));
} else if (OB_FAIL(key_node_map_.set_refactored(credential.user_id_, node))) { } else if (OB_FAIL(key_node_map_.set_refactored(credential.hash_val_, node))) {
if (OB_HASH_EXIST != ret) { if (OB_HASH_EXIST != ret) {
LOG_WARN("fail to add sess node to hash map", K(ret), K(credential.user_id_), K(*node)); LOG_WARN("fail to add sess node to hash map", K(ret), K(credential), K(*node));
} }
// this node has been set by other thread, free it // this node has been set by other thread, free it
ObLockGuard<ObSpinLock> guard(lock_); ObLockGuard<ObSpinLock> guard(lock_);
@ -534,7 +534,7 @@ int ObTableApiSessPool::update_sess(ObTableApiCredential &credential)
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ObTableApiSessNode *node = nullptr; ObTableApiSessNode *node = nullptr;
const uint64_t key = credential.user_id_; const uint64_t key = credential.hash_val_;
if (OB_FAIL(get_sess_node(key, node))) { if (OB_FAIL(get_sess_node(key, node))) {
if (OB_HASH_NOT_EXIST == ret) { // not exist, create if (OB_HASH_NOT_EXIST == ret) { // not exist, create
if (OB_FAIL(create_and_add_node_safe(credential))) { if (OB_FAIL(create_and_add_node_safe(credential))) {
@ -556,7 +556,7 @@ int ObTableApiSessPool::replace_sess_node_safe(ObTableApiCredential &credential)
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ObTableApiSessNodeReplaceOp replace_callback(*this, credential); ObTableApiSessNodeReplaceOp replace_callback(*this, credential);
if (OB_FAIL(key_node_map_.atomic_refactored(credential.user_id_, replace_callback))) { if (OB_FAIL(key_node_map_.atomic_refactored(credential.hash_val_, replace_callback))) {
LOG_WARN("fail to replace session", K(ret), K(credential)); LOG_WARN("fail to replace session", K(ret), K(credential));
} }

View File

@ -85,7 +85,7 @@ private:
class ObTableApiSessPool final class ObTableApiSessPool final
{ {
public: public:
// key is user_id // key is ObTableApiCredential.hash_val_
typedef common::hash::ObHashMap<uint64_t, ObTableApiSessNode*> CacheKeyNodeMap; typedef common::hash::ObHashMap<uint64_t, ObTableApiSessNode*> CacheKeyNodeMap;
static const int64_t SESS_POOL_DEFAULT_BUCKET_NUM = 10; // 取决于客户端登录的用户数量 static const int64_t SESS_POOL_DEFAULT_BUCKET_NUM = 10; // 取决于客户端登录的用户数量
static const int64_t SESS_RETIRE_TIME = 300 * 1000000; // 超过300s未被访问的session会被标记淘汰 static const int64_t SESS_RETIRE_TIME = 300 * 1000000; // 超过300s未被访问的session会被标记淘汰

View File

@ -113,7 +113,7 @@ TEST_F(TestTableSessPool, mgr_get_session)
ASSERT_EQ(1, mgr->pool_->key_node_map_.size()); ASSERT_EQ(1, mgr->pool_->key_node_map_.size());
ASSERT_EQ(0, mgr->pool_->retired_nodes_.size_); ASSERT_EQ(0, mgr->pool_->retired_nodes_.size_);
ObTableApiSessNode *node; ObTableApiSessNode *node;
ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node));
ASSERT_NE(nullptr, node); ASSERT_NE(nullptr, node);
ASSERT_TRUE(node->sess_lists_.free_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.free_list_.is_empty());
ASSERT_TRUE(node->sess_lists_.used_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.used_list_.is_empty());
@ -144,7 +144,7 @@ TEST_F(TestTableSessPool, mgr_update_session)
ASSERT_EQ(1, mgr->pool_->key_node_map_.size()); ASSERT_EQ(1, mgr->pool_->key_node_map_.size());
ASSERT_EQ(0, mgr->pool_->retired_nodes_.size_); ASSERT_EQ(0, mgr->pool_->retired_nodes_.size_);
ObTableApiSessNode *node; ObTableApiSessNode *node;
ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node));
ASSERT_NE(nullptr, node); ASSERT_NE(nullptr, node);
ASSERT_TRUE(node->sess_lists_.free_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.free_list_.is_empty());
ASSERT_TRUE(node->sess_lists_.used_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.used_list_.is_empty());
@ -159,7 +159,7 @@ TEST_F(TestTableSessPool, mgr_update_session)
ASSERT_EQ(1, mgr->pool_->key_node_map_.size()); ASSERT_EQ(1, mgr->pool_->key_node_map_.size());
ASSERT_EQ(1, mgr->pool_->retired_nodes_.size_); ASSERT_EQ(1, mgr->pool_->retired_nodes_.size_);
ASSERT_EQ(node, mgr->pool_->retired_nodes_.get_last()); ASSERT_EQ(node, mgr->pool_->retired_nodes_.get_last());
ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(new_cred->user_id_, node)); ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(new_cred->hash_val_, node));
ASSERT_NE(nullptr, node); ASSERT_NE(nullptr, node);
ASSERT_TRUE(node->sess_lists_.free_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.free_list_.is_empty());
ASSERT_TRUE(node->sess_lists_.used_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.used_list_.is_empty());
@ -172,7 +172,7 @@ TEST_F(TestTableSessPool, mgr_update_session)
ASSERT_TRUE(mgr->pool_->is_inited_); ASSERT_TRUE(mgr->pool_->is_inited_);
ASSERT_EQ(2, mgr->pool_->key_node_map_.size()); ASSERT_EQ(2, mgr->pool_->key_node_map_.size());
ASSERT_EQ(1, mgr->pool_->retired_nodes_.size_); ASSERT_EQ(1, mgr->pool_->retired_nodes_.size_);
ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(new_cred->user_id_, node)); ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(new_cred->hash_val_, node));
ASSERT_NE(nullptr, node); ASSERT_NE(nullptr, node);
ASSERT_TRUE(node->sess_lists_.free_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.free_list_.is_empty());
ASSERT_TRUE(node->sess_lists_.used_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.used_list_.is_empty());
@ -186,7 +186,7 @@ TEST_F(TestTableSessPool, mgr_destroy)
ASSERT_EQ(OB_SUCCESS, mgr->update_sess(*mock_cred_)); ASSERT_EQ(OB_SUCCESS, mgr->update_sess(*mock_cred_));
ASSERT_NE(nullptr, mgr->pool_); ASSERT_NE(nullptr, mgr->pool_);
ObTableApiSessNode *node; ObTableApiSessNode *node;
ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node));
mgr->destroy(); mgr->destroy();
ASSERT_FALSE(mgr->is_inited_); ASSERT_FALSE(mgr->is_inited_);
ASSERT_EQ(nullptr, mgr->pool_); ASSERT_EQ(nullptr, mgr->pool_);
@ -203,7 +203,7 @@ TEST_F(TestTableSessPool, mgr_sess_recycle)
// add mock val to node // add mock val to node
ObTableApiSessNode *node; ObTableApiSessNode *node;
ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node));
ObTableApiSessNodeVal val(node); ObTableApiSessNodeVal val(node);
val.is_inited_ = true; val.is_inited_ = true;
ASSERT_EQ(true, node->sess_lists_.free_list_.add_last(&val)); ASSERT_EQ(true, node->sess_lists_.free_list_.add_last(&val));
@ -216,7 +216,7 @@ TEST_F(TestTableSessPool, mgr_sess_recycle)
guard.~ObTableApiSessGuard(); guard.~ObTableApiSessGuard();
// 3min not access // 3min not access
ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node));
node->last_active_ts_ = node->last_active_ts_ - ObTableApiSessPool::SESS_RETIRE_TIME; node->last_active_ts_ = node->last_active_ts_ - ObTableApiSessPool::SESS_RETIRE_TIME;
mgr->elimination_task_.run_retire_sess_task(); mgr->elimination_task_.run_retire_sess_task();
ASSERT_EQ(0, mgr->pool_->key_node_map_.size()); ASSERT_EQ(0, mgr->pool_->key_node_map_.size());