关于pipelineDB调用GetLocalStreamReaders的BUG
如果想获取一个stream所有的reader,那么必须调用这个函数:
Bitmapset *targets = GetLocalStreamReaders(relid);
如果stream下面没有reader,那么这个targets返回NULL。
我们跟到GetLocalStreamReaders里面看看
Bitmapset *
GetLocalStreamReaders(Oid relid)
{
Bitmapset *readers = GetAllStreamReaders(relid); if (stream_targets && readers)
{
.....
}
return readers;
}
中间的if不看,这个readers是通过调用GetAllStreamReaders来获取的,我们继续跟进去看看。
Bitmapset *
GetAllStreamReaders(Oid relid)
{
HeapTuple tup = SearchSysCache1(PIPELINESTREAMRELID, ObjectIdGetDatum(relid));
bool isnull; ..... raw = SysCacheGetAttr(PIPELINESTREAMRELID, tup, Anum_pipeline_stream_queries, &isnull); if (isnull)
return NULL; ...... ReleaseSysCache(tup); return result;
}
这段代码就很有意思了。
如果isnull直接return,而后面的ReleaseSysCaceh没有执行。
这样上面的tup就一直存在,没有释放掉。
这样会导致后面的一个断言错误。
来看看下面堆栈信息。
TRAP: FailedAssertion("!(ct->refcount == 0)", File: "catcache.c", Line: 588, PID: 3829, Query: (null))
assertion failure at:
pipeline: bgworker: worker [postgres] (ExceptionalCondition+0xaf)[0x906b0f]
pipeline: bgworker: worker [postgres] (AtEOXact_CatCache+0x1e6)[0x8eb735]
pipeline: bgworker: worker [postgres] [0x4fe75a]
pipeline: bgworker: worker [postgres] (CommitTransactionCommand+0x72)[0x4ff19c]
pipeline: bgworker: worker [postgres] (ContinuousQueryWorkerMain+0x6cd)[0x7366a1]
pipeline: bgworker: worker [postgres] [0x7343f9]
pipeline: bgworker: worker [postgres] (StartBackgroundWorker+0x2bd)[0x7427ea]
pipeline: bgworker: worker [postgres] [0x75532a]
pipeline: bgworker: worker [postgres] [0x755646]
pipeline: bgworker: worker [postgres] [0x750473]
pipeline: bgworker: worker [postgres] (PostmasterMain+0x110c)[0x74f92a]
pipeline: bgworker: worker [postgres] [0x694f85]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fb8eb84caf5]
pipeline: bgworker: worker [postgres] [0x462e09]
我们看看catcache.c:588
582 dlist_foreach(iter, bucket)
583 {
584 CatCTup *ct;
585
586 ct = dlist_container(CatCTup, cache_elem, iter.cur);
587 Assert(ct->ct_magic == CT_MAGIC);
588 Assert(ct->refcount == 0);
589 Assert(!ct->dead);
590 }
我们看看ct->refcount的解释:
int refcount; /* number of active references */
这其实跟我修改的代码有关系,我们从上面堆栈信息分析。
ContinuousQueryWorkerMain-->CommitTransactionCommand
我在ContinuousQueryWorkerMain里面自己调用了
Bitmapset *targets = GetLocalStreamReaders(relid);
而我判断targets的时候,
if (!targets) {
donothing...
}
我特意看了一下官方的用法。
src/backend/pipeline/stream.c:200
if (targets == NULL)
{
char *name = get_rel_name(pstmt->relid);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("no continuous views are currently reading from stream %s", name),
errhint("Use CREATE CONTINUOUS VIEW to create a continuous view that includes %s in its FROM clause.", name)));
}
很清楚的看到,这个里面直接丢了个ERROR,
直接abort,这样就不会像我上面堆栈信息那样,后面commit就会断言异常。
话说,一个stream下面没有readers是很正常的,但是这么明显是代码有错误,该释放的没有释放。
修改如下:
src/backend/catalog/pipeline_stream.c
GetAllStreamReaders函数
if (isnull)
return NULL;
修改成
if (isnull){
ReleaseSysCache(tup);
return NULL;
}
这样在返回的时候就直接释放了tup。
这个里面还有别的问题。后面再写。
关于pipelineDB调用GetLocalStreamReaders的BUG的更多相关文章
- 一个关于内联优化和调用约定的Bug
很久没有更新博客了(博客园怎么还不更新后台),前几天在写一个Linux 0.11的实验 [1] 时遇到了一个奇葩的Bug,就在这简单记录一下调试过程吧. 现象 这个实验要求在Linux 0.11中实现 ...
- 抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会
hello,大家好呀,我是小楼. 最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊~ 他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说不定可以水,哦不.. ...
- 关于微信公账号H5 API 调用的坑 BUG
页面A已经配置过,如果是单页面跳转,则页面B可以共享当前的SDK配置(至少菜单是这样的) 刷新页面,原先的菜单仍然会保持原样,只是调用SDK已经失效了,需要重新配置,重新配置后,菜单仍然会保持原样(如 ...
- Java调用存储过程出现Bug,sql语法错误
因为SQL Server运行没有正常,检查了传入参数的值,发现问题,然后传入默认参数,解决了问题.
- 用js模拟struts2的多action调用
近期修了几个struts2.1升级到2.3后动态方法调用失效的bug,深有感悟, 原始方法能够參考我之前的博文:struts2.1升级到2.3后动态调用方法问题 可是我那种原始方法有一个局限,就是在s ...
- 修改BUG心得
修改BUG心得 分类: 项目管理/CMMI2013-01-14 22:06 845人阅读 评论(0) 收藏 举报 目录(?)[-] 一 二 三 一. 1.写第一版时就杜绝这些的发生. 2.思维要开 ...
- MySQL Bug导致异常宕机的分析流程
原文链接:http://click.aliyun.com/m/42521/ 摘要: 本文主要通过一个bug来记录一下如何分析一个MySQL bug的崩溃信息. 版本:Percona 5.7.17-11 ...
- iNeedle日志下载功能问题
问题: iNeedle系统本身包含日志下载功能,主要是将web服务器中的用户访问日志按照一定条件进行筛选并下载,提供管理者分析.但是这次的测试中发现iNeedle日志下载一直会卡住,web界面显示正在 ...
- iOS-App生命周期
iOS APP 生命周期 官方文档: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneO ...
随机推荐
- JDBC连接池-C池3P0连接
JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版 c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池 三种方 ...
- 纯js实现DIV拖拽
写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神张鑫旭的一篇文章<JavaScript实现最简单的拖拽效果>,便直接拿来使用(膜拜大神).但 ...
- IdentityServer4 禁用 Consent screen page(权限确认页面)
IdentityServer4 在登录完成的适合,会再跳转一次页面(权限确认),如下: 我之前以为 IdentityServer4 就是这样使用的,但实际业务场景并不需要进行权限确认,而是登陆成功后直 ...
- 【翻译】.Net Core的意义
想要了解.Net Core的意义,就必须要了解拥有很长历史的.Net Framework,.Net Framework1.0于2002年发布.从那开始,每隔两年就会有一个主版本推出.伴随着Visual ...
- String类型
String字符串的length属性返回的是该字符串里面16位字符的数量,如果字符串包含double-byte的字符,那么返回的数量可能不对 字符串一旦创建就修改不了 var lang = “Ja ...
- 浅谈字体小图标font awesome,iconfont,svg各自优缺点
三种都是矢量图(即放大不失真),但是个自又有个自的优缺点, 1.font awesome: 优点:相对比较简单,查看官网看例子基本上都会用 (http://www.bootcss.com/p/font ...
- cursor() — 数据库连接操作 python
python 操作数据库,要安装一个Python和数据库交互的包MySQL-python-1.2.2.win32-py2.5.exe,然后我们就可以使用MySQLdb这个包进行数据库操作了. ...
- 休息,归类一下CSS初级的东西
css基础的东西集中体现在了"磊盒子"这一个枯燥无味的东西上面,灵活的运用盒子的内外边距,浮动,定位以及一些基础的属性,将一个静态的页面变得磊出来,这是CSS基础的练习. 在css ...
- 记录一下通过分析Tomcat内部jar包找出request.getReader()所用的字符编码在哪里设置和起效的完整分析流程
前言: 之前写Java服务端处理POST请求时遇到了请求体转换成字符流所用编码来源的疑惑,在doPost方法里通过request.getReader()获取的BufferedReader对象内部的 R ...
- x01.AntWorld: An Python AI Game
1. 学习了一下 AI 五子棋,顺手改作 19 路的棋盘,便于围棋通用.render.py 主要修改如下: # 常量部分: IMAGE_PATH = 'img/' StoneSize = 32 WID ...