Introduce XID age and inactive timeout based replication slot invalidation

Started by Bharath Rupireddyabout 2 years ago414 messages
Jump to latest
#1Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com

Hi,

Replication slots in postgres will prevent removal of required
resources when there is no connection using them (inactive). This
consumes storage because neither required WAL nor required rows from
the user tables/system catalogs can be removed by VACUUM as long as
they are required by a replication slot. In extreme cases this could
cause the transaction ID wraparound.

Currently postgres has the ability to invalidate inactive replication
slots based on the amount of WAL (set via max_slot_wal_keep_size GUC)
that will be needed for the slots in case they become active. However,
the wraparound issue isn't effectively covered by
max_slot_wal_keep_size - one can't tell postgres to invalidate a
replication slot if it is blocking VACUUM. Also, it is often tricky to
choose a default value for max_slot_wal_keep_size, because the amount
of WAL that gets generated and allocated storage for the database can
vary.

Therefore, it is often easy for developers to do the following:
a) set an XID age (age of slot's xmin or catalog_xmin) of say 1 or 1.5
billion, after which the slots get invalidated.
b) set a timeout of say 1 or 2 or 3 days, after which the inactive
slots get invalidated.

To implement (a), postgres needs a new GUC called max_slot_xid_age.
The checkpointer then invalidates all the slots whose xmin (the oldest
transaction that this slot needs the database to retain) or
catalog_xmin (the oldest transaction affecting the system catalogs
that this slot needs the database to retain) has reached the age
specified by this setting.

To implement (b), first postgres needs to track the replication slot
metrics like the time at which the slot became inactive (inactive_at
timestamptz) and the total number of times the slot became inactive in
its lifetime (inactive_count numeric) in ReplicationSlotPersistentData
structure. And, then it needs a new timeout GUC called
inactive_replication_slot_timeout. Whenever a slot becomes inactive,
the current timestamp and inactive count are stored in
ReplicationSlotPersistentData structure and persisted to disk. The
checkpointer then invalidates all the slots that are lying inactive
for about inactive_replication_slot_timeout duration starting from
inactive_at.

In addition to implementing (b), these two new metrics enable
developers to improve their monitoring tools as the metrics are
exposed via pg_replication_slots system view. For instance, one can
build a monitoring tool that signals when replication slots are lying
inactive for a day or so using inactive_at metric, and/or when a
replication slot is becoming inactive too frequently using inactive_at
metric.

I’m attaching the v1 patch set as described below:
0001 - Tracks invalidation_reason in pg_replication_slots. This is
needed because slots now have multiple reasons for slot invalidation.
0002 - Tracks inactive replication slot information inactive_at and
inactive_timeout.
0003 - Adds inactive_timeout based replication slot invalidation.
0004 - Adds XID based replication slot invalidation.

Thoughts?

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

Attachments:

v1-0001-Track-invalidation_reason-in-pg_replication_slots.patchapplication/octet-stream; name=v1-0001-Track-invalidation_reason-in-pg_replication_slots.patchDownload+44-49
v1-0002-Track-inactive-replication-slot-information.patchapplication/octet-stream; name=v1-0002-Track-inactive-replication-slot-information.patchDownload+91-19
v1-0003-Add-inactive_timeout-based-replication-slot-inval.patchapplication/octet-stream; name=v1-0003-Add-inactive_timeout-based-replication-slot-inval.patchDownload+156-4
v1-0004-Add-XID-based-replication-slot-invalidation.patchapplication/octet-stream; name=v1-0004-Add-XID-based-replication-slot-invalidation.patchDownload+170-1
#2Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bharath Rupireddy (#1)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Thu, Jan 11, 2024 at 10:48 AM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

Hi,

Replication slots in postgres will prevent removal of required
resources when there is no connection using them (inactive). This
consumes storage because neither required WAL nor required rows from
the user tables/system catalogs can be removed by VACUUM as long as
they are required by a replication slot. In extreme cases this could
cause the transaction ID wraparound.

Currently postgres has the ability to invalidate inactive replication
slots based on the amount of WAL (set via max_slot_wal_keep_size GUC)
that will be needed for the slots in case they become active. However,
the wraparound issue isn't effectively covered by
max_slot_wal_keep_size - one can't tell postgres to invalidate a
replication slot if it is blocking VACUUM. Also, it is often tricky to
choose a default value for max_slot_wal_keep_size, because the amount
of WAL that gets generated and allocated storage for the database can
vary.

Therefore, it is often easy for developers to do the following:
a) set an XID age (age of slot's xmin or catalog_xmin) of say 1 or 1.5
billion, after which the slots get invalidated.
b) set a timeout of say 1 or 2 or 3 days, after which the inactive
slots get invalidated.

To implement (a), postgres needs a new GUC called max_slot_xid_age.
The checkpointer then invalidates all the slots whose xmin (the oldest
transaction that this slot needs the database to retain) or
catalog_xmin (the oldest transaction affecting the system catalogs
that this slot needs the database to retain) has reached the age
specified by this setting.

To implement (b), first postgres needs to track the replication slot
metrics like the time at which the slot became inactive (inactive_at
timestamptz) and the total number of times the slot became inactive in
its lifetime (inactive_count numeric) in ReplicationSlotPersistentData
structure. And, then it needs a new timeout GUC called
inactive_replication_slot_timeout. Whenever a slot becomes inactive,
the current timestamp and inactive count are stored in
ReplicationSlotPersistentData structure and persisted to disk. The
checkpointer then invalidates all the slots that are lying inactive
for about inactive_replication_slot_timeout duration starting from
inactive_at.

In addition to implementing (b), these two new metrics enable
developers to improve their monitoring tools as the metrics are
exposed via pg_replication_slots system view. For instance, one can
build a monitoring tool that signals when replication slots are lying
inactive for a day or so using inactive_at metric, and/or when a
replication slot is becoming inactive too frequently using inactive_at
metric.

I’m attaching the v1 patch set as described below:
0001 - Tracks invalidation_reason in pg_replication_slots. This is
needed because slots now have multiple reasons for slot invalidation.
0002 - Tracks inactive replication slot information inactive_at and
inactive_timeout.
0003 - Adds inactive_timeout based replication slot invalidation.
0004 - Adds XID based replication slot invalidation.

Thoughts?

Needed a rebase due to c393308b. Please find the attached v2 patch set.

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

Attachments:

v2-0001-Track-invalidation_reason-in-pg_replication_slots.patchapplication/x-patch; name=v2-0001-Track-invalidation_reason-in-pg_replication_slots.patchDownload+44-49
v2-0002-Track-inactive-replication-slot-information.patchapplication/x-patch; name=v2-0002-Track-inactive-replication-slot-information.patchDownload+91-19
v2-0003-Add-inactive_timeout-based-replication-slot-inval.patchapplication/x-patch; name=v2-0003-Add-inactive_timeout-based-replication-slot-inval.patchDownload+156-4
v2-0004-Add-XID-based-replication-slot-invalidation.patchapplication/x-patch; name=v2-0004-Add-XID-based-replication-slot-invalidation.patchDownload+170-1
#3Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bharath Rupireddy (#2)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Sat, Jan 27, 2024 at 1:18 AM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

On Thu, Jan 11, 2024 at 10:48 AM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

Hi,

