postgrespro/ptrack

additional and useless loop for each relation file when do ptrack_get_pagemapset query

vegebird opened this issue · 1 comments

Hello developers, it seems that I found an issue accidentally.

When do ptrack_get_pagemapset() query, this function will get all relation files and then retrieve each file to construct its page map information.

  1. ptrack_filelist_getnext() is to get the next relation file's info, please notice this two lines (just consider only one segment file case)
    ctx->bid.blocknum = 0;
    ctx->relsize = fst.st_size / BLCKSZ;
  2. ptrack_get_pagemapset() will do loop to check whether there're this block's update lsn or not, please notice the loop condition:
    /* Stop traversal if there are no more segments */
    if (ctx->bid.blocknum > ctx->relsize) { complete this segment to output, and get next relation file to loop }

Obviously, if (ctx->bid.blocknum > ctx->relsize) should be if (ctx->bid.blocknum + 1 >= ctx->relsize) ?

And another small question: maybe ctx->relsize will be better named blknums?

If I miss some points and this is not an issue, apology for my disturbance.

Regards,
Bird

And another small question:

In function ptrack_get_pagemapset()

while (true)
{
    /* Stop traversal if there are no more segments */
    if (ctx->bid.blocknum > ctx->relsize)
    {
        /* We completed a segment and there is a bitmap to return */
        if (pagemap.bitmap != NULL)
        {
              /* make tuple output */
                       **<------------------------- also need to get the next relation file ?**
        }
        else        **<------------------------ remove the "else" ?** 
        {
            /* We have just processed unchanged file, let's pick next */
            if (ptrack_filelist_getnext(ctx) < 0)
                 SRF_RETURN_DONE(funcctx);
        }
    }
    // do hash, get update lsn
   ctx->bid.blocknum += 1;
}