Skip to content

连接池泄露的问题 #205

Description

@shenkonghui

运行一段时间,会发现info命令看到的connection属性(一共创建的连接数量)一直增加,在某些特定的场景下会出现该问题,导致连接池出现泄露。

场景如下:
只针对私有连接的场景,SUBSCRIBE->UNSUBSCRIBE->redis close以后 会导致连接池连接增加1个

目前发现有2个原因

  1. UNSUBSCRIBE以后会push_back一遍连接,close以后又会push_back一遍连接,重复push了
    void Handler::handleResponse(ConnectConnection* s, Request* req, Response* res)的最后putPrivateConnection了一遍
    void Handler::postConnectConnectionEvent()的最后也putPrivateConnection了一遍

  2. 即使修复了第一个问题,还是会出现,因为list.h实现的链表存在断裂的情况(具体问题找不到原因),当获取连接的时候,会出现连接池长度还有,但是pop_front为空指针的情况。换成std:list就不会有这个问题。

我增加了日志,显示push以后,链表长度增加,但是链表尾没有数据
Image

该问题会导致以下问题:

  1. 偶发no server connection avaliable
  2. 内存突然持续增加,可能是异常的连接一直占用内存

如果遇到如下问题的可以留意这个issue。
另外连接池只是简单的保留连接,不会释放空闲连接,所以会保留最大使用的连接,也会一直占用一部分内存不释放, 也可以优化一下。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions