Hi,
On 2015/12/03 19:05, Kyotaro HORIGUCHI wrote:
> At Thu, 3 Dec 2015 16:24:32 +0900, Amit Langote <Langote_Amit_f8@lab.ntt.co.jp> wrote
>> By the way, there are some non-st_progress_* fields that I was talking
>> about in my previous message. For example, st_activity_flag (which I have
>> suggested to rename to st_command instead). It needs to be set once at the
>> beginning of the command processing and need not be touched again. I think
>> it may be a better idea to do the same for table name or OID. It also
>> won't change over the duration of the command execution. So, we could set
>> it once at the beginning where that becomes known. Currently in the patch,
>> it's reported in st_progress_message[0] by every pgstat_report_progress()
>> invocation. So, the table name will be strcpy()'d to shared memory for
>> every scanned block that's reported.
>
> If we don't have dedicate reporting functions for each phase
> (that is, static data phase and progress phase), the one function
> pgstat_report_progress does that by having some instruction from
> the caller and it would be a bitfield.
>
> Reading the flags for making decision whether every field to copy
> or not and branching by that seems too much for int32 (or maybe
> 64?) fields. Alhtough it would be in effective when we have
> progress_message fields, I don't think it is a good idea without
> having progress_message.
>
>> pgstat_report_progress(uint32 *param1, uint16 param1_bitmap,
>> char param2[][..], uint16 param2_bitmap)
>> {
>> ...
>> for(i = 0; i < 16 ; i++)
>> {
>> if (param1_bitmap & (1 << i))
>> beentry->st_progress_param[i] = param1[i];
>> if (param2_bitmap & (1 << i))
>> strcpy(beentry->..., param2[i]);
>> }
>
> Thoughts?
Hm, I guess progress messages would not change that much over the course
of a long-running command. How about we pass only the array(s) that we
change and NULL for others:
With the following prototype for pgstat_report_progress:
void pgstat_report_progress(uint32 *uint32_param, int num_uint32_param, bool *message_param[],
intnum_message_param);
If we just wanted to change, say scanned_heap_pages, then we report that
using:
uint32_param[1] = scanned_heap_pages;
pgstat_report_progress(uint32_param, 3, NULL, 0);
Also, pgstat_report_progress() should check each of its parameters for
NULL before iterating over to copy. So in most reports over the course of
a command, the message_param would be NULL and hence not copied.
Thanks,
Amit