Replication slots in postgres will prevent removal of required
resources when there is no connection using them (inactive). This
consumes storage because neither required WAL nor required rows from
the user tables/system catalogs can be removed by VACUUM as long as
they are required by a replication slot. In extreme cases this could
cause the transaction ID wraparound.

Currently postgres has the ability to invalidate inactive replication
slots based on the amount of WAL (set via max_slot_wal_keep_size GUC)
that will be needed for the slots in case they become active. However,
the wraparound issue isn't effectively covered by
max_slot_wal_keep_size - one can't tell postgres to invalidate a
replication slot if it is blocking VACUUM. Also, it is often tricky to
choose a default value for max_slot_wal_keep_size, because the amount
of WAL that gets generated and allocated storage for the database can
vary.

Therefore, it is often easy for developers to do the following:
a) set an XID age (age of slot's xmin or catalog_xmin) of say 1 or 1.5
billion, after which the slots get invalidated.
b) set a timeout of say 1 or 2 or 3 days, after which the inactive
slots get invalidated.

To implement (a), postgres needs a new GUC called max_slot_xid_age.
The checkpointer then invalidates all the slots whose xmin (the oldest
transaction that this slot needs the database to retain) or
catalog_xmin (the oldest transaction affecting the system catalogs
that this slot needs the database to retain) has reached the age
specified by this setting.

To implement (b), first postgres needs to track the replication slot
metrics like the time at which the slot became inactive (inactive_at
timestamptz) and the total number of times the slot became inactive in
its lifetime (inactive_count numeric) in ReplicationSlotPersistentData
structure. And, then it needs a new timeout GUC called
inactive_replication_slot_timeout. Whenever a slot becomes inactive,
the current timestamp and inactive count are stored in
ReplicationSlotPersistentData structure and persisted to disk. The
checkpointer then invalidates all the slots that are lying inactive
for about inactive_replication_slot_timeout duration starting from
inactive_at.

In addition to implementing (b), these two new metrics enable
developers to improve their monitoring tools as the metrics are
exposed via pg_replication_slots system view. For instance, one can
build a monitoring tool that signals when replication slots are lying
inactive for a day or so using inactive_at metric, and/or when a
replication slot is becoming inactive too frequently using inactive_at
metric.

I’m attaching the v1 patch set as described below:
0001 - Tracks invalidation_reason in pg_replication_slots. This is
needed because slots now have multiple reasons for slot invalidation.
0002 - Tracks inactive replication slot information inactive_at and
inactive_timeout.
0003 - Adds inactive_timeout based replication slot invalidation.
0004 - Adds XID based replication slot invalidation.

Thoughts?

Needed a rebase due to c393308b. Please find the attached v2 patch set.

Needed a rebase due to commit 776621a (conflict in
src/test/recovery/meson.build for new TAP test file added). Please
find the attached v3 patch set.

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

Attachments:

v3-0004-Add-XID-based-replication-slot-invalidation.patchapplication/x-patch; name=v3-0004-Add-XID-based-replication-slot-invalidation.patchDownload+170-1
v3-0002-Track-inactive-replication-slot-information.patchapplication/x-patch; name=v3-0002-Track-inactive-replication-slot-information.patchDownload+91-19
v3-0001-Track-invalidation_reason-in-pg_replication_slots.patchapplication/x-patch; name=v3-0001-Track-invalidation_reason-in-pg_replication_slots.patchDownload+44-49
v3-0003-Add-inactive_timeout-based-replication-slot-inval.patchapplication/x-patch; name=v3-0003-Add-inactive_timeout-based-replication-slot-inval.patchDownload+156-4
#4Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#1)
Re: Introduce XID age and inactive timeout based replication slot invalidation

Hi,

On Thu, Jan 11, 2024 at 10:48:13AM +0530, Bharath Rupireddy wrote:

Hi,

Therefore, it is often easy for developers to do the following:
a) set an XID age (age of slot's xmin or catalog_xmin) of say 1 or 1.5
billion, after which the slots get invalidated.
b) set a timeout of say 1 or 2 or 3 days, after which the inactive
slots get invalidated.

To implement (a), postgres needs a new GUC called max_slot_xid_age.
The checkpointer then invalidates all the slots whose xmin (the oldest
transaction that this slot needs the database to retain) or
catalog_xmin (the oldest transaction affecting the system catalogs
that this slot needs the database to retain) has reached the age
specified by this setting.

To implement (b), first postgres needs to track the replication slot
metrics like the time at which the slot became inactive (inactive_at
timestamptz) and the total number of times the slot became inactive in
its lifetime (inactive_count numeric) in ReplicationSlotPersistentData
structure. And, then it needs a new timeout GUC called
inactive_replication_slot_timeout. Whenever a slot becomes inactive,
the current timestamp and inactive count are stored in
ReplicationSlotPersistentData structure and persisted to disk. The
checkpointer then invalidates all the slots that are lying inactive
for about inactive_replication_slot_timeout duration starting from
inactive_at.

In addition to implementing (b), these two new metrics enable
developers to improve their monitoring tools as the metrics are
exposed via pg_replication_slots system view. For instance, one can
build a monitoring tool that signals when replication slots are lying
inactive for a day or so using inactive_at metric, and/or when a
replication slot is becoming inactive too frequently using inactive_at
metric.

Thanks for the patch and +1 for the idea, I think adding those new
"invalidation reasons" make sense.

I’m attaching the v1 patch set as described below:
0001 - Tracks invalidation_reason in pg_replication_slots. This is
needed because slots now have multiple reasons for slot invalidation.
0002 - Tracks inactive replication slot information inactive_at and
inactive_timeout.
0003 - Adds inactive_timeout based replication slot invalidation.
0004 - Adds XID based replication slot invalidation.

I think it's better to have the XID one being discussed/implemented before the
inactive_timeout one: what about changing the 0002, 0003 and 0004 ordering?

0004 -> 0002
0002 -> 0003
0003 -> 0004

As far 0001:

"
This commit renames conflict_reason to
invalidation_reason, and adds the support to show invalidation
reasons for both physical and logical slots.
"

I'm not sure I like the fact that "invalidations" and "conflicts" are merged
into a single field. I'd vote to keep conflict_reason as it is and add a new
invalidation_reason (and put "conflict" as value when it is the case). The reason
is that I think they are 2 different concepts (could be linked though) and that
it would be easier to check for conflicts (means conflict_reason is not NULL).

Regards,

--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

#5Dilip Kumar
dilipbalaut@gmail.com
In reply to: Bharath Rupireddy (#1)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Thu, Jan 11, 2024 at 10:48 AM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

Hi,

Replication slots in postgres will prevent removal of required
resources when there is no connection using them (inactive). This
consumes storage because neither required WAL nor required rows from
the user tables/system catalogs can be removed by VACUUM as long as
they are required by a replication slot. In extreme cases this could
cause the transaction ID wraparound.

Currently postgres has the ability to invalidate inactive replication
slots based on the amount of WAL (set via max_slot_wal_keep_size GUC)
that will be needed for the slots in case they become active. However,
the wraparound issue isn't effectively covered by
max_slot_wal_keep_size - one can't tell postgres to invalidate a
replication slot if it is blocking VACUUM. Also, it is often tricky to
choose a default value for max_slot_wal_keep_size, because the amount
of WAL that gets generated and allocated storage for the database can
vary.

Therefore, it is often easy for developers to do the following:
a) set an XID age (age of slot's xmin or catalog_xmin) of say 1 or 1.5
billion, after which the slots get invalidated.
b) set a timeout of say 1 or 2 or 3 days, after which the inactive
slots get invalidated.

