fastdfs报错Read timed out后上传的文件会发生错乱

用户在使用FastDFS时遇到文件错误,经分析发现在Readtimeout后上传的文件会错乱。通过调试和GitHub讨论发现,问题可能与ConnectionManager的连接池策略有关。解决方案包括设置单例连接池或升级到最新版本的FastDFS,后者改进了异常处理避免返回连接池。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有用户反映线上查看文件时,文件名与文件内容中的不是同一个,内容也不对,测试环境试了很多次,代码检查了很多次都没有发现问题,于是又去分析日志,
发现一个奇怪的现象,fastdfs每次报错Read timed out后的上个时间段上传的文件会发生错乱的情况,于是就在测试环境模拟让fastdfs发生超时,
通过减小soTimeout和connectTimeout的值,发现当报错超时之后,真的发生了这种情况,上网搜索这种现象也没有答案,于是去查看com.github.tobato的源码,
发现ConnectionManager中

protected <T> T execute(InetSocketAddress address, Connection conn, FdfsCommand<T> command){
        try {
            // 执行交易
            LOGGER.debug("对地址{}发出交易请求{}", address, command.getClass().getSimpleName());
            return command.execute(conn);
        } catch (FdfsException e) {
            throw e;
        } catch (Exception e) {
            LOGGER.error("execute fdfs command error", e);
            throw new RuntimeException("execute fdfs command error", e);
        } finally {
            try {
                if (null != conn) {
                    pool.returnObject(address, conn);
                }
            } catch (Exception e) {
                LOGGER.error("return pooled connection error", e);
            }
        }
    }


如果发生了异常,就把链接还放回连接池,这样其他操作就有可能继续拿到这个链接来做事。
后来去gitHub查看com.github.tobato的Issues,发现同样有人遇到了这种情况,上面给出了2种解决方案,一种是将连接池设置为1,测试了一下可行,
但是上传效率会受影响。第二个就是作者说更新到最新的1.27.2版本,测试也是可以的,通过下载最新的1.27.2版本的源码,发现对此处做了改进,
如果抛异常之后不再将链接返回给连接池,而是移除掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值