[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 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 */)
{
@ -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.
struct pool {
map: [user_id0:node1][user_id2:node:2]
map: [key1:node1][key2:node:2]
}
struct node {
@ -445,7 +445,7 @@ int ObTableApiSessPool::get_sess_info(ObTableApiCredential &credential, ObTableA
ObTableApiSessNode *sess_node = nullptr;
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) {
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
} 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));
} 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));
} else if (OB_UNLIKELY(OB_ISNULL(sess_node))) {
ret = OB_ERR_UNEXPECTED;
@ -511,9 +511,9 @@ int ObTableApiSessPool::create_and_add_node_safe(ObTableApiCredential &credentia
ObTableApiSessNode *node = nullptr;
if (OB_FAIL(create_node_safe(credential, node))) {
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) {
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
ObLockGuard<ObSpinLock> guard(lock_);
@ -534,7 +534,7 @@ int ObTableApiSessPool::update_sess(ObTableApiCredential &credential)
int ret = OB_SUCCESS;
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_HASH_NOT_EXIST == ret) { // not exist, create
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;
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));
}

View File

@ -85,7 +85,7 @@ private:
class ObTableApiSessPool final
{
public:
// key is user_id
// key is ObTableApiCredential.hash_val_
typedef common::hash::ObHashMap<uint64_t, ObTableApiSessNode*> CacheKeyNodeMap;
static const int64_t SESS_POOL_DEFAULT_BUCKET_NUM = 10; // 取决于客户端登录的用户数量
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(0, mgr->pool_->retired_nodes_.size_);
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_TRUE(node->sess_lists_.free_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(0, mgr->pool_->retired_nodes_.size_);
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_TRUE(node->sess_lists_.free_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_->retired_nodes_.size_);
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_TRUE(node->sess_lists_.free_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_EQ(2, mgr->pool_->key_node_map_.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_TRUE(node->sess_lists_.free_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_NE(nullptr, mgr->pool_);
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();
ASSERT_FALSE(mgr->is_inited_);
ASSERT_EQ(nullptr, mgr->pool_);
@ -203,7 +203,7 @@ TEST_F(TestTableSessPool, mgr_sess_recycle)
// add mock val to 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);
val.is_inited_ = true;
ASSERT_EQ(true, node->sess_lists_.free_list_.add_last(&val));
@ -216,7 +216,7 @@ TEST_F(TestTableSessPool, mgr_sess_recycle)
guard.~ObTableApiSessGuard();
// 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;
mgr->elimination_task_.run_retire_sess_task();
ASSERT_EQ(0, mgr->pool_->key_node_map_.size());