关于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。

这个里面还有别的问题。后面再写。  

时间: 2024-10-26 04:37:57

关于pipelineDB调用GetLocalStreamReaders的BUG的相关文章

oracle存储过程及Java调用

初次研究出bug的地方非常多,所以注意点非常多,花了我三天时间除尽所有bug,我会把注意点都列出来,可能有落下的地方,还请多指正,相互探讨. 首先上最终测试成功版存储过程代码:(里面代码可能不尽对你都有用,借鉴参考吧,我全贴出来也是为了我以后好查) 说一下jar包用的是ojdbc14.jar,至于什么class12.jar.ojdbc6.jar啊应该都可以,只要一种就可以了. 说说我的需求,以便让大家更顺利的看懂我的代码,我的需求是:存储过程从Java端接收两个参数userid(用户)和topi

修改BUG心得

修改BUG心得 分类: 项目管理/CMMI2013-01-14 22:06 845人阅读 评论(0) 收藏 举报 目录(?)[-] 一 二 三 一. 1.写第一版时就杜绝这些的发生. 2.思维要开阔, 3.修改BUG,写代码的人都很厉害,不管是写界面还是底层.不要以人做的模块的难易来断定人. 二. 今天让项目经理找到些bug,但都是无关紧要的,最主要是因为在作页面的时候,业务逻辑不是很清晰,需求描述的不好,所以我自己做起来也有麻烦,当然,不是我没错,只是以后我做项目经理,对以后自己下属的要求,就

MySQL Bug导致异常宕机的分析流程

原文链接:http://click.aliyun.com/m/42521/ 摘要: 本文主要通过一个bug来记录一下如何分析一个MySQL bug的崩溃信息. 版本:Percona 5.7.17-11 一.数据库重启日志分析 terminate called after throwing an instance of 'std::out_of_range' what(): ... 本文主要通过一个bug来记录一下如何分析一个MySQL bug的崩溃信息. 版本:Percona 5.7.17-11

Swift和C混合Socket编程实现简单的ping命令

这个是用Mac下的Network Utility工具实现ping命令,用Wireshark抓取的ICMP数据包: 发送ICMP数据包内容 接受ICMP数据包内容 一.icmp结构 要真正了解ping命令实现原理,就要了解ping命令所使用到的TCP/IP协议.ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方.ICMP协议是IP层的 一个协议,但是由于差错报告在发送给报文源发方时可能

用户登陆总结

/* GET输入汉字会崩,url没有添加%转义stringByAddingPercentEscapesUsingEncoding post不用%转义也不会崩,要设置HTTPMothed 设置请求体 目标:搭接面,在UI界面输入用户名和密码,不要在代码里面输入,return处理 目标:自动登录 用偏好设置保存 问题:账号和密码不能明文保存 目标:base64编码 A->QQ== 没补两个0,加一个等号, 如果有返回值,调用方法直接得到加密好的字符串 如果没返回值,打印不出来,在内部加密了没有返回结

iOS APP 生命周期

官方文档: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html#//apple_ref/doc/uid/TP40007072-CH2-SW1 基本要点: 一 入口函数为main函数,一般不需要更改: 发散点:看main函数,可以注意到加上了@autoreleasepool. 实际上如

基于one2team框架的Highcharts图表图片导出方案

这篇文章已经没有什么意义了,新版的HIghcharts提供Java图片导出解决方案,你需要做的就是下个Maven,bulid一个war就Ok了.---addedy on 2012-11-15 多说一句废话:我觉得这个功能其实对于大多数应用场景来说是多余的. Highcharts是一个纯JSWeb图表绘制解决方案,它的功能之丰富,使用之简单可能是目前开源领域排名比较考前的优秀解决方案,它对个人使用是免费的. 它的默认版本也有图片导出功能,不过导出服务器是Highcharts官方服务器,我开发的过程

Android 热补丁动态修复框架小结

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49883661: 本文出自:[张鸿洋的博客] 一.概述 最新github上开源了很多热补丁动态修复框架,大致有: https://github.com/dodola/HotFix https://github.com/jasonross/Nuwa https://github.com/bunnyblue/DroidFix 上述三个框架呢,根据其描述,原理都来自:安卓App热补丁

android异常:Can not perform this action after onSaveInstanc

extends:http://zhiweiofli.iteye.com/blog/1539467 本人某个android项目开发阶段一直运行良好,直到上线前夕,在某款跑着android 4.03系统的手机运行却报出一下异常,导致force close:java.lang.IllegalStateException: Can not perform this action after onSaveInstance! 首先得了解一下我那项目的一些基本情况,UI结构是TabActivity包含着5个T