Skipping logical replication transactions on subscriber side

Started by Masahiko Sawadaalmost 5 years ago590 messageshackers
Jump to latest
#1Masahiko Sawada
sawada.mshk@gmail.com

Hi all,

If a logical replication worker cannot apply the change on the
subscriber for some reason (e.g., missing table or violating a
constraint, etc.), logical replication stops until the problem is
resolved. Ideally, we resolve the problem on the subscriber (e.g., by
creating the missing table or removing the conflicting data, etc.) but
occasionally a problem cannot be fixed and it may be necessary to skip
the entire transaction in question. Currently, we have two ways to
skip transactions: advancing the LSN of the replication origin on the
subscriber and advancing the LSN of the replication slot on the
publisher. But both ways might not be able to skip exactly one
transaction in question and end up skipping other transactions too.

I’d like to propose a way to skip the particular transaction on the
subscriber side. As the first step, a transaction can be specified to
be skipped by specifying remote XID on the subscriber. This feature
would need two sub-features: (1) a sub-feature for users to identify
the problem subscription and the problem transaction’s XID, and (2) a
sub-feature to skip the particular transaction to apply.

For (1), I think the simplest way would be to put the details of the
change being applied in errcontext. For example, the following
errcontext shows the remote XID as well as the action name, the
relation name, and commit timestamp:

ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (c)=(1) already exists.
CONTEXT: during apply of "INSERT" for relation "public.test" in
transaction with xid 590 commit timestamp 2021-05-21
14:32:02.134273+09

The user can identify which remote XID has a problem during applying
the change (XID=590 in this case). As another idea, we can have a
statistics view for logical replication workers, showing information
of the last failure transaction.

For (2), what I'm thinking is to add a new action to ALTER
SUBSCRIPTION command like ALTER SUBSCRIPTION test_sub SET SKIP
TRANSACTION 590. Also, we can have actions to reset it; ALTER
SUBSCRIPTION test_sub RESET SKIP TRANSACTION. Those commands add the
XID to a new column of pg_subscription or a new catalog, having the
worker reread its subscription information. Once the worker skipped
the specified transaction, it resets the transaction to skip on the
catalog. The syntax allows users to specify one remote XID to skip. In
the future, it might be good if users can also specify multiple XIDs
(a range of XIDs or a list of XIDs, etc).

Feedback and comment are very welcome.

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#2Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#1)
Re: Skipping logical replication transactions on subscriber side

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

If a logical replication worker cannot apply the change on the
subscriber for some reason (e.g., missing table or violating a
constraint, etc.), logical replication stops until the problem is
resolved. Ideally, we resolve the problem on the subscriber (e.g., by
creating the missing table or removing the conflicting data, etc.) but
occasionally a problem cannot be fixed and it may be necessary to skip
the entire transaction in question. Currently, we have two ways to
skip transactions: advancing the LSN of the replication origin on the
subscriber and advancing the LSN of the replication slot on the
publisher. But both ways might not be able to skip exactly one
transaction in question and end up skipping other transactions too.

I’d like to propose a way to skip the particular transaction on the
subscriber side. As the first step, a transaction can be specified to
be skipped by specifying remote XID on the subscriber. This feature
would need two sub-features: (1) a sub-feature for users to identify
the problem subscription and the problem transaction’s XID, and (2) a
sub-feature to skip the particular transaction to apply.

For (1), I think the simplest way would be to put the details of the
change being applied in errcontext. For example, the following
errcontext shows the remote XID as well as the action name, the
relation name, and commit timestamp:

ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (c)=(1) already exists.
CONTEXT: during apply of "INSERT" for relation "public.test" in
transaction with xid 590 commit timestamp 2021-05-21
14:32:02.134273+09

In the above, the subscription name/id is not mentioned. I think you
need it for sub-feature-2.

The user can identify which remote XID has a problem during applying
the change (XID=590 in this case). As another idea, we can have a
statistics view for logical replication workers, showing information
of the last failure transaction.

It might be good to display at both places. Having subscriber-side
information in the view might be helpful in other ways as well like we
can use it to display the number of transactions processed by a
particular subscriber.

I think you need to consider few more things here:
(a) Say the error occurs after applying some part of changes, then
just skipping the remaining part won't be sufficient, we probably need
to someway rollback the applied changes (by rolling back the
transaction or in some other way).
(b) How do you handle streamed transactions? It is possible that some
of the streams are successful and the error occurs after that, say
when writing to the stream file. Now, would you skip writing to stream
file or will you write it, and then during apply, you will skip the
entire transaction and remove the corresponding stream file.
(c) There is also a possibility that the error occurs while applying
the changes of some subtransaction (this is only possible for
streaming xacts), so, in such cases, do we allow users to rollback the
subtransaction or user has to rollback the entire transaction. I am
not sure but maybe for very large transactions users might just want
to rollback the subtransaction.
(d) How about prepared transactions? Do we need to rollback the
prepared transaction if user decides to skip such a transaction? We
already allow prepared transactions to be streamed to plugins and the
work for subscriber-side apply is in progress [1]/messages/by-id/CAHut+PsDysQA=JWXb6oGFr1npvqi1e7RzzXV-juCCxnbiwHvfA@mail.gmail.com, so I think we need
to consider this case as well.
(e) Do we want to provide such a feature via output plugins as well,
if not, why?

For (2), what I'm thinking is to add a new action to ALTER
SUBSCRIPTION command like ALTER SUBSCRIPTION test_sub SET SKIP
TRANSACTION 590. Also, we can have actions to reset it; ALTER
SUBSCRIPTION test_sub RESET SKIP TRANSACTION. Those commands add the
XID to a new column of pg_subscription or a new catalog, having the
worker reread its subscription information. Once the worker skipped
the specified transaction, it resets the transaction to skip on the
catalog.

What if we fail while updating the reset information in the catalog?
Will it be the responsibility of the user to reset such a transaction
or we will retry it after restart of worker? Now, say, we give such a
responsibility to the user and the user forgets to reset it then there
is a possibility that after wraparound we will again skip the
transaction which is not intended. And, if we want to retry it after
restart of worker, how will the worker remember the previous failure?

I think this will be a useful feature but we need to consider few more things.

[1]: /messages/by-id/CAHut+PsDysQA=JWXb6oGFr1npvqi1e7RzzXV-juCCxnbiwHvfA@mail.gmail.com

--
With Regards,
Amit Kapila.

#3Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Masahiko Sawada (#1)
Re: Skipping logical replication transactions on subscriber side

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

Hi all,

If a logical replication worker cannot apply the change on the
subscriber for some reason (e.g., missing table or violating a
constraint, etc.), logical replication stops until the problem is
resolved. Ideally, we resolve the problem on the subscriber (e.g., by
creating the missing table or removing the conflicting data, etc.) but
occasionally a problem cannot be fixed and it may be necessary to skip
the entire transaction in question. Currently, we have two ways to
skip transactions: advancing the LSN of the replication origin on the
subscriber and advancing the LSN of the replication slot on the
publisher. But both ways might not be able to skip exactly one
transaction in question and end up skipping other transactions too.

Does it mean pg_replication_origin_advance() can't skip exactly one
txn? I'm not familiar with the function or never used it though, I was
just searching for "how to skip a single txn in postgres" and ended up
in [1]https://www.postgresql.org/docs/devel/logical-replication-conflicts.html. Could you please give some more details on scenarios when we
can't skip exactly one txn? Is there any other way to advance the LSN,
something like directly updating the pg_replication_slots catalog?

[1]: https://www.postgresql.org/docs/devel/logical-replication-conflicts.html

I’d like to propose a way to skip the particular transaction on the
subscriber side. As the first step, a transaction can be specified to
be skipped by specifying remote XID on the subscriber. This feature
would need two sub-features: (1) a sub-feature for users to identify
the problem subscription and the problem transaction’s XID, and (2) a
sub-feature to skip the particular transaction to apply.

For (1), I think the simplest way would be to put the details of the
change being applied in errcontext. For example, the following
errcontext shows the remote XID as well as the action name, the
relation name, and commit timestamp:

ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (c)=(1) already exists.
CONTEXT: during apply of "INSERT" for relation "public.test" in
transaction with xid 590 commit timestamp 2021-05-21
14:32:02.134273+09

The user can identify which remote XID has a problem during applying
the change (XID=590 in this case). As another idea, we can have a
statistics view for logical replication workers, showing information
of the last failure transaction.

Agree with Amit on this. At times, it is difficult to look around in
the server logs, so it will be better to have it in both places.

For (2), what I'm thinking is to add a new action to ALTER
SUBSCRIPTION command like ALTER SUBSCRIPTION test_sub SET SKIP
TRANSACTION 590. Also, we can have actions to reset it; ALTER
SUBSCRIPTION test_sub RESET SKIP TRANSACTION. Those commands add the
XID to a new column of pg_subscription or a new catalog, having the
worker reread its subscription information. Once the worker skipped
the specified transaction, it resets the transaction to skip on the
catalog. The syntax allows users to specify one remote XID to skip. In
the future, it might be good if users can also specify multiple XIDs
(a range of XIDs or a list of XIDs, etc).

What's it like skipping a txn with txn id? Is it that the particular
txn is forced to commit or abort or just skipping some of the code in
the apply worker? IIUC, the behavior of RESET SKIP TRANSACTION is just
to forget the txn id specified in SET SKIP TRANSACTION right?

With Regards,
Bharath Rupireddy.
EnterpriseDB: http://www.enterprisedb.com

#4Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#2)
Re: Skipping logical replication transactions on subscriber side

On Mon, May 24, 2021 at 7:51 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

If a logical replication worker cannot apply the change on the
subscriber for some reason (e.g., missing table or violating a
constraint, etc.), logical replication stops until the problem is
resolved. Ideally, we resolve the problem on the subscriber (e.g., by
creating the missing table or removing the conflicting data, etc.) but
occasionally a problem cannot be fixed and it may be necessary to skip
the entire transaction in question. Currently, we have two ways to
skip transactions: advancing the LSN of the replication origin on the
subscriber and advancing the LSN of the replication slot on the
publisher. But both ways might not be able to skip exactly one
transaction in question and end up skipping other transactions too.

I’d like to propose a way to skip the particular transaction on the
subscriber side. As the first step, a transaction can be specified to
be skipped by specifying remote XID on the subscriber. This feature
would need two sub-features: (1) a sub-feature for users to identify
the problem subscription and the problem transaction’s XID, and (2) a
sub-feature to skip the particular transaction to apply.

