使用Jetcache过程的bug之Buffer underflow
业务场景
- 使用Jetcache+springCloud相关组件
- 线上A服务缓存用户信息到jetcache中,但是其他服务读取不到缓存,本地可以正常获取。
猜测
- 怀疑是key错误,但是代码没更改过,排除
- 缓存失败,通过第三方查看缓存工具,确认有改缓存,排除
- Jetcache配置问题,最近没有更改过配置,排除
最后排查好久,连pom引入的依赖都一个一个排除,还是没有任何结果,简直是崩溃。后面破罐子破摔将其他服务重新打包更新,突然发现可以访问到缓存。
跟踪
- 有了希望,就跟踪Jetcache的Get方法。
1.终于发现了JetCache在get时抛异常时,会直接返回null,而抛出的异常是【Buffer underflow】,有点疑问继续跟踪下去。
default V get(K key) throws CacheInvokeException {CacheGetResult<V> result = GET(key);if (result.isSuccess()) {return result.getValue();} else {return null;}
}
2.在RedisCache实现类,取值解码。valueDecoder是一个值解码器,现在配置是KyroValueDecoder
CacheValueHolder<V> holder = (CacheValueHolder<V>) valueDecoder.apply(bytes);
3.跟踪到【KyroValueDecoder】的doApply方法。
@Override
public Object doApply(byte[] buffer) {ByteArrayInputStream in;if (useIdentityNumber) {in = new ByteArrayInputStream(buffer, 4, buffer.length - 4);} else {in = new ByteArrayInputStream(buffer);}Input input = new Input(in);Kryo kryo = (Kryo) KryoValueEncoder.kryoThreadLocal.get()[0];kryo.setClassLoader(Thread.currentThread().getContextClassLoader());return kryo.readClassAndObject(input);
}
4.会返回解析数据类型的【readClassAndObject】,最后跟踪到Input的require(1)方法报错了。
protected int require (int required) throws KryoException
错误原因
发现是因为A和B服务Core包更新不同步,导致A服务存的某个实体字段和B服务取的字段类型不一致,存是String类型,取是Int类型。
原理
最后发现是在解析数据时,会先去Buffer请求分配空间,如果已经被读完就会报 【buffer underflow】异常。发现是Int类型是4字节,32位。String是根据当前值定义长度的。比如当前存的是1,int是4字节,32位。去读取String类型,1字节,8位。就会出现这种缓存区下溢的情况了。下面是具体代码。
主要报错方法
/** Fills the buffer with more bytes. Can be overridden to fill the bytes from a source other than the InputStream.* @return -1 if there are no more bytes. */
protected int fill (byte[] buffer, int offset, int count) throws KryoException {if (inputStream == null) return -1;try {return inputStream.read(buffer, offset, count);} catch (IOException ex) {throw new KryoException(ex);}
}
Buffer underflow 定义
- 在计算中,缓冲区欠载或缓冲器下溢是当用于在两个设备或进程之间通信的缓冲器以低于从其读取数据的速度提供数据时发生的状态。这需要从缓冲区读取的程序或设备在缓冲区重新填充时暂停其处理。
心得体会
- 出现不明白的问题,跟踪下源码,多考虑下细节问题即可
使用Jetcache过程的bug之Buffer underflow相关推荐
- 【Dubbo】序列化异常—— com.esotericsoftware.kryo.KryoException: Buffer underflow
Dubbo服务通常依赖一个jar包来表示服务签名,其中包含了服务的接口定义. 服务的提供者(服务端)需实现这些接口: 服务的调用者(客户端)可以通过这些接口调用服务. 问题 此文提到的异常 " ...
- com.esotericsoftware.kryo.KryoException: Buffer underflow. 解决
用kryo进行序列化和反序列化的时候,序列化的过程很顺利,反序列化的过程中遇到报错KryoException: Buffer underflow. 代码如下: //其中path是将序列化对象保存的路径 ...
- spark:报错com.esotericsoftware.kryo.KryoException: Buffer underflow.
场景 spark-sql跑一个较大的任务,数据落盘时报错: com.esotericsoftware.kryo.KryoException: Buffer underflow. Caused by: ...
- td中bug处理过程_TD bug状态说明
Bug的处理 开发组长/经理 每天对Bug进行分配,标注处理意见,给定优先级(发版前必须三方:需求.开发.产品共同确定).问题分配时,应尽可能将咨询类.理解错误类等问题处理掉,而不是留给开发人员.有可 ...
- CWE-124: Buffer Underwrite ('Buffer Underflow') (缓冲区下界之下写入)
ID: 124 类型:基础 结构:简单 状态:未完成 描述 软件使用在缓冲区起始内存地址之前的位置索引或指针进行相应位置的写入操作. 扩展描述 这通常发生在指针或其索引递减到缓冲区起始位置之前的位置 ...
- 解决librdkafka 报WARN:Protocol read buffer underflow
https://github.com/edenhill/librdkafka/issues/1660 RT,公司的kafka更换了版本, 用到librdkafka的场景就开始报这条警告 解决方式如下: ...
- NIO:channel、buffer、状态变量、socket、charset
在开始之前 关于本教程 新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.通过定义包含数据的 ...
- ffmpeg的内部Video Buffer管理和传送机制
本文主要介绍ffmpeg解码器内部管理Video Buffer的原理和过程,ffmpeg的Videobuffer为内部管理,其流程大致为:注册处理函数->帧级释放->帧级申请->清空 ...
- 2022年国内外主流的10款Bug跟踪管理软件
这篇文章将会分享国内外主流的10款Bug跟踪管理软件,实现对对Bug报告的记录.分析和状态更新等管理,他们分别是:PingCode .ClickUp. Jira.Redmine Tool.Redmin ...
最新文章
- iscsi target 配置(服务端安装)--一
- php获取一维,二维数组长度的方法(有实例)
- 怎么知道电脑是32位还是64位_vnc 64位远程控制软件,你用的vnc 远程控制软件是32位还是64位?...
- 巴西教育科技公司Arco Educacao上市 融资1.95亿美元
- 唐尼vr眼镜好吗_裸眼3DVR和全息投影有什么区别 他们之间谁更好一些
- 全球芯片厂商今年设备支出将再增10% 超过980亿美元
- Tidal Finance在Uniswap开启流动性挖矿
- iOS应用的真机调试
- 怎么隐藏li标签_抖音账号如何打标签-7天让抖音账号打上标签
- SpringBoot作mongodb批量更新
- cvte软件测试在线测评,CVTE笔试题总结归纳
- 【大数据】分布式机器学习平台
- 无人机航拍全景图拍摄教程技巧分享
- [BZOJ4200][NOI2015]小园丁与老司机
- 【端口被占用】查看占用程序,并结束占用程序、MySQL的Unable to connect to the database问题
- 哈尔滨学计算机编程学校,哈尔滨中小学生编程学校排名
- Fortigate飞塔防火墙配置命令
- Bugku:分析 手机热点
- DCloud使用小结
- 自定义类 无极限树形结构菜单(繁杂版)