CodisClient icon indicating copy to clipboard operation
CodisClient copied to clipboard

RoundRobinCodisPool可能导致访问错误的指针

Open typhoonzero opened this issue 9 years ago • 3 comments
trafficstars

在BfdCodis.cpp中:

BfdCodis::BfdCodis(const string& zookeeperAddr, const string& proxyPath, const string& businessID)
{
    m_Pool = new RoundRobinCodisPool(zookeeperAddr, proxyPath, businessID);
}

BfdCodis::~BfdCodis()
{
    if (m_Pool = NULL)
    {
        delete m_Pool;
        m_Pool = NULL;
    }
}

bool BfdCodis::exists(string key, int tt)
{
    return m_Pool->GetProxy()->exists(key, tt);
}

int BfdCodis::del(string key, int tt)
{
    return m_Pool->GetProxy()->del(key, tt);
}

这段代码的m_Pool->GetProxy()得到的CodisClient实例,有可能会在RoundRobinCodisPool中被析构。

建议的更新方法:

  • 仿照RedisClientPool.cpp的方法,GetProxy()返回的指针要从vector中pop出来
  • 减少调用的层数,在RoundRobinCodisPool中维持一个Map, key是proxy地址,value是一个vector,包含这个proxy的链接池。每次轮转这个Map从中获取一个proxy,并从链接池中pop一个连接出来使用,并在使用完成后归还。
  • RoundRobinCodisPool的析构要在连接池内容都被归还之后才能开始

typhoonzero avatar Aug 29 '16 07:08 typhoonzero

一个高效的写法:

    {
    ScopedLock lock(m_Mutex);
    int idx = ++proxyIndex % m_Proxys.size()
    }
    return m_Proxys[idx];

typhoonzero avatar Aug 30 '16 02:08 typhoonzero

有一天proxyIndex会溢出

weim0000 avatar Aug 30 '16 07:08 weim0000

可以这样:int idx = crc32(key)%m_Proxys.size()

weim0000 avatar Aug 30 '16 07:08 weim0000