[CP] [Bugfix] fix multi database authentication failure
This commit is contained in:
@ -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));
|
||||
}
|
||||
|
||||
|
||||
@ -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会被标记淘汰
|
||||
|
||||
@ -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());
|
||||
|
||||
Reference in New Issue
Block a user