To implement (a), postgres needs a new GUC called max_slot_xid_age.
The checkpointer then invalidates all the slots whose xmin (the oldest
transaction that this slot needs the database to retain) or
catalog_xmin (the oldest transaction affecting the system catalogs
that this slot needs the database to retain) has reached the age
specified by this setting.

To implement (b), first postgres needs to track the replication slot
metrics like the time at which the slot became inactive (inactive_at
timestamptz) and the total number of times the slot became inactive in
its lifetime (inactive_count numeric) in ReplicationSlotPersistentData
structure. And, then it needs a new timeout GUC called
inactive_replication_slot_timeout. Whenever a slot becomes inactive,
the current timestamp and inactive count are stored in
ReplicationSlotPersistentData structure and persisted to disk. The
checkpointer then invalidates all the slots that are lying inactive
for about inactive_replication_slot_timeout duration starting from
inactive_at.

In addition to implementing (b), these two new metrics enable
developers to improve their monitoring tools as the metrics are
exposed via pg_replication_slots system view. For instance, one can
build a monitoring tool that signals when replication slots are lying
inactive for a day or so using inactive_at metric, and/or when a
replication slot is becoming inactive too frequently using inactive_at
metric.

I’m attaching the v1 patch set as described below:
0001 - Tracks invalidation_reason in pg_replication_slots. This is
needed because slots now have multiple reasons for slot invalidation.
0002 - Tracks inactive replication slot information inactive_at and
inactive_timeout.
0003 - Adds inactive_timeout based replication slot invalidation.
0004 - Adds XID based replication slot invalidation.

Thoughts?

+1 for the idea, here are some comments on 0002, I will review other
patches soon and respond.

1.
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>inactive_at</structfield> <type>timestamptz</type>
+      </para>
+      <para>
+        The time at which the slot became inactive.
+        <literal>NULL</literal> if the slot is currently actively being
+        used.
+      </para></entry>
+     </row>

Maybe we can change the field name to 'last_inactive_at'? or maybe the
comment can explain timestampt at which slot was last inactivated.
I think since we are already maintaining the inactive_count so better
to explicitly say this is the last invaliding time.

2.
+ /*
+ * XXX: Can inactive_count of type uint64 ever overflow? It takes
+ * about a half-billion years for inactive_count to overflow even
+ * if slot becomes inactive for every 1 millisecond. So, using
+ * pg_add_u64_overflow might be an overkill.
+ */

Correct we don't need to use pg_add_u64_overflow for this counter.

3.

+
+ /* Convert to numeric. */
+ snprintf(buf, sizeof buf, UINT64_FORMAT, slot_contents.data.inactive_count);
+ values[i++] = DirectFunctionCall3(numeric_in,
+   CStringGetDatum(buf),
+   ObjectIdGetDatum(0),
+   Int32GetDatum(-1));

What is the purpose of doing this? I mean inactive_count is 8 byte
integer and you can define function outparameter as 'int8' which is 8
byte integer. Then you don't need to convert int to string and then
to numeric?

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

#6Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Dilip Kumar (#5)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Tue, Feb 6, 2024 at 2:16 PM Dilip Kumar <dilipbalaut@gmail.com> wrote:

Thoughts?

+1 for the idea, here are some comments on 0002, I will review other
patches soon and respond.

Thanks for looking at it.

+ <structfield>inactive_at</structfield> <type>timestamptz</type>

Maybe we can change the field name to 'last_inactive_at'? or maybe the
comment can explain timestampt at which slot was last inactivated.
I think since we are already maintaining the inactive_count so better
to explicitly say this is the last invaliding time.

last_inactive_at looks better, so will use that in the next version of
the patch.

2.
+ /*
+ * XXX: Can inactive_count of type uint64 ever overflow? It takes
+ * about a half-billion years for inactive_count to overflow even
+ * if slot becomes inactive for every 1 millisecond. So, using
+ * pg_add_u64_overflow might be an overkill.
+ */

Correct we don't need to use pg_add_u64_overflow for this counter.

Will remove this comment in the next version of the patch.

+ /* Convert to numeric. */
+ snprintf(buf, sizeof buf, UINT64_FORMAT, slot_contents.data.inactive_count);
+ values[i++] = DirectFunctionCall3(numeric_in,
+   CStringGetDatum(buf),
+   ObjectIdGetDatum(0),
+   Int32GetDatum(-1));

What is the purpose of doing this? I mean inactive_count is 8 byte
integer and you can define function outparameter as 'int8' which is 8
byte integer. Then you don't need to convert int to string and then
to numeric?

Nope, it's of type uint64, so reporting it as numeric is a way
typically used elsewhere - see code around /* Convert to numeric. */.

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

#7Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#4)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Mon, Feb 5, 2024 at 3:15 PM Bertrand Drouvot
<bertranddrouvot.pg@gmail.com> wrote:

Thanks for the patch and +1 for the idea, I think adding those new
"invalidation reasons" make sense.

Thanks for looking at it.

I think it's better to have the XID one being discussed/implemented before the
inactive_timeout one: what about changing the 0002, 0003 and 0004 ordering?

0004 -> 0002
0002 -> 0003
0003 -> 0004

Done that way.

As far 0001:

"
This commit renames conflict_reason to
invalidation_reason, and adds the support to show invalidation
reasons for both physical and logical slots.
"

I'm not sure I like the fact that "invalidations" and "conflicts" are merged
into a single field. I'd vote to keep conflict_reason as it is and add a new
invalidation_reason (and put "conflict" as value when it is the case). The reason
is that I think they are 2 different concepts (could be linked though) and that
it would be easier to check for conflicts (means conflict_reason is not NULL).

So, do you want conflict_reason for only logical slots, and a separate
column for invalidation_reason for both logical and physical slots? Is
there any strong reason to have two properties "conflict" and
"invalidated" for slots? They both are the same internally, so why
confuse the users?

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

Attachments:

v4-0004-Add-inactive_timeout-based-replication-slot.patchapplication/x-patch; name=v4-0004-Add-inactive_timeout-based-replication-slot.patchDownload+135-1
v4-0003-Track-inactive-replication-slot-information.patchapplication/x-patch; name=v4-0003-Track-inactive-replication-slot-information.patchDownload+84-19
v4-0002-Add-XID-based-replication-slot-invalidation.patchapplication/x-patch; name=v4-0002-Add-XID-based-replication-slot-invalidation.patchDownload+191-1
v4-0001-Track-invalidation_reason-in-pg_replication_slots.patchapplication/x-patch; name=v4-0001-Track-invalidation_reason-in-pg_replication_slots.patchDownload+44-49
#8Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#7)
Re: Introduce XID age and inactive timeout based replication slot invalidation

Hi,

On Wed, Feb 07, 2024 at 12:22:07AM +0530, Bharath Rupireddy wrote:

On Mon, Feb 5, 2024 at 3:15 PM Bertrand Drouvot
<bertranddrouvot.pg@gmail.com> wrote:

I'm not sure I like the fact that "invalidations" and "conflicts" are merged
into a single field. I'd vote to keep conflict_reason as it is and add a new
invalidation_reason (and put "conflict" as value when it is the case). The reason
is that I think they are 2 different concepts (could be linked though) and that
it would be easier to check for conflicts (means conflict_reason is not NULL).

So, do you want conflict_reason for only logical slots, and a separate
column for invalidation_reason for both logical and physical slots?

Yes, with "conflict" as value in case of conflicts (and one would need to refer
to the conflict_reason reason to see the reason).

Is there any strong reason to have two properties "conflict" and
"invalidated" for slots?

I think "conflict" is an important topic and does contain several reasons. The
slot "first" conflict and then leads to slot "invalidation".

They both are the same internally, so why
confuse the users?

I don't think that would confuse the users, I do think that would be easier to
check for conflicting slots.

I did not look closely at the code, just played a bit with the patch and was able
to produce something like:

postgres=# select slot_name,slot_type,active,active_pid,wal_status,invalidation_reason from pg_replication_slots;
slot_name | slot_type | active | active_pid | wal_status | invalidation_reason
-------------+-----------+--------+------------+------------+---------------------
rep1 | physical | f | | reserved |
master_slot | physical | t | 1482441 | unreserved | wal_removed
(2 rows)

does that make sense to have an "active/working" slot "ivalidated"?

Regards,

--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

#9Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#8)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Fri, Feb 9, 2024 at 1:12 PM Bertrand Drouvot
<bertranddrouvot.pg@gmail.com> wrote:

I think "conflict" is an important topic and does contain several reasons. The
slot "first" conflict and then leads to slot "invalidation".

They both are the same internally, so why
confuse the users?

I don't think that would confuse the users, I do think that would be easier to
check for conflicting slots.

I've added a separate column for invalidation reasons for now. I'll
see how others think on this as the time goes by.

I did not look closely at the code, just played a bit with the patch and was able
to produce something like:

postgres=# select slot_name,slot_type,active,active_pid,wal_status,invalidation_reason from pg_replication_slots;
slot_name | slot_type | active | active_pid | wal_status | invalidation_reason
-------------+-----------+--------+------------+------------+---------------------
rep1 | physical | f | | reserved |
master_slot | physical | t | 1482441 | unreserved | wal_removed
(2 rows)

does that make sense to have an "active/working" slot "ivalidated"?

Thanks. Can you please provide the steps to generate this error? Are
you setting max_slot_wal_keep_size on primary to generate
"wal_removed"?

Attached v5 patch set after rebasing and addressing review comments.
Please review it further.

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

Attachments:

v5-0001-Track-invalidation_reason-in-pg_replication_slots.patchapplication/octet-stream; name=v5-0001-Track-invalidation_reason-in-pg_replication_slots.patchDownload+60-8
v5-0002-Add-XID-based-replication-slot-invalidation.patchapplication/octet-stream; name=v5-0002-Add-XID-based-replication-slot-invalidation.patchDownload+205-1
v5-0003-Track-inactive-replication-slot-information.patchapplication/octet-stream; name=v5-0003-Track-inactive-replication-slot-information.patchDownload+84-19
v5-0004-Add-inactive_timeout-based-replication-slot-inval.patchapplication/octet-stream; name=v5-0004-Add-inactive_timeout-based-replication-slot-inval.patchDownload+154-1
#10Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bharath Rupireddy (#9)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Tue, Feb 20, 2024 at 12:05 PM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

[...] and was able to produce something like:

postgres=# select slot_name,slot_type,active,active_pid,wal_status,invalidation_reason from pg_replication_slots;
slot_name | slot_type | active | active_pid | wal_status | invalidation_reason
-------------+-----------+--------+------------+------------+---------------------
rep1 | physical | f | | reserved |
master_slot | physical | t | 1482441 | unreserved | wal_removed
(2 rows)

does that make sense to have an "active/working" slot "ivalidated"?

Thanks. Can you please provide the steps to generate this error? Are
you setting max_slot_wal_keep_size on primary to generate
"wal_removed"?

I'm able to reproduce [1]./initdb -D db17 echo "max_wal_size = 128MB max_slot_wal_keep_size = 64MB archive_mode = on archive_command='cp %p /home/ubuntu/postgres/pg17/bin/archived_wal/%f'" | tee -a db17/postgresql.conf the state [2]postgres=# SELECT * FROM pg_replication_slots; -[ RECORD 1 ]-------+------------- slot_name | sb_repl_slot plugin | slot_type | physical datoid | database | temporary | f active | t active_pid | 710667 xmin | catalog_xmin | restart_lsn | 0/115D21A0 confirmed_flush_lsn | wal_status | unreserved safe_wal_size | 77782624 two_phase | f conflict_reason | failover | f synced | f invalidation_reason | wal_removed last_inactive_at | inactive_count | 1 where the slot got invalidated
first, then its wal_status became unreserved, but still the slot is
serving after the standby comes up online after it catches up with the
primary getting the WAL files from the archive. There's a good reason
for this state -
https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/replication/slotfuncs.c;h=d2fa5e669a32f19989b0d987d3c7329851a1272e;hb=ff9e1e764fcce9a34467d614611a34d4d2a91b50#l351.
This intermittent state can only happen for physical slots, not for
logical slots because logical subscribers can't get the missing
changes from the WAL stored in the archive.

And, the fact looks to be that an invalidated slot can never become
normal but still can serve a standby if the standby is able to catch
up by fetching required WAL (this is the WAL the slot couldn't keep
for the standby) from elsewhere (archive via restore_command).

As far as the 0001 patch is concerned, it reports the
invalidation_reason as long as slot_contents.data.invalidated !=
RS_INVAL_NONE. I think this is okay.

Thoughts?

[1]: ./initdb -D db17 echo "max_wal_size = 128MB max_slot_wal_keep_size = 64MB archive_mode = on archive_command='cp %p /home/ubuntu/postgres/pg17/bin/archived_wal/%f'" | tee -a db17/postgresql.conf
./initdb -D db17
echo "max_wal_size = 128MB
max_slot_wal_keep_size = 64MB
archive_mode = on
archive_command='cp %p
/home/ubuntu/postgres/pg17/bin/archived_wal/%f'" | tee -a
db17/postgresql.conf

./pg_ctl -D db17 -l logfile17 start

./psql -d postgres -p 5432 -c "SELECT
pg_create_physical_replication_slot('sb_repl_slot', true, false);"

rm -rf sbdata logfilesbdata
./pg_basebackup -D sbdata

echo "port=5433
primary_conninfo='host=localhost port=5432 dbname=postgres user=ubuntu'
primary_slot_name='sb_repl_slot'
restore_command='cp /home/ubuntu/postgres/pg17/bin/archived_wal/%f
%p'" | tee -a sbdata/postgresql.conf

touch sbdata/standby.signal

./pg_ctl -D sbdata -l logfilesbdata start
./psql -d postgres -p 5433 -c "SELECT pg_is_in_recovery();"

./pg_ctl -D sbdata -l logfilesbdata stop

./psql -d postgres -p 5432 -c "SELECT pg_logical_emit_message(true,
'mymessage', repeat('aaaa', 10000000));"
./psql -d postgres -p 5432 -c "CHECKPOINT;"
./pg_ctl -D sbdata -l logfilesbdata start
./psql -d postgres -p 5432 -xc "SELECT * FROM pg_replication_slots;"

