如果想获取一个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的更多相关文章

  1. 一个关于内联优化和调用约定的Bug

    很久没有更新博客了(博客园怎么还不更新后台),前几天在写一个Linux 0.11的实验 [1] 时遇到了一个奇葩的Bug,就在这简单记录一下调试过程吧. 现象 这个实验要求在Linux 0.11中实现 ...

  2. 抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会

    hello,大家好呀,我是小楼. 最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊~ 他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说不定可以水,哦不.. ...

  3. 关于微信公账号H5 API 调用的坑 BUG

    页面A已经配置过,如果是单页面跳转,则页面B可以共享当前的SDK配置(至少菜单是这样的) 刷新页面,原先的菜单仍然会保持原样,只是调用SDK已经失效了,需要重新配置,重新配置后,菜单仍然会保持原样(如 ...

  4. Java调用存储过程出现Bug,sql语法错误

    因为SQL Server运行没有正常,检查了传入参数的值,发现问题,然后传入默认参数,解决了问题.

  5. 用js模拟struts2的多action调用

    近期修了几个struts2.1升级到2.3后动态方法调用失效的bug,深有感悟, 原始方法能够參考我之前的博文:struts2.1升级到2.3后动态调用方法问题 可是我那种原始方法有一个局限,就是在s ...

  6. 修改BUG心得

      修改BUG心得 分类: 项目管理/CMMI2013-01-14 22:06 845人阅读 评论(0) 收藏 举报 目录(?)[-] 一 二 三 一. 1.写第一版时就杜绝这些的发生. 2.思维要开 ...

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

    原文链接:http://click.aliyun.com/m/42521/ 摘要: 本文主要通过一个bug来记录一下如何分析一个MySQL bug的崩溃信息. 版本:Percona 5.7.17-11 ...

  8. iNeedle日志下载功能问题

    问题: iNeedle系统本身包含日志下载功能,主要是将web服务器中的用户访问日志按照一定条件进行筛选并下载,提供管理者分析.但是这次的测试中发现iNeedle日志下载一直会卡住,web界面显示正在 ...

  9. iOS-App生命周期

    iOS APP 生命周期   官方文档: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneO ...

随机推荐

  1. 2_认识STM32库

    2_认识STM32库 STM32库是由ST公司针对STM32提供的函数接口API,开发者可以调用这些函数接口来配置STM32的寄存器,使得开发人员得以脱离最底层的寄存器操作,开发快速. 库是架设在寄存 ...

  2. containing block和BFC

    1.Box Box 是 CSS 布局的对象和基本单位,元素的类型和 display 属性,决定了这个 Box 的类型.比较常见的有: block-level box:display 属性为 block ...

  3. 径向基网络(RBF network)

    来源:http://blog.csdn.net/zouxy09/article/details/13297881 1.径向基函数 径向基函数(Radical Basis Function,RBF)方法 ...

  4. pycharm安装激活

    我的版本是pycharm-professional-2016.3.3 总体的安装步骤基本没什么,就是一直下一步,下一步就行了. 重要的最后的注册,找了一堆版本,最后用的server,注册成功. 注册码 ...

  5. 技嘉 gigabyte b75m d3v 主板 定时开机无效问题解决

    BIOS 里面设置定时开机后发现到点并没有正常启动~~~  百思不得解.后来发现原来是WIN8系统下的控制面板的关机并非正常关机,而是不保存设置的非正常关机,在开始菜单右键——关闭或注销——关闭计算机 ...

  6. 使用java生成mapbox-gl可读的vector tile

    概述 mapbox-gl主要数据源来自mapbox vector tile,本文就是要阐述怎样把postgresql中的地理空间数据转换成vector tile,流程图如下: 配置 该工程采用spri ...

  7. java获取当前上一周、上一月、上一年的时间

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calend ...

  8. 雅虎公司C#笔试题及参考答案

    Question 1. (单选) 在计算机网络中,表征数据传输可靠性的指标是——21. 传输率2. 误码率3. 信息容量4. 频带利用率Question 2. (单选) 以下关于链式存储结构的叙述中哪 ...

  9. Win10下Docker学习(1)安装

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

  10. TextView SpannableString 使用之实现可点击超链接效果

    TextView SpannableString 使用之实现可点击超链接效果 如果看到这里说明你对 TextView 已经有了一定的了解,至少已经使用过该控件显示文字过.现在来实现一些复杂一点的效果. ...