For (1), I think the simplest way would be to put the details of the
change being applied in errcontext. For example, the following
errcontext shows the remote XID as well as the action name, the
relation name, and commit timestamp:

ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (c)=(1) already exists.
CONTEXT: during apply of "INSERT" for relation "public.test" in
transaction with xid 590 commit timestamp 2021-05-21
14:32:02.134273+09

In the above, the subscription name/id is not mentioned. I think you
need it for sub-feature-2.

Agreed.

The user can identify which remote XID has a problem during applying
the change (XID=590 in this case). As another idea, we can have a
statistics view for logical replication workers, showing information
of the last failure transaction.

It might be good to display at both places. Having subscriber-side
information in the view might be helpful in other ways as well like we
can use it to display the number of transactions processed by a
particular subscriber.

Yes. I think we can report that information to the stats collector. It
needs to live even after the worker exiting.

I think you need to consider few more things here:
(a) Say the error occurs after applying some part of changes, then
just skipping the remaining part won't be sufficient, we probably need
to someway rollback the applied changes (by rolling back the
transaction or in some other way).

After more thought, it might be better to that setting and resetting
the XID to skip requires disabling the subscription. This would not be
a restriction for users since logical replication is likely to already
stop (and possibly repeating restarting and stopping) due to an error.
Setting and resetting the XID modifies the system catalog so it's a
crash-safe change and survives beyond the server restarts. When a
logical replication worker starts, it checks the XID. If the worker
receives changes associated with the transaction with the specified
XID, it can ignore the entire transaction.

(b) How do you handle streamed transactions? It is possible that some
of the streams are successful and the error occurs after that, say
when writing to the stream file. Now, would you skip writing to stream
file or will you write it, and then during apply, you will skip the
entire transaction and remove the corresponding stream file.

I think streamed transactions can be handled in the same way described in (a).

(c) There is also a possibility that the error occurs while applying
the changes of some subtransaction (this is only possible for
streaming xacts), so, in such cases, do we allow users to rollback the
subtransaction or user has to rollback the entire transaction. I am
not sure but maybe for very large transactions users might just want
to rollback the subtransaction.

If the user specifies XID of a subtransaction, it would be better to
skip only the subtransaction. If specifies top transaction XID, it
would be better to skip the entire transaction. What do you think?

(d) How about prepared transactions? Do we need to rollback the
prepared transaction if user decides to skip such a transaction? We
already allow prepared transactions to be streamed to plugins and the
work for subscriber-side apply is in progress [1], so I think we need
to consider this case as well.

If a transaction replicated from the subscriber could be prepared on
the subscriber, it would be guaranteed to be able to be either
committed or rolled back. Given that this feature is to skip a problem
transaction, I think it should not do anything for transactions that
are already prepared on the subscriber.

(e) Do we want to provide such a feature via output plugins as well,
if not, why?

You mean to specify an XID to skip on the publisher side? Since I've
been considering this feature as a way to resume the logical
replication having a problem I've not thought of that idea but It
would be a good idea. Do you have any use cases? If we specified the
XID on the publisher, multiple subscribers would skip that
transaction.

For (2), what I'm thinking is to add a new action to ALTER
SUBSCRIPTION command like ALTER SUBSCRIPTION test_sub SET SKIP
TRANSACTION 590. Also, we can have actions to reset it; ALTER
SUBSCRIPTION test_sub RESET SKIP TRANSACTION. Those commands add the
XID to a new column of pg_subscription or a new catalog, having the
worker reread its subscription information. Once the worker skipped
the specified transaction, it resets the transaction to skip on the
catalog.

What if we fail while updating the reset information in the catalog?
Will it be the responsibility of the user to reset such a transaction
or we will retry it after restart of worker? Now, say, we give such a
responsibility to the user and the user forgets to reset it then there
is a possibility that after wraparound we will again skip the
transaction which is not intended. And, if we want to retry it after
restart of worker, how will the worker remember the previous failure?

As described above, setting and resetting XID to skip is implemented
as a normal system catalog change, so it's crash-safe and persisted. I
think that the worker can either removes the XID or mark it as done
once it skipped the specified transaction so that it won't skip the
same XID again after wraparound. Also, it might be better if we reset
the XID also when a subscription field such as subconninfo is changed
because it could imply the worker will connect to another publisher
having a different XID space.

We also need to handle the cases where the user specifies an old XID
or XID whose transaction is already prepared on the subscriber. I
think the worker can reset the XID with a warning when it finds out
that the XID seems no longer valid or it cannot skip the specified
XID. For example in the former case, it can do that when the first
received transaction’s XID is newer than the specified XID. In the
latter case, it can do that when it receives the commit/rollback
prepared message of the specified XID.

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#5Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Bharath Rupireddy (#3)
Re: Skipping logical replication transactions on subscriber side

On Tue, May 25, 2021 at 2:49 PM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

Hi all,

If a logical replication worker cannot apply the change on the
subscriber for some reason (e.g., missing table or violating a
constraint, etc.), logical replication stops until the problem is
resolved. Ideally, we resolve the problem on the subscriber (e.g., by
creating the missing table or removing the conflicting data, etc.) but
occasionally a problem cannot be fixed and it may be necessary to skip
the entire transaction in question. Currently, we have two ways to
skip transactions: advancing the LSN of the replication origin on the
subscriber and advancing the LSN of the replication slot on the
publisher. But both ways might not be able to skip exactly one
transaction in question and end up skipping other transactions too.

Does it mean pg_replication_origin_advance() can't skip exactly one
txn? I'm not familiar with the function or never used it though, I was
just searching for "how to skip a single txn in postgres" and ended up
in [1]. Could you please give some more details on scenarios when we
can't skip exactly one txn? Is there any other way to advance the LSN,
something like directly updating the pg_replication_slots catalog?

Sorry, it's not impossible. Although the user mistakenly skips more
than one transaction by specifying a wrong LSN it's always possible to
skip an exact one transaction.

[1] - https://www.postgresql.org/docs/devel/logical-replication-conflicts.html

I’d like to propose a way to skip the particular transaction on the
subscriber side. As the first step, a transaction can be specified to
be skipped by specifying remote XID on the subscriber. This feature
would need two sub-features: (1) a sub-feature for users to identify
the problem subscription and the problem transaction’s XID, and (2) a
sub-feature to skip the particular transaction to apply.

For (1), I think the simplest way would be to put the details of the
change being applied in errcontext. For example, the following
errcontext shows the remote XID as well as the action name, the
relation name, and commit timestamp:

ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (c)=(1) already exists.
CONTEXT: during apply of "INSERT" for relation "public.test" in
transaction with xid 590 commit timestamp 2021-05-21
14:32:02.134273+09

The user can identify which remote XID has a problem during applying
the change (XID=590 in this case). As another idea, we can have a
statistics view for logical replication workers, showing information
of the last failure transaction.

Agree with Amit on this. At times, it is difficult to look around in
the server logs, so it will be better to have it in both places.

For (2), what I'm thinking is to add a new action to ALTER
SUBSCRIPTION command like ALTER SUBSCRIPTION test_sub SET SKIP
TRANSACTION 590. Also, we can have actions to reset it; ALTER
SUBSCRIPTION test_sub RESET SKIP TRANSACTION. Those commands add the
XID to a new column of pg_subscription or a new catalog, having the
worker reread its subscription information. Once the worker skipped
the specified transaction, it resets the transaction to skip on the
catalog. The syntax allows users to specify one remote XID to skip. In
the future, it might be good if users can also specify multiple XIDs
(a range of XIDs or a list of XIDs, etc).

What's it like skipping a txn with txn id? Is it that the particular
txn is forced to commit or abort or just skipping some of the code in
the apply worker?

What I'm thinking is to ignore the entire transaction with the
specified XID. IOW Logical replication workers don't even start the
transaction and ignore all changes associated with the XID.

IIUC, the behavior of RESET SKIP TRANSACTION is just
to forget the txn id specified in SET SKIP TRANSACTION right?

Right. I proposed this RESET command for users to cancel the skipping behavior.

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#6Bharath Rupireddy
bharath.rupireddyforpostgres@gmail.com
In reply to: Masahiko Sawada (#5)
Re: Skipping logical replication transactions on subscriber side

On Tue, May 25, 2021 at 1:44 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Tue, May 25, 2021 at 2:49 PM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

Hi all,

If a logical replication worker cannot apply the change on the
subscriber for some reason (e.g., missing table or violating a
constraint, etc.), logical replication stops until the problem is
resolved. Ideally, we resolve the problem on the subscriber (e.g., by
creating the missing table or removing the conflicting data, etc.) but
occasionally a problem cannot be fixed and it may be necessary to skip
the entire transaction in question. Currently, we have two ways to
skip transactions: advancing the LSN of the replication origin on the
subscriber and advancing the LSN of the replication slot on the
publisher. But both ways might not be able to skip exactly one
transaction in question and end up skipping other transactions too.

Does it mean pg_replication_origin_advance() can't skip exactly one
txn? I'm not familiar with the function or never used it though, I was
just searching for "how to skip a single txn in postgres" and ended up
in [1]. Could you please give some more details on scenarios when we
can't skip exactly one txn? Is there any other way to advance the LSN,
something like directly updating the pg_replication_slots catalog?

Sorry, it's not impossible. Although the user mistakenly skips more
than one transaction by specifying a wrong LSN it's always possible to
skip an exact one transaction.

IIUC, if the user specifies the "correct LSN", then it's possible to
skip exact txn for which the sync workers are unable to apply changes,
right?

How can the user get the LSN (which we call "correct LSN")? Is it from
pg_replication_slots? Or some other way?

If the user somehow can get the "correct LSN", can't the exact txn be
skipped using it with any of the existing ways, either using
pg_replication_origin_advance or any other ways?

If there's no way to get the "correct LSN", then why can't we just
print that LSN in the error context and/or in the new statistics view
for logical replication workers, so that any of the existing ways can
be used to skip exactly one txn?

IIUC, the feature proposed here guards against the users specifying
wrong LSN. If I'm right, what is the guarantee that users don't
specify the wrong txn id? Why can't we tell the users when a wrong LSN
is specified that "currently, an apply worker is failing to apply the
LSN XXXX, and you specified LSN YYYY, are you sure this is
intentional?"

Please correct me if I'm missing anything.

With Regards,
Bharath Rupireddy.
EnterpriseDB: http://www.enterprisedb.com

#7Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Bharath Rupireddy (#6)
Re: Skipping logical replication transactions on subscriber side

On Tue, May 25, 2021 at 7:21 PM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

On Tue, May 25, 2021 at 1:44 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Tue, May 25, 2021 at 2:49 PM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

Hi all,

If a logical replication worker cannot apply the change on the
subscriber for some reason (e.g., missing table or violating a
constraint, etc.), logical replication stops until the problem is
resolved. Ideally, we resolve the problem on the subscriber (e.g., by
creating the missing table or removing the conflicting data, etc.) but
occasionally a problem cannot be fixed and it may be necessary to skip
the entire transaction in question. Currently, we have two ways to
skip transactions: advancing the LSN of the replication origin on the
subscriber and advancing the LSN of the replication slot on the
publisher. But both ways might not be able to skip exactly one
transaction in question and end up skipping other transactions too.

Does it mean pg_replication_origin_advance() can't skip exactly one
txn? I'm not familiar with the function or never used it though, I was
just searching for "how to skip a single txn in postgres" and ended up
in [1]. Could you please give some more details on scenarios when we
can't skip exactly one txn? Is there any other way to advance the LSN,
something like directly updating the pg_replication_slots catalog?

Sorry, it's not impossible. Although the user mistakenly skips more
than one transaction by specifying a wrong LSN it's always possible to
skip an exact one transaction.

IIUC, if the user specifies the "correct LSN", then it's possible to
skip exact txn for which the sync workers are unable to apply changes,
right?

How can the user get the LSN (which we call "correct LSN")? Is it from
pg_replication_slots? Or some other way?

If the user somehow can get the "correct LSN", can't the exact txn be
skipped using it with any of the existing ways, either using
pg_replication_origin_advance or any other ways?

One possible way I know is to copy the logical replication slot used
by the subscriber and peek at the changes to identify the correct LSN
(maybe there is another handy way though) . For example, suppose that
two transactions insert tuples as follows on the publisher:

TX-A: BEGIN;
TX-A: INSERT INTO test VALUES (1);
TX-B: BEGIN;
TX-B: INSERT INTO test VALUES (10);
TX-B: COMMIT;
TX-A: INSERT INTO test VALUES (2);
TX-A: COMMIT;

And suppose further that the insertion with value = 10 (by TX-A)
cannot be applied only on the subscriber due to unique constraint
violation. If we copy the slot by
pg_copy_logical_replication_slot('test_sub', 'copy_slot', true,
'test_decoding') , we can peek at those changes with LSN as follows:

=# select * from pg_logical_slot_peek_changes('copy', null, null) order by lsn;
lsn | xid | data
-----------+-----+------------------------------------------
0/1911548 | 736 | BEGIN 736
0/1911548 | 736 | table public.hoge: INSERT: c[integer]:1
0/1911588 | 737 | BEGIN 737
0/1911588 | 737 | table public.hoge: INSERT: c[integer]:10
0/19115F8 | 737 | COMMIT 737
0/1911630 | 736 | table public.hoge: INSERT: c[integer]:2
0/19116A0 | 736 | COMMIT 736
(7 rows)

In this case, '0/19115F8' is the correct LSN to specify. We can
advance the replication origin to ' 0/19115F8' by
pg_replication_origin_advance() so that logical replication streams
transactions committed after ' 0/19115F8'. After the logical
replication restarting, it skips the transaction with xid = 737 but
replicates the transaction with xid = 736.

If there's no way to get the "correct LSN", then why can't we just
print that LSN in the error context and/or in the new statistics view
for logical replication workers, so that any of the existing ways can
be used to skip exactly one txn?

I think specifying XID to the subscription is more understandable for users.

IIUC, the feature proposed here guards against the users specifying
wrong LSN. If I'm right, what is the guarantee that users don't
specify the wrong txn id? Why can't we tell the users when a wrong LSN
is specified that "currently, an apply worker is failing to apply the
LSN XXXX, and you specified LSN YYYY, are you sure this is
intentional?"

With the initial idea, specifying the correct XID is the user's
responsibility. If they specify an old XID, the worker invalids it and
raises a warning to tell "the worker invalidated the specified XID as
it's too old". As the second idea, if we store the last failed XID
somewhere (e.g., a system catalog), the user can just specify to skip
that transaction. That is, instead of specifying the XID they could do
something like "ALTER SUBSCRIPTION test_sub RESOLVE CONFLICT BY SKIP".

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#8Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#4)
Re: Skipping logical replication transactions on subscriber side

On Tue, May 25, 2021 at 12:26 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Mon, May 24, 2021 at 7:51 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

I think you need to consider few more things here:
(a) Say the error occurs after applying some part of changes, then
just skipping the remaining part won't be sufficient, we probably need
to someway rollback the applied changes (by rolling back the
transaction or in some other way).

After more thought, it might be better to that setting and resetting
the XID to skip requires disabling the subscription.

It might be better if it doesn't require disabling the subscription
because it would be more steps for the user to disable/enable it. It
is not clear to me what exactly you want to gain by disabling the
subscription in this case.

This would not be
a restriction for users since logical replication is likely to already
stop (and possibly repeating restarting and stopping) due to an error.
Setting and resetting the XID modifies the system catalog so it's a
crash-safe change and survives beyond the server restarts. When a
logical replication worker starts, it checks the XID. If the worker
receives changes associated with the transaction with the specified
XID, it can ignore the entire transaction.

(b) How do you handle streamed transactions? It is possible that some
of the streams are successful and the error occurs after that, say
when writing to the stream file. Now, would you skip writing to stream
file or will you write it, and then during apply, you will skip the
entire transaction and remove the corresponding stream file.

I think streamed transactions can be handled in the same way described in (a).

(c) There is also a possibility that the error occurs while applying
the changes of some subtransaction (this is only possible for
streaming xacts), so, in such cases, do we allow users to rollback the
subtransaction or user has to rollback the entire transaction. I am
not sure but maybe for very large transactions users might just want
to rollback the subtransaction.

If the user specifies XID of a subtransaction, it would be better to
skip only the subtransaction. If specifies top transaction XID, it
would be better to skip the entire transaction. What do you think?

makes sense.

(d) How about prepared transactions? Do we need to rollback the
prepared transaction if user decides to skip such a transaction? We
already allow prepared transactions to be streamed to plugins and the
work for subscriber-side apply is in progress [1], so I think we need
to consider this case as well.

If a transaction replicated from the subscriber could be prepared on
the subscriber, it would be guaranteed to be able to be either
committed or rolled back. Given that this feature is to skip a problem
transaction, I think it should not do anything for transactions that
are already prepared on the subscriber.

makes sense, but I think we need to reset the XID in such a case.

(e) Do we want to provide such a feature via output plugins as well,
if not, why?

You mean to specify an XID to skip on the publisher side? Since I've
been considering this feature as a way to resume the logical
replication having a problem I've not thought of that idea but It
would be a good idea. Do you have any use cases?

No. On again thinking about this, I think we can leave this for now.

If we specified the
XID on the publisher, multiple subscribers would skip that
transaction.

For (2), what I'm thinking is to add a new action to ALTER
SUBSCRIPTION command like ALTER SUBSCRIPTION test_sub SET SKIP
TRANSACTION 590. Also, we can have actions to reset it; ALTER
SUBSCRIPTION test_sub RESET SKIP TRANSACTION. Those commands add the
XID to a new column of pg_subscription or a new catalog, having the
worker reread its subscription information. Once the worker skipped
the specified transaction, it resets the transaction to skip on the
catalog.

What if we fail while updating the reset information in the catalog?
Will it be the responsibility of the user to reset such a transaction
or we will retry it after restart of worker? Now, say, we give such a
responsibility to the user and the user forgets to reset it then there
is a possibility that after wraparound we will again skip the
transaction which is not intended. And, if we want to retry it after
restart of worker, how will the worker remember the previous failure?

As described above, setting and resetting XID to skip is implemented
as a normal system catalog change, so it's crash-safe and persisted. I
think that the worker can either removes the XID or mark it as done
once it skipped the specified transaction so that it won't skip the
same XID again after wraparound.

It all depends on when exactly you want to update the catalog
information. Say after skipping commit of the XID, we do update the
corresponding LSN to be communicated as already processed to the
subscriber and then get the error while updating the catalog
information then next time we might not know whether to update the
catalog for skipped XID.

Also, it might be better if we reset
the XID also when a subscription field such as subconninfo is changed
because it could imply the worker will connect to another publisher
having a different XID space.

We also need to handle the cases where the user specifies an old XID
or XID whose transaction is already prepared on the subscriber. I
think the worker can reset the XID with a warning when it finds out
that the XID seems no longer valid or it cannot skip the specified
XID. For example in the former case, it can do that when the first
received transaction’s XID is newer than the specified XID.

But how can we guarantee that older XID can't be received later? Is
there a guarantee that we receive the transactions on subscriber in
XID order.

--
With Regards,
Amit Kapila.

#9Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#7)
Re: Skipping logical replication transactions on subscriber side

On Tue, May 25, 2021 at 6:12 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Tue, May 25, 2021 at 7:21 PM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

If there's no way to get the "correct LSN", then why can't we just
print that LSN in the error context and/or in the new statistics view
for logical replication workers, so that any of the existing ways can
be used to skip exactly one txn?

I think specifying XID to the subscription is more understandable for users.

I agree with you that specifying XID could be easier and
understandable for users. I was thinking and studying a bit about what
other systems do in this regard. Why don't we try to provide conflict
resolution methods for users? The idea could be that either the
conflicts can be resolved automatically or manually. In the case of
manual resolution, users can use the existing methods or the XID stuff
you are proposing here and in case of automatic resolution, the
in-built or corresponding user-defined functions will be invoked for
conflict resolution. There are more details to figure out in the
automatic resolution scheme but I see a lot of value in doing the
same.

--
With Regards,
Amit Kapila.

#10Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#8)
Re: Skipping logical replication transactions on subscriber side

On Wed, May 26, 2021 at 3:43 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Tue, May 25, 2021 at 12:26 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Mon, May 24, 2021 at 7:51 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

I think you need to consider few more things here:
(a) Say the error occurs after applying some part of changes, then
just skipping the remaining part won't be sufficient, we probably need
to someway rollback the applied changes (by rolling back the
transaction or in some other way).

After more thought, it might be better to that setting and resetting
the XID to skip requires disabling the subscription.

It might be better if it doesn't require disabling the subscription
because it would be more steps for the user to disable/enable it. It
is not clear to me what exactly you want to gain by disabling the
subscription in this case.

The situation I’m considered is where the user specifies the XID while
the worker is applying the changes of the transaction with that XID.
In this case, I think we need to somehow rollback the changes applied
so far. Perhaps we can either rollback the transaction and ignore the
remaining changes or restart and ignore the entire transaction from
the beginning. Also, we need to handle the case where the user resets
the XID after the worker skips to write some stream files. I thought
those parts could be complicated but it might be not after more
thought.

This would not be
a restriction for users since logical replication is likely to already
stop (and possibly repeating restarting and stopping) due to an error.
Setting and resetting the XID modifies the system catalog so it's a
crash-safe change and survives beyond the server restarts. When a
logical replication worker starts, it checks the XID. If the worker
receives changes associated with the transaction with the specified
XID, it can ignore the entire transaction.

(b) How do you handle streamed transactions? It is possible that some
of the streams are successful and the error occurs after that, say
when writing to the stream file. Now, would you skip writing to stream
file or will you write it, and then during apply, you will skip the
entire transaction and remove the corresponding stream file.

I think streamed transactions can be handled in the same way described in (a).

If setting and resetting the XID can be performed during the worker
running, we would need to write stream files even if we’re receiving
changes that are associated with the specified XID. Since it could
happen that the user resets the XID after we processed some of the
streamed changes, we would need to decide whether or to skip the
transaction when starting to apply changes.

(c) There is also a possibility that the error occurs while applying
the changes of some subtransaction (this is only possible for
streaming xacts), so, in such cases, do we allow users to rollback the
subtransaction or user has to rollback the entire transaction. I am
not sure but maybe for very large transactions users might just want
to rollback the subtransaction.

If the user specifies XID of a subtransaction, it would be better to
skip only the subtransaction. If specifies top transaction XID, it
would be better to skip the entire transaction. What do you think?

makes sense.

(d) How about prepared transactions? Do we need to rollback the
prepared transaction if user decides to skip such a transaction? We
already allow prepared transactions to be streamed to plugins and the
work for subscriber-side apply is in progress [1], so I think we need
to consider this case as well.

If a transaction replicated from the subscriber could be prepared on
the subscriber, it would be guaranteed to be able to be either
committed or rolled back. Given that this feature is to skip a problem
transaction, I think it should not do anything for transactions that
are already prepared on the subscriber.

makes sense, but I think we need to reset the XID in such a case.

Agreed.

(e) Do we want to provide such a feature via output plugins as well,
if not, why?

You mean to specify an XID to skip on the publisher side? Since I've
been considering this feature as a way to resume the logical
replication having a problem I've not thought of that idea but It
would be a good idea. Do you have any use cases?

No. On again thinking about this, I think we can leave this for now.

If we specified the
XID on the publisher, multiple subscribers would skip that
transaction.

For (2), what I'm thinking is to add a new action to ALTER
SUBSCRIPTION command like ALTER SUBSCRIPTION test_sub SET SKIP
TRANSACTION 590. Also, we can have actions to reset it; ALTER
SUBSCRIPTION test_sub RESET SKIP TRANSACTION. Those commands add the
XID to a new column of pg_subscription or a new catalog, having the
worker reread its subscription information. Once the worker skipped
the specified transaction, it resets the transaction to skip on the
catalog.

What if we fail while updating the reset information in the catalog?
Will it be the responsibility of the user to reset such a transaction
or we will retry it after restart of worker? Now, say, we give such a
responsibility to the user and the user forgets to reset it then there
is a possibility that after wraparound we will again skip the
transaction which is not intended. And, if we want to retry it after
restart of worker, how will the worker remember the previous failure?

As described above, setting and resetting XID to skip is implemented
as a normal system catalog change, so it's crash-safe and persisted. I
think that the worker can either removes the XID or mark it as done
once it skipped the specified transaction so that it won't skip the
same XID again after wraparound.

It all depends on when exactly you want to update the catalog
information. Say after skipping commit of the XID, we do update the
corresponding LSN to be communicated as already processed to the
subscriber and then get the error while updating the catalog
information then next time we might not know whether to update the
catalog for skipped XID.

Also, it might be better if we reset
the XID also when a subscription field such as subconninfo is changed
because it could imply the worker will connect to another publisher
having a different XID space.

We also need to handle the cases where the user specifies an old XID
or XID whose transaction is already prepared on the subscriber. I
think the worker can reset the XID with a warning when it finds out
that the XID seems no longer valid or it cannot skip the specified
XID. For example in the former case, it can do that when the first
received transaction’s XID is newer than the specified XID.

But how can we guarantee that older XID can't be received later? Is
there a guarantee that we receive the transactions on subscriber in
XID order.

Considering the above two comments, it might be better to provide a
way to skip the transaction that is already known to be conflicted
rather than allowing users to specify the arbitrary XID.

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#11Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#10)
Re: Skipping logical replication transactions on subscriber side

On Thu, May 27, 2021 at 9:56 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Wed, May 26, 2021 at 3:43 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Tue, May 25, 2021 at 12:26 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Mon, May 24, 2021 at 7:51 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

I think you need to consider few more things here:
(a) Say the error occurs after applying some part of changes, then
just skipping the remaining part won't be sufficient, we probably need
to someway rollback the applied changes (by rolling back the
transaction or in some other way).

After more thought, it might be better to that setting and resetting
the XID to skip requires disabling the subscription.

It might be better if it doesn't require disabling the subscription
because it would be more steps for the user to disable/enable it. It
is not clear to me what exactly you want to gain by disabling the
subscription in this case.

The situation I’m considered is where the user specifies the XID while
the worker is applying the changes of the transaction with that XID.
In this case, I think we need to somehow rollback the changes applied
so far. Perhaps we can either rollback the transaction and ignore the
remaining changes or restart and ignore the entire transaction from
the beginning.

If we follow your suggestion of only allowing XIDs that have been
known to have conflicts then probably we don't need to worry about
rollbacks.

For (2), what I'm thinking is to add a new action to ALTER
SUBSCRIPTION command like ALTER SUBSCRIPTION test_sub SET SKIP
TRANSACTION 590. Also, we can have actions to reset it; ALTER
SUBSCRIPTION test_sub RESET SKIP TRANSACTION. Those commands add the
XID to a new column of pg_subscription or a new catalog, having the
worker reread its subscription information. Once the worker skipped
the specified transaction, it resets the transaction to skip on the
catalog.

What if we fail while updating the reset information in the catalog?
Will it be the responsibility of the user to reset such a transaction
or we will retry it after restart of worker? Now, say, we give such a
responsibility to the user and the user forgets to reset it then there
is a possibility that after wraparound we will again skip the
transaction which is not intended. And, if we want to retry it after
restart of worker, how will the worker remember the previous failure?

As described above, setting and resetting XID to skip is implemented
as a normal system catalog change, so it's crash-safe and persisted. I
think that the worker can either removes the XID or mark it as done
once it skipped the specified transaction so that it won't skip the
same XID again after wraparound.

It all depends on when exactly you want to update the catalog
information. Say after skipping commit of the XID, we do update the
corresponding LSN to be communicated as already processed to the
subscriber and then get the error while updating the catalog
information then next time we might not know whether to update the
catalog for skipped XID.

Also, it might be better if we reset
the XID also when a subscription field such as subconninfo is changed
because it could imply the worker will connect to another publisher
having a different XID space.

We also need to handle the cases where the user specifies an old XID
or XID whose transaction is already prepared on the subscriber. I
think the worker can reset the XID with a warning when it finds out
that the XID seems no longer valid or it cannot skip the specified
XID. For example in the former case, it can do that when the first
received transaction’s XID is newer than the specified XID.

But how can we guarantee that older XID can't be received later? Is
there a guarantee that we receive the transactions on subscriber in
XID order.

Considering the above two comments, it might be better to provide a
way to skip the transaction that is already known to be conflicted
rather than allowing users to specify the arbitrary XID.

Okay, that makes sense but still not sure how will you identify if we
need to reset XID in case of failure doing that in the previous
attempt. Also, I am thinking that instead of a stat view, do we need
to consider having a system table (pg_replication_conflicts or
something like that) for this because what if stats information is
lost (say either due to crash or due to udp packet loss), can we rely
on stats view for this?

--
With Regards,
Amit Kapila.

#12Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#9)
Re: Skipping logical replication transactions on subscriber side

On Wed, May 26, 2021 at 6:11 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Tue, May 25, 2021 at 6:12 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Tue, May 25, 2021 at 7:21 PM Bharath Rupireddy
<bharath.rupireddyforpostgres@gmail.com> wrote:

If there's no way to get the "correct LSN", then why can't we just
print that LSN in the error context and/or in the new statistics view
for logical replication workers, so that any of the existing ways can
be used to skip exactly one txn?

I think specifying XID to the subscription is more understandable for users.

I agree with you that specifying XID could be easier and
understandable for users. I was thinking and studying a bit about what
other systems do in this regard. Why don't we try to provide conflict
resolution methods for users? The idea could be that either the
conflicts can be resolved automatically or manually. In the case of
manual resolution, users can use the existing methods or the XID stuff
you are proposing here and in case of automatic resolution, the
in-built or corresponding user-defined functions will be invoked for
conflict resolution. There are more details to figure out in the
automatic resolution scheme but I see a lot of value in doing the
same.

Yeah, I also see a lot of value in automatic conflict resolution. But
maybe we can have both ways? For example, in case where the user wants
to resolve conflicts in different ways or a conflict that cannot be
resolved by automatic resolution (not sure there is in practice
though), the manual resolution would also have value.

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#13Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#11)
Re: Skipping logical replication transactions on subscriber side

On Thu, May 27, 2021 at 2:48 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Thu, May 27, 2021 at 9:56 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Wed, May 26, 2021 at 3:43 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Tue, May 25, 2021 at 12:26 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Mon, May 24, 2021 at 7:51 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 24, 2021 at 1:32 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

I think you need to consider few more things here:
(a) Say the error occurs after applying some part of changes, then
just skipping the remaining part won't be sufficient, we probably need
to someway rollback the applied changes (by rolling back the
transaction or in some other way).

After more thought, it might be better to that setting and resetting
the XID to skip requires disabling the subscription.

It might be better if it doesn't require disabling the subscription
because it would be more steps for the user to disable/enable it. It
is not clear to me what exactly you want to gain by disabling the
subscription in this case.

The situation I’m considered is where the user specifies the XID while
the worker is applying the changes of the transaction with that XID.
In this case, I think we need to somehow rollback the changes applied
so far. Perhaps we can either rollback the transaction and ignore the
remaining changes or restart and ignore the entire transaction from
the beginning.

If we follow your suggestion of only allowing XIDs that have been
known to have conflicts then probably we don't need to worry about
rollbacks.

For (2), what I'm thinking is to add a new action to ALTER
SUBSCRIPTION command like ALTER SUBSCRIPTION test_sub SET SKIP
TRANSACTION 590. Also, we can have actions to reset it; ALTER
SUBSCRIPTION test_sub RESET SKIP TRANSACTION. Those commands add the
XID to a new column of pg_subscription or a new catalog, having the
worker reread its subscription information. Once the worker skipped
the specified transaction, it resets the transaction to skip on the
catalog.

What if we fail while updating the reset information in the catalog?
Will it be the responsibility of the user to reset such a transaction
or we will retry it after restart of worker? Now, say, we give such a
responsibility to the user and the user forgets to reset it then there
is a possibility that after wraparound we will again skip the
transaction which is not intended. And, if we want to retry it after
restart of worker, how will the worker remember the previous failure?

As described above, setting and resetting XID to skip is implemented
as a normal system catalog change, so it's crash-safe and persisted. I
think that the worker can either removes the XID or mark it as done
once it skipped the specified transaction so that it won't skip the
same XID again after wraparound.

It all depends on when exactly you want to update the catalog
information. Say after skipping commit of the XID, we do update the
corresponding LSN to be communicated as already processed to the
subscriber and then get the error while updating the catalog
information then next time we might not know whether to update the
catalog for skipped XID.

Also, it might be better if we reset
the XID also when a subscription field such as subconninfo is changed
because it could imply the worker will connect to another publisher
having a different XID space.

We also need to handle the cases where the user specifies an old XID
or XID whose transaction is already prepared on the subscriber. I
think the worker can reset the XID with a warning when it finds out
that the XID seems no longer valid or it cannot skip the specified
XID. For example in the former case, it can do that when the first
received transaction’s XID is newer than the specified XID.

But how can we guarantee that older XID can't be received later? Is
there a guarantee that we receive the transactions on subscriber in
XID order.

Considering the above two comments, it might be better to provide a
way to skip the transaction that is already known to be conflicted
rather than allowing users to specify the arbitrary XID.

Okay, that makes sense but still not sure how will you identify if we
need to reset XID in case of failure doing that in the previous
attempt.

It's a just idea but we can record the failed transaction with XID as
well as its commit LSN passed? The sequence I'm thinking is,

1. the worker records the XID and commit LSN of the failed transaction
to a catalog.
2. the user specifies how to resolve that conflict transaction
(currently only 'skip' is supported) and writes to the catalog.
3. the worker does the resolution method according to the catalog. If
the worker didn't start to apply those changes, it can skip the entire
transaction. If did, it rollbacks the transaction and ignores the
remaining.

The worker needs neither to reset information of the last failed
transaction nor to mark the conflicted transaction as resolved. The
worker will ignore that information when checking the catalog if the
commit LSN is passed.

Also, I am thinking that instead of a stat view, do we need
to consider having a system table (pg_replication_conflicts or
something like that) for this because what if stats information is
lost (say either due to crash or due to udp packet loss), can we rely
on stats view for this?

Yeah, it seems better to use a catalog.

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#14Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#13)
Re: Skipping logical replication transactions on subscriber side

On Thu, May 27, 2021 at 1:46 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Thu, May 27, 2021 at 2:48 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

Okay, that makes sense but still not sure how will you identify if we
need to reset XID in case of failure doing that in the previous
attempt.

It's a just idea but we can record the failed transaction with XID as
well as its commit LSN passed? The sequence I'm thinking is,

1. the worker records the XID and commit LSN of the failed transaction
to a catalog.

When will you record this info? I am not sure if we can try to update
this when an error has occurred. We can think of using try..catch in
apply worker and then record it in catch on error but would that be
advisable? One random thought that occurred to me is to that apply
worker notifies such information to the launcher (or maybe another
process) which will log this information.

2. the user specifies how to resolve that conflict transaction
(currently only 'skip' is supported) and writes to the catalog.
3. the worker does the resolution method according to the catalog. If
the worker didn't start to apply those changes, it can skip the entire
transaction. If did, it rollbacks the transaction and ignores the
remaining.

The worker needs neither to reset information of the last failed
transaction nor to mark the conflicted transaction as resolved. The
worker will ignore that information when checking the catalog if the
commit LSN is passed.

So won't this require us to check the required info in the catalog
before applying each transaction? If so, that might be overhead, maybe
we can build some cache of the highest commitLSN that can be consulted
rather than the catalog table. I think we need to think about when to
remove rows for which conflict has been resolved as we can't let that
information grow infinitely.

Also, I am thinking that instead of a stat view, do we need
to consider having a system table (pg_replication_conflicts or
something like that) for this because what if stats information is
lost (say either due to crash or due to udp packet loss), can we rely
on stats view for this?

Yeah, it seems better to use a catalog.

Okay.

--
With Regards,
Amit Kapila.

#15Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#12)
Re: Skipping logical replication transactions on subscriber side

On Thu, May 27, 2021 at 12:01 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Wed, May 26, 2021 at 6:11 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

I agree with you that specifying XID could be easier and
understandable for users. I was thinking and studying a bit about what
other systems do in this regard. Why don't we try to provide conflict
resolution methods for users? The idea could be that either the
conflicts can be resolved automatically or manually. In the case of
manual resolution, users can use the existing methods or the XID stuff
you are proposing here and in case of automatic resolution, the
in-built or corresponding user-defined functions will be invoked for
conflict resolution. There are more details to figure out in the
automatic resolution scheme but I see a lot of value in doing the
same.

Yeah, I also see a lot of value in automatic conflict resolution. But
maybe we can have both ways? For example, in case where the user wants
to resolve conflicts in different ways or a conflict that cannot be
resolved by automatic resolution (not sure there is in practice
though), the manual resolution would also have value.

Right, that is exactly what I was saying. So, even if both can be done
as separate patches, we should try to design the manual resolution in
a way that can be extended for an automatic resolution system. I think
we can try to have some initial idea/design/POC for an automatic
resolution as well to ensure that the manual resolution scheme can be
further extended.

--
With Regards,
Amit Kapila.

#16Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#15)
Re: Skipping logical replication transactions on subscriber side

On Thu, May 27, 2021 at 7:26 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Thu, May 27, 2021 at 12:01 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Wed, May 26, 2021 at 6:11 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

I agree with you that specifying XID could be easier and
understandable for users. I was thinking and studying a bit about what
other systems do in this regard. Why don't we try to provide conflict
resolution methods for users? The idea could be that either the
conflicts can be resolved automatically or manually. In the case of
manual resolution, users can use the existing methods or the XID stuff
you are proposing here and in case of automatic resolution, the
in-built or corresponding user-defined functions will be invoked for
conflict resolution. There are more details to figure out in the
automatic resolution scheme but I see a lot of value in doing the
same.

Yeah, I also see a lot of value in automatic conflict resolution. But
maybe we can have both ways? For example, in case where the user wants
to resolve conflicts in different ways or a conflict that cannot be
resolved by automatic resolution (not sure there is in practice
though), the manual resolution would also have value.

Right, that is exactly what I was saying. So, even if both can be done
as separate patches, we should try to design the manual resolution in
a way that can be extended for an automatic resolution system. I think
we can try to have some initial idea/design/POC for an automatic
resolution as well to ensure that the manual resolution scheme can be
further extended.

Totally agreed.

But perhaps we might want to note that the conflict resolution we're
talking about is to resolve conflicts at the row or column level. It
doesn't necessarily raise an ERROR and the granularity of resolution
is per record or column. For example, if a DELETE and an UPDATE
process the same tuple (searched by PK), the UPDATE may not find the
tuple and be ignored due to the tuple having been already deleted. In
this case, no ERROR will occur (i.g. UPDATE will be ignored), but the
user may want to do another conflict resolution. On the other hand,
the feature proposed here assumes that an error has already occurred
and logical replication has already been stopped. And resolves it by
skipping the entire transaction.

IIUC the conflict resolution can be thought of as a combination of
types of conflicts and the resolution that can be applied to them. For
example, if there is a conflict between INSERT and INSERT and the
latter INSERT violates the unique constraint, an ERROR is raised. So
DBA can resolve it manually. But there is another way to automatically
resolve it by selecting the tuple having a newer timestamp. On the
other hand, in the DELETE and UPDATE conflict described above, it's
possible to automatically ignore the fact that the UPDATE could update
the tuple. Or we can even generate an ERROR so that DBA can resolve it
manually. DBA can manually resolve the conflict in various ways:
skipping the entire transaction from the origin, choose the tuple
having a newer/older timestamp, etc.

In that sense, we can think of the feature proposed here as a feature
that provides a way to resolve the conflict that would originally
cause an ERROR by skipping the entire transaction. If we add a
solution that raises an ERROR for conflicts that don't originally
raise an ERROR (like DELETE and UPDATE conflict) in the future, we
will be able to manually skip each transaction for all types of
conflicts.

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#17Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#14)
Re: Skipping logical replication transactions on subscriber side

On Thu, May 27, 2021 at 7:04 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Thu, May 27, 2021 at 1:46 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Thu, May 27, 2021 at 2:48 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

Okay, that makes sense but still not sure how will you identify if we
need to reset XID in case of failure doing that in the previous
attempt.

It's a just idea but we can record the failed transaction with XID as
well as its commit LSN passed? The sequence I'm thinking is,

1. the worker records the XID and commit LSN of the failed transaction
to a catalog.

When will you record this info? I am not sure if we can try to update
this when an error has occurred. We can think of using try..catch in
apply worker and then record it in catch on error but would that be
advisable? One random thought that occurred to me is to that apply
worker notifies such information to the launcher (or maybe another
process) which will log this information.

Yeah, I was concerned about that too and had the same idea. The
information still could not be written if the server crashes before
the launcher writes it. But I think it's an acceptable.

2. the user specifies how to resolve that conflict transaction
(currently only 'skip' is supported) and writes to the catalog.
3. the worker does the resolution method according to the catalog. If
the worker didn't start to apply those changes, it can skip the entire
transaction. If did, it rollbacks the transaction and ignores the
remaining.

The worker needs neither to reset information of the last failed
transaction nor to mark the conflicted transaction as resolved. The
worker will ignore that information when checking the catalog if the
commit LSN is passed.

So won't this require us to check the required info in the catalog
before applying each transaction? If so, that might be overhead, maybe
we can build some cache of the highest commitLSN that can be consulted
rather than the catalog table.

I think workers can cache that information when starts and invalidates
and reload the cache when the catalog gets updated. Specifying to
skip XID will update the catalog, invalidating the cache.

I think we need to think about when to
remove rows for which conflict has been resolved as we can't let that
information grow infinitely.

I guess we can update catalog tuples in place when another conflict
happens next time. The catalog tuple should be fixed size. The
already-resolved conflict will have the commit LSN older than its
replication origin's LSN.

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#18Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#17)
Re: Skipping logical replication transactions on subscriber side

On Sat, May 29, 2021 at 8:27 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Thu, May 27, 2021 at 7:04 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Thu, May 27, 2021 at 1:46 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

1. the worker records the XID and commit LSN of the failed transaction
to a catalog.

When will you record this info? I am not sure if we can try to update
this when an error has occurred. We can think of using try..catch in
apply worker and then record it in catch on error but would that be
advisable? One random thought that occurred to me is to that apply
worker notifies such information to the launcher (or maybe another
process) which will log this information.

Yeah, I was concerned about that too and had the same idea. The
information still could not be written if the server crashes before
the launcher writes it. But I think it's an acceptable.

True, because even if the launcher restarts, the apply worker will
error out again and resend the information. I guess we can have an
error queue where apply workers can add their information and the
launcher will then process those. If we do that, then we need to
probably define what we want to do if the queue gets full, either
apply worker nudge launcher and wait or it can just throw an error and
continue. If you have any better ideas to share this information then
we can consider those as well.

2. the user specifies how to resolve that conflict transaction
(currently only 'skip' is supported) and writes to the catalog.
3. the worker does the resolution method according to the catalog. If
the worker didn't start to apply those changes, it can skip the entire
transaction. If did, it rollbacks the transaction and ignores the
remaining.

The worker needs neither to reset information of the last failed
transaction nor to mark the conflicted transaction as resolved. The
worker will ignore that information when checking the catalog if the
commit LSN is passed.

So won't this require us to check the required info in the catalog
before applying each transaction? If so, that might be overhead, maybe
we can build some cache of the highest commitLSN that can be consulted
rather than the catalog table.

I think workers can cache that information when starts and invalidates
and reload the cache when the catalog gets updated. Specifying to
skip XID will update the catalog, invalidating the cache.

I think we need to think about when to
remove rows for which conflict has been resolved as we can't let that
information grow infinitely.

I guess we can update catalog tuples in place when another conflict
happens next time. The catalog tuple should be fixed size. The
already-resolved conflict will have the commit LSN older than its
replication origin's LSN.

Okay, but I have a slight concern that we will keep xid in the system
which might have been no longer valid. So, we will keep this info
about subscribers around till one performs drop subscription,
hopefully, that doesn't lead to too many rows. This will be okay as
per the current design but say tomorrow we decide to parallelize the
apply for a subscription then there could be multiple errors
corresponding to a subscription and in that case, such a design might
appear quite limiting. One possibility could be that when the launcher
is periodically checking for new error messages, it can clean up the
conflicts catalog as well, or maybe autovacuum does this periodically
as it does for stats (via pgstat_vacuum_stat).

--
With Regards,
Amit Kapila.

#19Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#18)
Re: Skipping logical replication transactions on subscriber side

On Sat, May 29, 2021 at 3:54 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Sat, May 29, 2021 at 8:27 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Thu, May 27, 2021 at 7:04 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Thu, May 27, 2021 at 1:46 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

1. the worker records the XID and commit LSN of the failed transaction
to a catalog.

When will you record this info? I am not sure if we can try to update
this when an error has occurred. We can think of using try..catch in
apply worker and then record it in catch on error but would that be
advisable? One random thought that occurred to me is to that apply
worker notifies such information to the launcher (or maybe another
process) which will log this information.

Yeah, I was concerned about that too and had the same idea. The
information still could not be written if the server crashes before
the launcher writes it. But I think it's an acceptable.

True, because even if the launcher restarts, the apply worker will
error out again and resend the information. I guess we can have an
error queue where apply workers can add their information and the
launcher will then process those. If we do that, then we need to
probably define what we want to do if the queue gets full, either
apply worker nudge launcher and wait or it can just throw an error and
continue. If you have any better ideas to share this information then
we can consider those as well.

+1 for using error queue. Maybe we need to avoid queuing the same
error more than once to avoid the catalog from being updated
frequently?

2. the user specifies how to resolve that conflict transaction
(currently only 'skip' is supported) and writes to the catalog.
3. the worker does the resolution method according to the catalog. If
the worker didn't start to apply those changes, it can skip the entire
transaction. If did, it rollbacks the transaction and ignores the
remaining.

The worker needs neither to reset information of the last failed
transaction nor to mark the conflicted transaction as resolved. The
worker will ignore that information when checking the catalog if the
commit LSN is passed.

So won't this require us to check the required info in the catalog
before applying each transaction? If so, that might be overhead, maybe
we can build some cache of the highest commitLSN that can be consulted
rather than the catalog table.

I think workers can cache that information when starts and invalidates
and reload the cache when the catalog gets updated. Specifying to
skip XID will update the catalog, invalidating the cache.

I think we need to think about when to
remove rows for which conflict has been resolved as we can't let that
information grow infinitely.

I guess we can update catalog tuples in place when another conflict
happens next time. The catalog tuple should be fixed size. The
already-resolved conflict will have the commit LSN older than its
replication origin's LSN.

Okay, but I have a slight concern that we will keep xid in the system
which might have been no longer valid. So, we will keep this info
about subscribers around till one performs drop subscription,
hopefully, that doesn't lead to too many rows. This will be okay as
per the current design but say tomorrow we decide to parallelize the
apply for a subscription then there could be multiple errors
corresponding to a subscription and in that case, such a design might
appear quite limiting. One possibility could be that when the launcher
is periodically checking for new error messages, it can clean up the
conflicts catalog as well, or maybe autovacuum does this periodically
as it does for stats (via pgstat_vacuum_stat).

Yeah, it's better to have a way to cleanup no longer valid entries in
the catalog in the case where the worker failed to remove it. I prefer
the former idea so far, so I'll implement it in a PoC patch.

Regards,

--
Masahiko Sawada
EDB: https://www.enterprisedb.com/

#20Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#19)
Re: Skipping logical replication transactions on subscriber side

On Mon, May 31, 2021 at 12:39 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Sat, May 29, 2021 at 3:54 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

1. the worker records the XID and commit LSN of the failed transaction
to a catalog.

When will you record this info? I am not sure if we can try to update
this when an error has occurred. We can think of using try..catch in
apply worker and then record it in catch on error but would that be
advisable? One random thought that occurred to me is to that apply
worker notifies such information to the launcher (or maybe another
process) which will log this information.

Yeah, I was concerned about that too and had the same idea. The
information still could not be written if the server crashes before
the launcher writes it. But I think it's an acceptable.

True, because even if the launcher restarts, the apply worker will
error out again and resend the information. I guess we can have an
error queue where apply workers can add their information and the
launcher will then process those. If we do that, then we need to
probably define what we want to do if the queue gets full, either
apply worker nudge launcher and wait or it can just throw an error and
continue. If you have any better ideas to share this information then
we can consider those as well.

+1 for using error queue. Maybe we need to avoid queuing the same
error more than once to avoid the catalog from being updated
frequently?

Yes, I think it is important because after logging the subscription
may still error again unless the user does something to skip or
resolve the conflict. I guess you need to check for the existence of
error in systable and or in the queue.

I guess we can update catalog tuples in place when another conflict
happens next time. The catalog tuple should be fixed size. The
already-resolved conflict will have the commit LSN older than its
replication origin's LSN.

Okay, but I have a slight concern that we will keep xid in the system
which might have been no longer valid. So, we will keep this info
about subscribers around till one performs drop subscription,
hopefully, that doesn't lead to too many rows. This will be okay as
per the current design but say tomorrow we decide to parallelize the
apply for a subscription then there could be multiple errors
corresponding to a subscription and in that case, such a design might
appear quite limiting. One possibility could be that when the launcher
is periodically checking for new error messages, it can clean up the
conflicts catalog as well, or maybe autovacuum does this periodically
as it does for stats (via pgstat_vacuum_stat).

Yeah, it's better to have a way to cleanup no longer valid entries in
the catalog in the case where the worker failed to remove it. I prefer
the former idea so far,

Which idea do you refer to here as former (cleaning up by launcher)?

so I'll implement it in a PoC patch.

Okay.

--
With Regards,
Amit Kapila.

#21Peter Eisentraut
peter_e@gmx.net
In reply to: Amit Kapila (#14)
#22Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Eisentraut (#21)
#23Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#22)
#24Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#23)
#25Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#24)
#26Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#25)
#27Peter Eisentraut
peter_e@gmx.net
In reply to: Amit Kapila (#22)
#28Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Eisentraut (#27)
#29Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#28)
#30Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#29)
#31Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#30)
#32Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#31)
#33Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#32)
#34Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#33)
#35Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#34)
#36Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#34)
#37Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#36)
#38Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#35)
#39Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#38)
#40Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#39)
#41Alexey Lesovsky
lesovsky@gmail.com
In reply to: Masahiko Sawada (#33)
#42Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Alexey Lesovsky (#41)
#43Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#39)
#44Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#42)
#45Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#43)
#46Alexey Lesovsky
lesovsky@gmail.com
In reply to: Masahiko Sawada (#42)
#47Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#45)
#48Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#47)
#49Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#48)
#50Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Alexey Lesovsky (#46)
#51Alexey Lesovsky
lesovsky@gmail.com
In reply to: Masahiko Sawada (#50)
#52Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#49)
#53Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexey Lesovsky (#51)
#54Alexey Lesovsky
lesovsky@gmail.com
In reply to: Amit Kapila (#53)
#55Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexey Lesovsky (#54)
#56Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#55)
#57Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#56)
#58Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#57)
#59Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#58)
#60Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#59)
#61Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#60)
#62Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#59)
#63Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#62)
#64Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#62)
#65Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#63)
#66Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#64)
#67Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#66)
#68Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#66)
#69Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#68)
#70Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#69)
#71Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#70)
#72Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#71)
#73Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#71)
#74Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#72)
#75Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#73)
#76Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#74)
#77Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#76)
#78vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#77)
#79Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#77)
#80Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#78)
#81Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#79)
#82osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#77)
#83osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#81)
#84Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#82)
#85Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#84)
#86Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#85)
#87Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#85)
#88Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#84)
#89Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#86)
#90Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#88)
#91Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#89)
#92Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#89)
#93Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#91)
#94Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#93)
#95Amit Kapila
amit.kapila16@gmail.com
In reply to: Greg Nancarrow (#94)
#96Greg Nancarrow
gregn4422@gmail.com
In reply to: Amit Kapila (#95)
#97Amit Kapila
amit.kapila16@gmail.com
In reply to: Greg Nancarrow (#96)
#98Greg Nancarrow
gregn4422@gmail.com
In reply to: Amit Kapila (#97)
#99Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#97)
#100Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#99)
#101Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#99)
#102Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#93)
#103Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Zhijie Hou (Fujitsu) (#102)
#104Greg Nancarrow
gregn4422@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#103)
#105Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#93)
#106Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#102)
#107Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#104)
#108Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#107)
#109tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#93)
#110Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#108)
#111Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#110)
#112Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#111)
#113Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#112)
#114Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#106)
#115Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#113)
#116Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#115)
#117Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#114)
#118Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#117)
#119Masahiko Sawada
sawada.mshk@gmail.com
In reply to: tanghy.fnst@fujitsu.com (#109)
#120Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#115)
#121Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#118)
#122Amit Kapila
amit.kapila16@gmail.com
In reply to: Greg Nancarrow (#100)
#123Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#121)
#124Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#122)
#125Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#105)
#126Greg Nancarrow
gregn4422@gmail.com
In reply to: Amit Kapila (#122)
#127Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#120)
#128Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#118)
#129Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#125)
#130Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#129)
#131tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#119)
#132Masahiko Sawada
sawada.mshk@gmail.com
In reply to: tanghy.fnst@fujitsu.com (#131)
#133Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#130)
#134tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#133)
#135Amit Kapila
amit.kapila16@gmail.com
In reply to: tanghy.fnst@fujitsu.com (#134)
#136Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#135)
#137tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#136)
#138Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#136)
#139Amit Kapila
amit.kapila16@gmail.com
In reply to: Greg Nancarrow (#138)
#140Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#139)
#141Greg Nancarrow
gregn4422@gmail.com
In reply to: Amit Kapila (#139)
#142Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#136)
#143Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#140)
#144Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#143)
#145Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#143)
#146Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#145)
#147Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#146)
#148Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#147)
#149Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#148)
#150Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#149)
#151Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#150)
#152Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#150)
#153Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#150)
#154Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#150)
#155Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#150)
#156Mark Dilger
mark.dilger@enterprisedb.com
In reply to: Masahiko Sawada (#150)
#157Mark Dilger
mark.dilger@enterprisedb.com
In reply to: Masahiko Sawada (#150)
#158Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#150)
#159Amit Kapila
amit.kapila16@gmail.com
In reply to: Mark Dilger (#157)
#160Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#159)
#161Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#151)
#162Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#152)
#163Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#155)
#164Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#153)
#165Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#154)
#166Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#158)
#167Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#165)
#168Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#159)
#169Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#166)
#170Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#169)
#171Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#169)
#172Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#170)
#173Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#169)
#174Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#173)
#175Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Mark Dilger (#156)
#176Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#174)
#177Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#174)
#178Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#174)
#179Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#174)
#180Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#179)
#181Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#177)
#182Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#178)
#183Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#180)
#184Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#183)
#185Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#184)
#186Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#175)
#187Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#185)
#188Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#187)
#189Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#186)
#190Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#189)
#191Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#188)
#192Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#191)
#193Peter Eisentraut
peter_e@gmx.net
In reply to: Masahiko Sawada (#192)
#194Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Peter Eisentraut (#193)
#195Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#194)
#196Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#194)
#197Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#195)
#198Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#196)
#199Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#198)
#200Greg Nancarrow
gregn4422@gmail.com
In reply to: Amit Kapila (#199)
#201osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#192)
#202Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#192)
#203osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#192)
#204Peter Eisentraut
peter_e@gmx.net
In reply to: Masahiko Sawada (#198)
#205Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#201)
#206osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#205)
#207Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Peter Eisentraut (#204)
#208Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#202)
#209Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#203)
#210Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#208)
#211Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#208)
#212Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#208)
#213Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#210)
#214Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#211)
#215Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#212)
#216Amit Kapila
amit.kapila16@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#206)
#217Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#207)
#218Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#217)
#219Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#218)
#220Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#219)
#221Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#215)
#222Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#215)
#223Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#221)
#224Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#222)
#225Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#200)
#226Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#225)
#227Greg Nancarrow
gregn4422@gmail.com
In reply to: Amit Kapila (#226)
#228Amit Kapila
amit.kapila16@gmail.com
In reply to: Greg Nancarrow (#227)
#229Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#228)
#230Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#224)
#231Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#229)
#232Greg Nancarrow
gregn4422@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#230)
#233Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#231)
#234Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#233)
#235tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#224)
#236Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#224)
#237Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#229)
#238Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#234)
#239Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#238)
#240Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#237)
#241Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#236)
#242Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#239)
#243Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#240)
#244Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#243)
#245Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#242)
#246Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#241)
#247vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#224)
#248Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#244)
#249Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#246)
#250Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#247)
#251Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#248)
#252Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#249)
#253Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#252)
#254Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#252)
#255Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#253)
#256Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#249)
#257Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#254)
#258Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#255)
#259Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#257)
#260tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#249)
#261Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#259)
#262Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#259)
#263vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#249)
#264Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#262)
#265Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#263)
#266Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#264)
#267Dilip Kumar
dilipbalaut@gmail.com
In reply to: Masahiko Sawada (#264)
#268Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#264)
#269Amit Kapila
amit.kapila16@gmail.com
In reply to: Dilip Kumar (#267)
#270Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#268)
#271Dilip Kumar
dilipbalaut@gmail.com
In reply to: Amit Kapila (#269)
#272Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#270)
#273Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#272)
#274Amit Kapila
amit.kapila16@gmail.com
In reply to: Dilip Kumar (#271)
#275vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#264)
#276Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#266)
#277Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Dilip Kumar (#267)
#278Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#275)
#279Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#278)
#280Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#279)
#281vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#280)
#282Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#281)
#283Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#282)
#284Amit Kapila
amit.kapila16@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#283)
#285Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#284)
#286vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#282)
#287Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#286)
#288vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#282)
#289Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#282)
#290Amit Kapila
amit.kapila16@gmail.com
In reply to: vignesh C (#288)
#291Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#282)
#292tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#282)
#293Masahiko Sawada
sawada.mshk@gmail.com
In reply to: tanghy.fnst@fujitsu.com (#292)
#294Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#283)
#295Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#288)
#296Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#282)
#297Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#293)
#298vignesh C
vignesh21@gmail.com
In reply to: Amit Kapila (#297)
#299Greg Nancarrow
gregn4422@gmail.com
In reply to: vignesh C (#298)
#300Amit Kapila
amit.kapila16@gmail.com
In reply to: vignesh C (#298)
#301vignesh C
vignesh21@gmail.com
In reply to: Amit Kapila (#300)
#302Greg Nancarrow
gregn4422@gmail.com
In reply to: Amit Kapila (#300)
#303Amit Kapila
amit.kapila16@gmail.com
In reply to: Greg Nancarrow (#302)
#304Greg Nancarrow
gregn4422@gmail.com
In reply to: Amit Kapila (#303)
#305Amit Kapila
amit.kapila16@gmail.com
In reply to: Greg Nancarrow (#304)
#306Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#305)
#307Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#291)
#308Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#307)
#309Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#308)
#310Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#309)
#311Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#289)
#312Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#311)
#313vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#311)
#314Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#311)
#315Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#312)
#316Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#313)
#317Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#314)
#318Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#315)
#319Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#318)
#320tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#319)
#321Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#319)
#322Amit Kapila
amit.kapila16@gmail.com
In reply to: tanghy.fnst@fujitsu.com (#320)
#323Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#321)
#324Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#323)
#325vignesh C
vignesh21@gmail.com
In reply to: Amit Kapila (#324)
#326Amit Kapila
amit.kapila16@gmail.com
In reply to: vignesh C (#325)
#327Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#326)
#328Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#327)
#329vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#328)
#330Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#328)
#331Amit Kapila
amit.kapila16@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#330)
#332Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Amit Kapila (#331)
#333Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#331)
#334Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#333)
#335Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#334)
#336Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Masahiko Sawada (#335)
#337Amit Kapila
amit.kapila16@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#336)
#338Peter Eisentraut
peter_e@gmx.net
In reply to: Amit Kapila (#337)
#339Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Eisentraut (#338)
#340Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#339)
#341Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#340)
#342Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#341)
#343Peter Eisentraut
peter_e@gmx.net
In reply to: Amit Kapila (#339)
#344Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#342)
#345Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#344)
#346Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#345)
#347Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#346)
#348Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#347)
#349Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#348)
#350Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#347)
#351Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#349)
#352Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#351)
#353Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#352)
#354Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#353)
#355Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#354)
#356Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#355)
#357Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#354)
#358Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#356)
#359Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#358)
#360Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#359)
#361vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#354)
#362Greg Nancarrow
gregn4422@gmail.com
In reply to: vignesh C (#361)
#363Dilip Kumar
dilipbalaut@gmail.com
In reply to: Masahiko Sawada (#340)
#364Dilip Kumar
dilipbalaut@gmail.com
In reply to: Amit Kapila (#360)
#365Amit Kapila
amit.kapila16@gmail.com
In reply to: Dilip Kumar (#364)
#366vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#354)
#367Dilip Kumar
dilipbalaut@gmail.com
In reply to: Amit Kapila (#365)
#368Amit Kapila
amit.kapila16@gmail.com
In reply to: Dilip Kumar (#367)
#369Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#368)
#370Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#362)
#371Dilip Kumar
dilipbalaut@gmail.com
In reply to: Amit Kapila (#368)
#372Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#370)
#373Amit Kapila
amit.kapila16@gmail.com
In reply to: Dilip Kumar (#363)
#374Dilip Kumar
dilipbalaut@gmail.com
In reply to: Amit Kapila (#373)
#375Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#370)
#376Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#372)
#377Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#376)
#378Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#377)
#379Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#378)
#380Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#379)
#381Peter Eisentraut
peter_e@gmx.net
In reply to: Greg Nancarrow (#357)
#382Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Eisentraut (#381)
#383Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#382)
#384Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#380)
#385Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#384)
#386Dilip Kumar
dilipbalaut@gmail.com
In reply to: Amit Kapila (#385)
#387Amit Kapila
amit.kapila16@gmail.com
In reply to: Dilip Kumar (#386)
#388Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#385)
#389Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#388)
#390Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#388)
#391vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#390)
#392Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#380)
#393Amit Kapila
amit.kapila16@gmail.com
In reply to: vignesh C (#391)
#394vignesh C
vignesh21@gmail.com
In reply to: Amit Kapila (#393)
#395Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#392)
#396Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#393)
#397Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#395)
#398Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#397)
#399Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#398)
#400Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#395)
#401Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#399)
#402Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#400)
#403Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#401)
#404Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#403)
#405Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#391)
#406vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#404)
#407tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#404)
#408Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#406)
#409Masahiko Sawada
sawada.mshk@gmail.com
In reply to: tanghy.fnst@fujitsu.com (#407)
#410vignesh C
vignesh21@gmail.com
In reply to: Masahiko Sawada (#408)
#411Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#408)
#412Amit Kapila
amit.kapila16@gmail.com
In reply to: vignesh C (#410)
#413Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#411)
#414Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#410)
#415Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#413)
#416Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#415)
#417osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#416)
#418osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: osumi.takamichi@fujitsu.com (#417)
#419Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#417)
#420Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#418)
#421Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#419)
#422Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#416)
#423Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#421)
#424Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#422)
#425Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#423)
#426tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#416)
#427osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#419)
#428Amit Kapila
amit.kapila16@gmail.com
In reply to: tanghy.fnst@fujitsu.com (#426)
#429Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#428)
#430Masahiko Sawada
sawada.mshk@gmail.com
In reply to: tanghy.fnst@fujitsu.com (#426)
#431Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#427)
#432osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#430)
#433Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#432)
#434osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#433)
#435vignesh C
vignesh21@gmail.com
In reply to: Amit Kapila (#412)
#436Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#433)
#437Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#434)
#438Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#437)
#439Peter Eisentraut
peter_e@gmx.net
In reply to: Masahiko Sawada (#433)
#440Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Peter Eisentraut (#439)
#441Masahiko Sawada
sawada.mshk@gmail.com
In reply to: vignesh C (#435)
#442Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Greg Nancarrow (#436)
#443Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#438)
#444Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#440)
#445Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#429)
#446Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#445)
#447osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#440)
#448Amit Kapila
amit.kapila16@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#447)
#449Greg Nancarrow
gregn4422@gmail.com
In reply to: Masahiko Sawada (#440)
#450osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Amit Kapila (#448)
#451Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#446)
#452Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#451)
#453Peter Eisentraut
peter_e@gmx.net
In reply to: Masahiko Sawada (#440)
#454David G. Johnston
david.g.johnston@gmail.com
In reply to: Amit Kapila (#451)
#455Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Eisentraut (#453)
#456Amit Kapila
amit.kapila16@gmail.com
In reply to: David G. Johnston (#454)
#457David G. Johnston
david.g.johnston@gmail.com
In reply to: Amit Kapila (#456)
#458Amit Kapila
amit.kapila16@gmail.com
In reply to: David G. Johnston (#457)
#459David G. Johnston
david.g.johnston@gmail.com
In reply to: Amit Kapila (#458)
#460David G. Johnston
david.g.johnston@gmail.com
In reply to: David G. Johnston (#459)
#461Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#452)
#462Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#451)
#463Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#461)
#464Amit Kapila
amit.kapila16@gmail.com
In reply to: David G. Johnston (#459)
#465David G. Johnston
david.g.johnston@gmail.com
In reply to: Amit Kapila (#464)
#466tanghy.fnst@fujitsu.com
tanghy.fnst@fujitsu.com
In reply to: Amit Kapila (#451)
#467Masahiko Sawada
sawada.mshk@gmail.com
In reply to: David G. Johnston (#465)
#468David G. Johnston
david.g.johnston@gmail.com
In reply to: Masahiko Sawada (#467)
#469Amit Kapila
amit.kapila16@gmail.com
In reply to: David G. Johnston (#468)
#470Masahiko Sawada
sawada.mshk@gmail.com
In reply to: David G. Johnston (#468)
#471Peter Eisentraut
peter_e@gmx.net
In reply to: Amit Kapila (#455)
#472Peter Eisentraut
peter_e@gmx.net
In reply to: Amit Kapila (#458)
#473David G. Johnston
david.g.johnston@gmail.com
In reply to: Amit Kapila (#469)
#474Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Eisentraut (#471)
#475Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Eisentraut (#472)
#476Peter Eisentraut
peter_e@gmx.net
In reply to: Amit Kapila (#474)
#477Peter Eisentraut
peter_e@gmx.net
In reply to: Amit Kapila (#475)
#478David G. Johnston
david.g.johnston@gmail.com
In reply to: Peter Eisentraut (#477)
#479Masahiko Sawada
sawada.mshk@gmail.com
In reply to: David G. Johnston (#478)
#480David G. Johnston
david.g.johnston@gmail.com
In reply to: Masahiko Sawada (#479)
#481Masahiko Sawada
sawada.mshk@gmail.com
In reply to: David G. Johnston (#480)
#482David G. Johnston
david.g.johnston@gmail.com
In reply to: Masahiko Sawada (#481)
#483Masahiko Sawada
sawada.mshk@gmail.com
In reply to: David G. Johnston (#482)
#484David G. Johnston
david.g.johnston@gmail.com
In reply to: Masahiko Sawada (#483)
#485Amit Kapila
amit.kapila16@gmail.com
In reply to: Peter Eisentraut (#476)
#486David G. Johnston
david.g.johnston@gmail.com
In reply to: David G. Johnston (#468)
#487Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#481)
#488Amit Kapila
amit.kapila16@gmail.com
In reply to: David G. Johnston (#486)
#489Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#487)
#490Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#489)
#491Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#490)
#492Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#491)
#493Masahiko Sawada
sawada.mshk@gmail.com
In reply to: David G. Johnston (#484)
#494Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#492)
#495David G. Johnston
david.g.johnston@gmail.com
In reply to: Amit Kapila (#494)
#496Masahiko Sawada
sawada.mshk@gmail.com
In reply to: David G. Johnston (#495)
#497Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#496)
#498Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#497)
#499Peter Eisentraut
peter_e@gmx.net
In reply to: Masahiko Sawada (#492)
#500Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Peter Eisentraut (#499)
#501Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#500)
#502Peter Eisentraut
peter_e@gmx.net
In reply to: Amit Kapila (#501)
#503Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Peter Eisentraut (#502)
#504Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#503)
#505osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#503)
#506Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#503)
#507Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#505)
#508Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#506)
#509osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#508)
#510shiy.fnst@fujitsu.com
shiy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#508)
#511osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#508)
#512Masahiko Sawada
sawada.mshk@gmail.com
In reply to: shiy.fnst@fujitsu.com (#510)
#513Masahiko Sawada
sawada.mshk@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#511)
#514Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#513)
#515osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#513)
#516Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#514)
#517Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#516)
#518Amit Kapila
amit.kapila16@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#515)
#519Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#517)
#520Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#517)
#521Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#514)
#522osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Amit Kapila (#518)
#523osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: osumi.takamichi@fujitsu.com (#522)
#524Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#517)
#525Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#520)
#526shiy.fnst@fujitsu.com
shiy.fnst@fujitsu.com
In reply to: Masahiko Sawada (#525)
#527Amit Kapila
amit.kapila16@gmail.com
In reply to: shiy.fnst@fujitsu.com (#526)
#528Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#525)
#529osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Amit Kapila (#528)
#530Amit Kapila
amit.kapila16@gmail.com
In reply to: osumi.takamichi@fujitsu.com (#529)
#531Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#530)
#532osumi.takamichi@fujitsu.com
osumi.takamichi@fujitsu.com
In reply to: Masahiko Sawada (#531)
#533Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#528)
#534Euler Taveira
euler@eulerto.com
In reply to: Amit Kapila (#528)
#535Amit Kapila
amit.kapila16@gmail.com
In reply to: Euler Taveira (#534)
#536Amit Kapila
amit.kapila16@gmail.com
In reply to: Euler Taveira (#534)
#537Euler Taveira
euler@eulerto.com
In reply to: Amit Kapila (#536)
#538Amit Kapila
amit.kapila16@gmail.com
In reply to: Euler Taveira (#537)
#539Noah Misch
noah@leadboat.com
In reply to: Amit Kapila (#538)
#540Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#539)
#541Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#540)
#542Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#541)
#543Amit Kapila
amit.kapila16@gmail.com
In reply to: Noah Misch (#542)
#544Noah Misch
noah@leadboat.com
In reply to: Amit Kapila (#543)
#545Amit Kapila
amit.kapila16@gmail.com
In reply to: Noah Misch (#544)
#546Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#545)
#547Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#546)
#548Amit Kapila
amit.kapila16@gmail.com
In reply to: Noah Misch (#547)
#549Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#548)
#550Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#549)
#551Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#550)
#552Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#551)
#553Amit Kapila
amit.kapila16@gmail.com
In reply to: Noah Misch (#552)
#554Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#553)
#555Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#554)
#556Noah Misch
noah@leadboat.com
In reply to: Amit Kapila (#553)
#557Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#556)
#558Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#557)
#559Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#558)
#560Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#559)
#561Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#560)
#562Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Masahiko Sawada (#561)
#563Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#562)
#564Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#563)
#565Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#564)
#566Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#565)
#567Amit Kapila
amit.kapila16@gmail.com
In reply to: Masahiko Sawada (#566)
#568Peter Eisentraut
peter_e@gmx.net
In reply to: Noah Misch (#547)
#569Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#567)
#570Amit Kapila
amit.kapila16@gmail.com
In reply to: Amit Kapila (#569)
#571Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Amit Kapila (#570)
#572Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#571)
#573Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#572)
#574Noah Misch
noah@leadboat.com
In reply to: Masahiko Sawada (#573)
#575Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Noah Misch (#574)
#576Robert Haas
robertmhaas@gmail.com
In reply to: Noah Misch (#574)
#577Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#576)
#578Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#577)
#579Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Robert Haas (#578)
#580Robert Haas
robertmhaas@gmail.com
In reply to: Masahiko Sawada (#579)
#581Peter Eisentraut
peter_e@gmx.net
In reply to: Robert Haas (#580)
#582Robert Haas
robertmhaas@gmail.com
In reply to: Peter Eisentraut (#581)
#583Noah Misch
noah@leadboat.com
In reply to: Robert Haas (#582)
#584Robert Haas
robertmhaas@gmail.com
In reply to: Noah Misch (#583)
#585Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#584)
#586Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#585)
#587Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#586)
#588Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#587)
#589Noah Misch
noah@leadboat.com
In reply to: Tom Lane (#585)
#590Robert Haas
robertmhaas@gmail.com
In reply to: Noah Misch (#589)