[2]: postgres=# SELECT * FROM pg_replication_slots; -[ RECORD 1 ]-------+------------- slot_name | sb_repl_slot plugin | slot_type | physical datoid | database | temporary | f active | t active_pid | 710667 xmin | catalog_xmin | restart_lsn | 0/115D21A0 confirmed_flush_lsn | wal_status | unreserved safe_wal_size | 77782624 two_phase | f conflict_reason | failover | f synced | f invalidation_reason | wal_removed last_inactive_at | inactive_count | 1
postgres=# SELECT * FROM pg_replication_slots;
-[ RECORD 1 ]-------+-------------
slot_name | sb_repl_slot
plugin |
slot_type | physical
datoid |
database |
temporary | f
active | t
active_pid | 710667
xmin |
catalog_xmin |
restart_lsn | 0/115D21A0
confirmed_flush_lsn |
wal_status | unreserved
safe_wal_size | 77782624
two_phase | f
conflict_reason |
failover | f
synced | f
invalidation_reason | wal_removed
last_inactive_at |
inactive_count | 1

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

#11Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#10)
Re: Introduce XID age and inactive timeout based replication slot invalidation

Hi,

On Wed, Feb 21, 2024 at 10:55:00AM +0530, Bharath Rupireddy wrote:

On Tue, Feb 20, 2024 at 12:05 PM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

[...] and was able to produce something like:

postgres=# select slot_name,slot_type,active,active_pid,wal_status,invalidation_reason from pg_replication_slots;
slot_name | slot_type | active | active_pid | wal_status | invalidation_reason
-------------+-----------+--------+------------+------------+---------------------
rep1 | physical | f | | reserved |
master_slot | physical | t | 1482441 | unreserved | wal_removed
(2 rows)

does that make sense to have an "active/working" slot "ivalidated"?

Thanks. Can you please provide the steps to generate this error? Are
you setting max_slot_wal_keep_size on primary to generate
"wal_removed"?

I'm able to reproduce [1] the state [2] where the slot got invalidated
first, then its wal_status became unreserved, but still the slot is
serving after the standby comes up online after it catches up with the
primary getting the WAL files from the archive. There's a good reason
for this state -
https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/replication/slotfuncs.c;h=d2fa5e669a32f19989b0d987d3c7329851a1272e;hb=ff9e1e764fcce9a34467d614611a34d4d2a91b50#l351.
This intermittent state can only happen for physical slots, not for
logical slots because logical subscribers can't get the missing
changes from the WAL stored in the archive.

And, the fact looks to be that an invalidated slot can never become
normal but still can serve a standby if the standby is able to catch
up by fetching required WAL (this is the WAL the slot couldn't keep
for the standby) from elsewhere (archive via restore_command).

As far as the 0001 patch is concerned, it reports the
invalidation_reason as long as slot_contents.data.invalidated !=
RS_INVAL_NONE. I think this is okay.

Thoughts?

Yeah, looking at the code I agree that looks ok. OTOH, that looks confusing,
maybe we should add a few words about it in the doc?

Looking at v5-0001:

+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>invalidation_reason</structfield> <type>text</type>
+      </para>
+      <para>

My initial thought was to put "conflict" value in this new field in case of
conflict (not to mention the conflict reason in it). With the current proposal
invalidation_reason could report the same as conflict_reason, which sounds weird
to me.

Does that make sense to you to use "conflict" as value in "invalidation_reason"
when the slot has "conflict_reason" not NULL?

Regards,

--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

#12Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#11)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Wed, Feb 21, 2024 at 5:55 PM Bertrand Drouvot
<bertranddrouvot.pg@gmail.com> wrote:

As far as the 0001 patch is concerned, it reports the
invalidation_reason as long as slot_contents.data.invalidated !=
RS_INVAL_NONE. I think this is okay.

Thoughts?

Yeah, looking at the code I agree that looks ok. OTOH, that looks confusing,
maybe we should add a few words about it in the doc?

I'll think about it.

Looking at v5-0001:

+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>invalidation_reason</structfield> <type>text</type>
+      </para>
+      <para>

My initial thought was to put "conflict" value in this new field in case of
conflict (not to mention the conflict reason in it). With the current proposal
invalidation_reason could report the same as conflict_reason, which sounds weird
to me.

Does that make sense to you to use "conflict" as value in "invalidation_reason"
when the slot has "conflict_reason" not NULL?

I'm thinking the other way around - how about we revert
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=007693f2a3ac2ac19affcb03ad43cdb36ccff5b5,
that is, put in place "conflict" as a boolean and introduce
invalidation_reason the text form. So, for logical slots, whenever the
"conflict" column is true, the reason is found in invaldiation_reason
column? How does it sound? Again the debate might be "conflict" vs
"invalidation", but that looks clean IMHO.

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

#13Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#12)
Re: Introduce XID age and inactive timeout based replication slot invalidation

Hi,

On Wed, Feb 21, 2024 at 08:10:00PM +0530, Bharath Rupireddy wrote:

On Wed, Feb 21, 2024 at 5:55 PM Bertrand Drouvot
<bertranddrouvot.pg@gmail.com> wrote:

My initial thought was to put "conflict" value in this new field in case of
conflict (not to mention the conflict reason in it). With the current proposal
invalidation_reason could report the same as conflict_reason, which sounds weird
to me.

Does that make sense to you to use "conflict" as value in "invalidation_reason"
when the slot has "conflict_reason" not NULL?

I'm thinking the other way around - how about we revert
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=007693f2a3ac2ac19affcb03ad43cdb36ccff5b5,
that is, put in place "conflict" as a boolean and introduce
invalidation_reason the text form. So, for logical slots, whenever the
"conflict" column is true, the reason is found in invaldiation_reason
column? How does it sound?

Yeah, I think that looks fine too. We would need more change (like take care of
ddd5f4f54a for example).

CC'ing Amit, Hou-San and Shveta to get their point of view (as the ones behind
007693f2a3 and ddd5f4f54a).

Regarding,

--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

#14Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#13)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Thu, Feb 22, 2024 at 1:44 PM Bertrand Drouvot
<bertranddrouvot.pg@gmail.com> wrote:

Does that make sense to you to use "conflict" as value in "invalidation_reason"
when the slot has "conflict_reason" not NULL?

I'm thinking the other way around - how about we revert
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=007693f2a3ac2ac19affcb03ad43cdb36ccff5b5,
that is, put in place "conflict" as a boolean and introduce
invalidation_reason the text form. So, for logical slots, whenever the
"conflict" column is true, the reason is found in invaldiation_reason
column? How does it sound?

Yeah, I think that looks fine too. We would need more change (like take care of
ddd5f4f54a for example).

CC'ing Amit, Hou-San and Shveta to get their point of view (as the ones behind
007693f2a3 and ddd5f4f54a).

Yeah, let's wait for what others think about it.

FWIW, I've had to rebase the patches due to 943f7ae1c. Please see the
attached v6 patch set.

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

Attachments:

v6-0001-Track-invalidation_reason-in-pg_replication_slots.patchapplication/octet-stream; name=v6-0001-Track-invalidation_reason-in-pg_replication_slots.patchDownload+49-10
v6-0002-Add-XID-based-replication-slot-invalidation.patchapplication/octet-stream; name=v6-0002-Add-XID-based-replication-slot-invalidation.patchDownload+196-2
v6-0003-Track-inactive-replication-slot-information.patchapplication/octet-stream; name=v6-0003-Track-inactive-replication-slot-information.patchDownload+84-19
v6-0004-Add-inactive_timeout-based-replication-slot-inval.patchapplication/octet-stream; name=v6-0004-Add-inactive_timeout-based-replication-slot-inval.patchDownload+145-2
#15Nathan Bossart
nathandbossart@gmail.com
In reply to: Bharath Rupireddy (#12)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Wed, Feb 21, 2024 at 08:10:00PM +0530, Bharath Rupireddy wrote:

I'm thinking the other way around - how about we revert
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=007693f2a3ac2ac19affcb03ad43cdb36ccff5b5,
that is, put in place "conflict" as a boolean and introduce
invalidation_reason the text form. So, for logical slots, whenever the
"conflict" column is true, the reason is found in invaldiation_reason
column? How does it sound? Again the debate might be "conflict" vs
"invalidation", but that looks clean IMHO.

Would you ever see "conflict" as false and "invalidation_reason" as
non-null for a logical slot?

--
Nathan Bossart
Amazon Web Services: https://aws.amazon.com

#16Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Nathan Bossart (#15)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Sat, Mar 2, 2024 at 3:41 AM Nathan Bossart <nathandbossart@gmail.com> wrote:

[....] how about we revert
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=007693f2a3ac2ac19affcb03ad43cdb36ccff5b5,

Would you ever see "conflict" as false and "invalidation_reason" as
non-null for a logical slot?

No. Because both conflict and invalidation_reason are decided based on
the invalidation reason i.e. value of slot_contents.data.invalidated.
IOW, a logical slot that reports conflict as true must have been
invalidated.

Do you have any thoughts on reverting 007693f and introducing
invalidation_reason?

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

#17Nathan Bossart
nathandbossart@gmail.com
In reply to: Bharath Rupireddy (#16)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Sun, Mar 03, 2024 at 11:40:00PM +0530, Bharath Rupireddy wrote:

On Sat, Mar 2, 2024 at 3:41 AM Nathan Bossart <nathandbossart@gmail.com> wrote:

Would you ever see "conflict" as false and "invalidation_reason" as
non-null for a logical slot?

No. Because both conflict and invalidation_reason are decided based on
the invalidation reason i.e. value of slot_contents.data.invalidated.
IOW, a logical slot that reports conflict as true must have been
invalidated.

Do you have any thoughts on reverting 007693f and introducing
invalidation_reason?

Unless I am misinterpreting some details, ISTM we could rename this column
to invalidation_reason and use it for both logical and physical slots. I'm
not seeing a strong need for another column. Perhaps I am missing
something...

--
Nathan Bossart
Amazon Web Services: https://aws.amazon.com

#18Michael Paquier
michael@paquier.xyz
In reply to: Nathan Bossart (#17)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Sun, Mar 03, 2024 at 03:44:34PM -0600, Nathan Bossart wrote:

On Sun, Mar 03, 2024 at 11:40:00PM +0530, Bharath Rupireddy wrote:

Do you have any thoughts on reverting 007693f and introducing
invalidation_reason?

Unless I am misinterpreting some details, ISTM we could rename this column
to invalidation_reason and use it for both logical and physical slots. I'm
not seeing a strong need for another column. Perhaps I am missing
something...

And also, please don't be hasty in taking a decision that would
involve a revert of 007693f without informing the committer of this
commit about that. I am adding Amit Kapila in CC of this thread for
awareness.
--
Michael

#19Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Nathan Bossart (#17)
Re: Introduce XID age and inactive timeout based replication slot invalidation

Hi,

On Sun, Mar 03, 2024 at 03:44:34PM -0600, Nathan Bossart wrote:

On Sun, Mar 03, 2024 at 11:40:00PM +0530, Bharath Rupireddy wrote:

On Sat, Mar 2, 2024 at 3:41 AM Nathan Bossart <nathandbossart@gmail.com> wrote:

Would you ever see "conflict" as false and "invalidation_reason" as
non-null for a logical slot?

No. Because both conflict and invalidation_reason are decided based on
the invalidation reason i.e. value of slot_contents.data.invalidated.
IOW, a logical slot that reports conflict as true must have been
invalidated.

Do you have any thoughts on reverting 007693f and introducing
invalidation_reason?

Unless I am misinterpreting some details, ISTM we could rename this column
to invalidation_reason and use it for both logical and physical slots. I'm
not seeing a strong need for another column.

Yeah having two columns was more for convenience purpose. Without the "conflict"
one, a slot conflicting with recovery would be "a logical slot having a non NULL
invalidation_reason".

I'm also fine with one column if most of you prefer that way.

Regards,

--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

#20Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#19)
Re: Introduce XID age and inactive timeout based replication slot invalidation

On Mon, Mar 4, 2024 at 2:11 PM Bertrand Drouvot
<bertranddrouvot.pg@gmail.com> wrote:

On Sun, Mar 03, 2024 at 03:44:34PM -0600, Nathan Bossart wrote:

On Sun, Mar 03, 2024 at 11:40:00PM +0530, Bharath Rupireddy wrote:

On Sat, Mar 2, 2024 at 3:41 AM Nathan Bossart <nathandbossart@gmail.com> wrote:

Would you ever see "conflict" as false and "invalidation_reason" as
non-null for a logical slot?

No. Because both conflict and invalidation_reason are decided based on
the invalidation reason i.e. value of slot_contents.data.invalidated.
IOW, a logical slot that reports conflict as true must have been
invalidated.

Do you have any thoughts on reverting 007693f and introducing
invalidation_reason?

Unless I am misinterpreting some details, ISTM we could rename this column
to invalidation_reason and use it for both logical and physical slots. I'm
not seeing a strong need for another column.

Yeah having two columns was more for convenience purpose. Without the "conflict"
one, a slot conflicting with recovery would be "a logical slot having a non NULL
invalidation_reason".

I'm also fine with one column if most of you prefer that way.

While we debate on the above, please find the attached v7 patch set
after rebasing.

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

Attachments:

v7-0001-Track-invalidation_reason-in-pg_replication_slots.patchapplication/x-patch; name=v7-0001-Track-invalidation_reason-in-pg_replication_slots.patchDownload+49-10
v7-0002-Add-XID-based-replication-slot-invalidation.patchapplication/x-patch; name=v7-0002-Add-XID-based-replication-slot-invalidation.patchDownload+197-2
v7-0003-Track-inactive-replication-slot-information.patchapplication/x-patch; name=v7-0003-Track-inactive-replication-slot-information.patchDownload+84-19
v7-0004-Add-inactive_timeout-based-replication-slot-inval.patchapplication/x-patch; name=v7-0004-Add-inactive_timeout-based-replication-slot-inval.patchDownload+144-2
#21Nathan Bossart
nathandbossart@gmail.com
In reply to: Bharath Rupireddy (#20)
#22Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Nathan Bossart (#21)
#23Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#22)
#24Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#23)
#25Amit Kapila
amit.kapila16@gmail.com
In reply to: Nathan Bossart (#17)
#26Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#23)
#27Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#25)
#28Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#26)
#29Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#27)
#30Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#28)
#31Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#23)
#32Nathan Bossart
nathandbossart@gmail.com
In reply to: Amit Kapila (#31)
#33Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#28)
#34Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#33)
#35Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#29)
#36Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#34)
#37Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#34)
#38Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#36)
#39Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#30)
#40Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#31)
#41Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#35)
#42Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#36)
#43Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#39)
#44shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#23)
#45shveta malik
shveta.malik@gmail.com
In reply to: shveta malik (#44)
#46Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#38)
#47shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#28)
#48Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#41)
#49Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#46)
#50Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#44)
#51Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#48)
#52Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#50)
#53Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#51)
#54shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#53)
#55Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#43)
#56shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#53)
#57Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#54)
#58Nathan Bossart
nathandbossart@gmail.com
In reply to: Amit Kapila (#51)
#59Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#51)
#60Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#56)
#61Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#55)
#62Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#61)
#63Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#62)
#64Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#61)
#65Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#64)
#66Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#60)
#67Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#63)
#68Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#60)
#69Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#52)
#70Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#69)
#71Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#70)
#72Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#71)
#73Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#72)
#74Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#67)
#75Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#73)
#76Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#74)
#77Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#68)
#78Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#76)
#79Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#74)
#80Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#74)
#81Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#78)
#82Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#80)
#83Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#79)
#84Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#82)
#85Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#84)
#86Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#83)
#87Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#83)
#88Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#85)
#89Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#87)
#90Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#88)
#91Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#89)
#92Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#90)
#93Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#81)
#94Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#93)
#95Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#91)
#96Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#95)
#97Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#94)
#98Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#96)
#99Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#97)
#100Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#99)
#101Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#100)
#102Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#101)
#103Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#102)
#104Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#103)
#105Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#102)
#106Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#104)
#107Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#105)
#108Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#106)
#109Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#107)
#110Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#108)
#111Ajin Cherian
itsajin@gmail.com
In reply to: Bharath Rupireddy (#102)
#112Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#109)
#113Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#112)
#114Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#105)
#115Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#113)
#116Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#114)
#117Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#116)
#118Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#117)
#119Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#118)
#120Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#117)
#121Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#120)
#122Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#121)
#123Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#122)
#124shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#121)
#125shveta malik
shveta.malik@gmail.com
In reply to: shveta malik (#124)
#126Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#123)
#127shveta malik
shveta.malik@gmail.com
In reply to: shveta malik (#125)
#128Amit Kapila
amit.kapila16@gmail.com
In reply to: shveta malik (#127)
#129Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#126)
#130Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#128)
#131shveta malik
shveta.malik@gmail.com
In reply to: Bertrand Drouvot (#130)
#132Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: shveta malik (#131)
#133shveta malik
shveta.malik@gmail.com
In reply to: Bertrand Drouvot (#130)
#134Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: shveta malik (#133)
#135Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#130)
#136shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#135)
#137Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#135)
#138Amit Kapila
amit.kapila16@gmail.com
In reply to: shveta malik (#133)
#139shveta malik
shveta.malik@gmail.com
In reply to: Amit Kapila (#138)
#140Nathan Bossart
nathandbossart@gmail.com
In reply to: Bharath Rupireddy (#121)
#141shveta malik
shveta.malik@gmail.com
In reply to: shveta malik (#127)
#142Amit Kapila
amit.kapila16@gmail.com
In reply to: Nathan Bossart (#140)
#143Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#141)
#144Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: shveta malik (#141)
#145Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#121)
#146Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bertrand Drouvot (#144)
#147shveta malik
shveta.malik@gmail.com
In reply to: Bertrand Drouvot (#146)
#148shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#143)
#149Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#143)
#150Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#149)
#151Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#150)
#152Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#145)
#153shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#152)
#154Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#152)
#155shveta malik
shveta.malik@gmail.com
In reply to: Bertrand Drouvot (#151)
#156Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: shveta malik (#155)
#157Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#154)
#158Ajin Cherian
itsajin@gmail.com
In reply to: Bharath Rupireddy (#152)
#159shveta malik
shveta.malik@gmail.com
In reply to: Bertrand Drouvot (#156)
#160Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#159)
#161shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#160)
#162Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: shveta malik (#161)
#163Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: shveta malik (#159)
#164Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bharath Rupireddy (#160)
#165Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#164)
#166shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#164)
#167Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#165)
#168Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#167)
#169shveta malik
shveta.malik@gmail.com
In reply to: Amit Kapila (#168)
#170Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#169)
#171shveta malik
shveta.malik@gmail.com
In reply to: Bertrand Drouvot (#163)
#172Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bharath Rupireddy (#167)
#173Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#167)
#174shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#172)
#175Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#174)
#176Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#175)
#177shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#175)
#178Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#177)
#179Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#178)
#180Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#179)
#181Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#180)
#182shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#180)
#183Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#180)
#184Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#180)
#185Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#184)
#186Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#185)
#187Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#186)
#188Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#183)
#189Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#184)
#190Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#187)
#191Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Amit Kapila (#190)
#192Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#189)
#193Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#188)
#194Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Bharath Rupireddy (#189)
#195Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Masahiko Sawada (#194)
#196Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#195)
#197Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#196)
#198shveta malik
shveta.malik@gmail.com
In reply to: Bertrand Drouvot (#195)
#199Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#198)
#200Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#199)
#201Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#199)
#202shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#199)
#203Amit Kapila
amit.kapila16@gmail.com
In reply to: Bertrand Drouvot (#200)
#204Amit Kapila
amit.kapila16@gmail.com
In reply to: shveta malik (#202)
#205Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#201)
#206Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#205)
#207Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#206)
#208Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#207)
#209Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Bharath Rupireddy (#207)
#210Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Masahiko Sawada (#209)
#211Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#207)
#212Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#211)
#213Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Bharath Rupireddy (#210)
#214Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#213)
#215Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#214)
#216Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#212)
#217Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#216)
#218shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#217)
#219Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#208)
#220Bertrand Drouvot
bertranddrouvot.pg@gmail.com
In reply to: Bharath Rupireddy (#219)
#221Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bertrand Drouvot (#220)
#222Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#221)
#223Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#222)
#224Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bharath Rupireddy (#223)
#225Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Bharath Rupireddy (#217)
#226Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Masahiko Sawada (#225)
#227Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#226)
#228Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bharath Rupireddy (#224)
#229Nathan Bossart
nathandbossart@gmail.com
In reply to: Bharath Rupireddy (#228)
#230Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Bharath Rupireddy (#228)
#231Nathan Bossart
nathandbossart@gmail.com
In reply to: Bharath Rupireddy (#230)
#232Ajin Cherian
itsajin@gmail.com
In reply to: Bharath Rupireddy (#230)
#233Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Nathan Bossart (#231)
#234Ajin Cherian
itsajin@gmail.com
In reply to: Bharath Rupireddy (#230)
#235Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Ajin Cherian (#234)
#236Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#235)
#237Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#236)
#238Peter Smith
smithpb2250@gmail.com
In reply to: Bharath Rupireddy (#237)
#239Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Peter Smith (#238)
#240Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#237)
#241Peter Smith
smithpb2250@gmail.com
In reply to: Bharath Rupireddy (#239)
#242Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#239)
#243Peter Smith
smithpb2250@gmail.com
In reply to: Bharath Rupireddy (#239)
#244shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#239)
#245shveta malik
shveta.malik@gmail.com
In reply to: shveta malik (#244)
#246shveta malik
shveta.malik@gmail.com
In reply to: shveta malik (#245)
#247Amit Kapila
amit.kapila16@gmail.com
In reply to: shveta malik (#246)
#248Amit Kapila
amit.kapila16@gmail.com
In reply to: shveta malik (#245)
#249Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Peter Smith (#241)
#250Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#244)
#251shveta malik
shveta.malik@gmail.com
In reply to: Amit Kapila (#248)
#252Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#251)
#253shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#252)
#254shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#249)
#255Peter Smith
smithpb2250@gmail.com
In reply to: Bharath Rupireddy (#249)
#256Amit Kapila
amit.kapila16@gmail.com
In reply to: shveta malik (#253)
#257Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#256)
#258Peter Smith
smithpb2250@gmail.com
In reply to: Peter Smith (#255)
#259Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#257)
#260Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: shveta malik (#254)
#261Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Peter Smith (#255)
#262Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#261)
#263Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Amit Kapila (#262)
#264Peter Smith
smithpb2250@gmail.com
In reply to: Bharath Rupireddy (#261)
#265shveta malik
shveta.malik@gmail.com
In reply to: Bharath Rupireddy (#261)
#266shveta malik
shveta.malik@gmail.com
In reply to: shveta malik (#265)
#267shveta malik
shveta.malik@gmail.com
In reply to: shveta malik (#266)
#268Amit Kapila
amit.kapila16@gmail.com
In reply to: Bharath Rupireddy (#263)
#269shveta malik
shveta.malik@gmail.com
In reply to: shveta malik (#267)
#270Nisha Moond
nisha.moond412@gmail.com
In reply to: Bharath Rupireddy (#261)
#271Nisha Moond
nisha.moond412@gmail.com
In reply to: shveta malik (#267)
#272vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#270)
#273Nisha Moond
nisha.moond412@gmail.com
In reply to: shveta malik (#269)
#274Nisha Moond
nisha.moond412@gmail.com
In reply to: shveta malik (#265)
#275Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#273)
#276vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#273)
#277Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#276)
#278Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#275)
#279Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#276)
#280vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#277)
#281vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#277)
#282vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#279)
#283Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#281)
#284vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#283)
#285Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#283)
#286Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#283)
#287Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#286)
#288Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#287)
#289Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#287)
#290Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Nisha Moond (#287)
#291vignesh C
vignesh21@gmail.com
In reply to: vignesh C (#284)
#292vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#287)
#293Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#291)
#294Nisha Moond
nisha.moond412@gmail.com
In reply to: Nisha Moond (#278)
#295Nisha Moond
nisha.moond412@gmail.com
In reply to: Hayato Kuroda (Fujitsu) (#290)
#296Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#289)
#297Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#293)
#298Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Nisha Moond (#293)
#299Nisha Moond
nisha.moond412@gmail.com
In reply to: Hayato Kuroda (Fujitsu) (#298)
#300vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#299)
#301vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#299)
#302Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#299)
#303Peter Smith
smithpb2250@gmail.com
In reply to: vignesh C (#300)
#304vignesh C
vignesh21@gmail.com
In reply to: Peter Smith (#303)
#305Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#304)
#306Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#305)
#307vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#305)
#308vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#305)
#309Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#308)
#310Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#306)
#311Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#309)
#312Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#311)
#313Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#312)
#314Amit Kapila
amit.kapila16@gmail.com
In reply to: Nisha Moond (#312)
#315Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#314)
#316Michail Nikolaev
michail.nikolaev@gmail.com
In reply to: Nisha Moond (#315)
#317Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Michail Nikolaev (#316)
#318Michail Nikolaev
michail.nikolaev@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#317)
#319vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#315)
#320Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#315)
#321Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#315)
#322Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#315)
#323Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#322)
#324Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#319)
#325Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#323)
#326Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#323)
#327Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#325)
#328Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#326)
#329vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#328)
#330Peter Smith
smithpb2250@gmail.com
In reply to: vignesh C (#329)
#331vignesh C
vignesh21@gmail.com
In reply to: Peter Smith (#330)
#332Shlok Kyal
shlok.kyal.oss@gmail.com
In reply to: Nisha Moond (#328)
#333Nisha Moond
nisha.moond412@gmail.com
In reply to: Shlok Kyal (#332)
#334Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#329)
#335Shlok Kyal
shlok.kyal.oss@gmail.com
In reply to: Nisha Moond (#333)
#336Nisha Moond
nisha.moond412@gmail.com
In reply to: Shlok Kyal (#335)
#337Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#336)
#338Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#336)
#339Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#338)
#340Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#337)
#341Nisha Moond
nisha.moond412@gmail.com
In reply to: Nisha Moond (#340)
#342Amit Kapila
amit.kapila16@gmail.com
In reply to: Nisha Moond (#341)
#343Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Smith (#322)
#344Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#342)
#345Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#343)
#346vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#345)
#347Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#345)
#348vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#345)
#349Amit Kapila
amit.kapila16@gmail.com
In reply to: vignesh C (#348)
#350Nisha Moond
nisha.moond412@gmail.com
In reply to: Nisha Moond (#345)
#351Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#350)
#352Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Smith (#351)
#353Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#352)
#354vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#353)
#355Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#353)
#356Peter Smith
smithpb2250@gmail.com
In reply to: Amit Kapila (#352)
#357Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Smith (#356)
#358Peter Smith
smithpb2250@gmail.com
In reply to: Amit Kapila (#357)
#359Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Smith (#355)
#360Amit Kapila
amit.kapila16@gmail.com
In reply to: Nisha Moond (#353)
#361Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#360)
#362Shlok Kyal
shlok.kyal.oss@gmail.com
In reply to: Nisha Moond (#353)
#363Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#359)
#364Peter Smith
smithpb2250@gmail.com
In reply to: Amit Kapila (#359)
#365Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#363)
#366Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Smith (#364)
#367Amit Kapila
amit.kapila16@gmail.com
In reply to: Shlok Kyal (#362)
#368Shlok Kyal
shlok.kyal.oss@gmail.com
In reply to: Amit Kapila (#367)
#369Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#367)
#370vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#369)
#371Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: vignesh C (#370)
#372Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#370)
#373Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#372)
#374vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#372)
#375Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#372)
#376Amit Kapila
amit.kapila16@gmail.com
In reply to: vignesh C (#374)
#377Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#374)
#378Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#375)
#379Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#376)
#380Amit Kapila
amit.kapila16@gmail.com
In reply to: Nisha Moond (#379)
#381Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#380)
#382Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#380)
#383vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#382)
#384Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#382)
#385Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Smith (#384)
#386Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#384)
#387Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Nisha Moond (#386)
#388Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#386)
#389Amit Kapila
amit.kapila16@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#387)
#390Peter Smith
smithpb2250@gmail.com
In reply to: Amit Kapila (#385)
#391Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Smith (#388)
#392Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Amit Kapila (#389)
#393Nisha Moond
nisha.moond412@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#387)
#394vignesh C
vignesh21@gmail.com
In reply to: Nisha Moond (#393)
#395Nisha Moond
nisha.moond412@gmail.com
In reply to: vignesh C (#394)
#396Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#395)
#397Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Nisha Moond (#393)
#398Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Smith (#396)
#399Nisha Moond
nisha.moond412@gmail.com
In reply to: Peter Smith (#396)
#400Nisha Moond
nisha.moond412@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#397)
#401Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Nisha Moond (#399)
#402Nathan Bossart
nathandbossart@gmail.com
In reply to: Alvaro Herrera (#401)
#403Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#399)
#404Amit Kapila
amit.kapila16@gmail.com
In reply to: Nathan Bossart (#402)
#405Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Amit Kapila (#404)
#406Nisha Moond
nisha.moond412@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#405)
#407Peter Smith
smithpb2250@gmail.com
In reply to: Nisha Moond (#406)
#408Amit Kapila
amit.kapila16@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#405)
#409Amit Kapila
amit.kapila16@gmail.com
In reply to: Nisha Moond (#406)
#410Nisha Moond
nisha.moond412@gmail.com
In reply to: Amit Kapila (#409)
#411Nathan Bossart
nathandbossart@gmail.com
In reply to: Amit Kapila (#408)
#412Amit Kapila
amit.kapila16@gmail.com
In reply to: Nathan Bossart (#411)
#413Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#412)
#414Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#413)