Proposal: Implement failover on libpq connect level.

Started by Victor Wagnerover 10 years ago243 messages
Jump to latest
#1Victor Wagner
vitus@wagner.pp.ru

Rationale
=========

Since introduction of the WAL-based replication into the PostgreSQL, it is
possible to create high-availability and load-balancing clusters.

However, there is no support for failover in the client libraries. So, only
way to provide transparent for client application failover is IP address
migration. This approach has some limitation, i.e. it requires that
master and backup servers reside in the same subnet or may not be
feasible for other reasons.

Commercial RDBMS, such as Oracle, employ more flexible approach. They
allow to specify multiple servers in the connect string, so if primary
server is not available, client library tries to connect to other ones.

This approach allows to use geographically distributed failover clusters
and also is a cheap way to implement load-balancing (which is not
possible with IP address migration).

Proposed change
===============

Allow to specify multiple hosts in the libpq connect string. Make libpq
attempt to connect to all host simultaneously or in random order
and use of the server which successfully establishes connection first.

Syntax
------

Libpq connect string can be either set of the keyword=value pairs
or an URL.

In the first form it can be just allowed to specify keyword host
multiple times.

"host=main-server host=standby1 host=standby2 port=5432 dbname=database"

In the second form host can be specified either in the first part of URL
or in the query parameters.

postgresql://user@host/database

postgresql:///database?host=hostname&user=username

If host is specified as a parameter, it is also possible to allow
multiple host parameters without breaking existing syntax.

postgresql:///database?host=main-server&host=standby1&host=standby2

In order to implement load-balancing clusters, additional parameters
should be added readonly=boolean and loadbalancing=boolean

Support for this syntax extensions is added to the PQconnectdb,
PQconnectdbParams, PQConnectStart and PQConnectStartParams,
but not PQsetdb/PQsetdblogin functions.

Behavoir
--------

If PQconnectdb encounters connect string with multiple hosts specified,
it attempts to establish connection with all these hosts simultaneously,
and begins to work with server which responds first, unless
loadbalancing parameter is true.

If the loadbalancing parameter is true, it tries servers sequentially in
the random order.

If the parameter readonly is false, after authenticating with server it
executes show transaction_read_only, to find out whether current
connection is to the master or to the hot standby, and connection is
considered successful only if server allows read write transactions.

This allows to have clients which write to the database and clients
which perform read-only access. Read-only clients would be load-balanced
between the master and slave servers, and read-write clients connect only to
the master (whichever server has this role at the moment of connection).

Information of the alternate servers should be stored in the PGconn structure.

Function PQreset should be able to take advantage of new syntax and
possibly open connection to the new master, if failover occurred
during lifetime of the connection.

Possible drawbacks
==================

Compatibility
-------------

Proposed patch requires no modifications to the server or protocol, and
modification of synchronous function (PQconnectdb, PQconnectdbParams)
doesn't introduce incompatible changes to the client library.

Even if connect string with multiple host would be erroneously used
with version of libpq, which do not support this feature, it is not an
error. It just use last host specified in the connect string.

There could be some compatibility problems with asynchronous connections
created with PQConnectStart functions. Problem is that we are trying
to establish several connections at once, and there are several sockets
which should be integrated into application event loop.

Even if we would try servers in some particular order (such as randomized
order during load balancing), file descriptor of socket can change during
execution PQConnectPoll, and existing applications are not prepared to it.

Performance impact
------------------

Performance impact seems to be negligible.

1. If connect string contain only one host, the only complication is the
maintenance of the data structure, which possible can hold more than
one host name. Connection process itself would not be affected.

2. If there is pure high-availability cluster, i.e. standby servers do
not accept client connections on the specified port, there is no extra
load on standby servers, and almost no (only several unsuccessful
connect calls) on client.

3. If there is load balancing cluster, there is no performance impacts
for read-only client, but each read-write client causes standby servers
to process extra connection to the point where server can report
read-only state of transaction (i.e. including SSL handshake and
postgresql authentication). Typically, in the situation where read-only
clients should be load-balanced using this feature, there are much more
read-only clients, than read-write ones. So some extra load related with
read-write connection seems to be justified by simplification of client
configuration.

--
Victor Wagner <vitus@wagner.pp.ru>

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#2Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Victor Wagner (#1)
Re: Proposal: Implement failover on libpq connect level.

Victor Wagner wrote:

Rationale
=========

Since introduction of the WAL-based replication into the PostgreSQL, it is
possible to create high-availability and load-balancing clusters.

However, there is no support for failover in the client libraries. So, only
way to provide transparent for client application failover is IP address
migration. This approach has some limitation, i.e. it requires that
master and backup servers reside in the same subnet or may not be
feasible for other reasons.

Commercial RDBMS, such as Oracle, employ more flexible approach. They
allow to specify multiple servers in the connect string, so if primary
server is not available, client library tries to connect to other ones.

This approach allows to use geographically distributed failover clusters
and also is a cheap way to implement load-balancing (which is not
possible with IP address migration).

I wonder how useful this is at the present time.

If the primary goes down and the client gets connected to the standby,
it would have read-only access there. Most applications wouldn't cope
well with that.

Once we have multi-master replication that can be used for fail-over,
the picture will change. Then a feature like that would be very useful indeed.

"host=main-server host=standby1 host=standby2 port=5432 dbname=database"

It seems a bit arbitrary to require that all servers use the same port.

Maybe parameters like host2, port2, host3, port3 etc. might be better.

Yours,
Laurenz Albe

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Hans-Jürgen Schönig
postgres@cybertec.at
In reply to: Laurenz Albe (#2)
Re: Proposal: Implement failover on libpq connect level.

On 18 Aug 2015, at 10:32, Albe Laurenz <laurenz.albe@wien.gv.at> wrote:

Victor Wagner wrote:

Rationale
=========

Since introduction of the WAL-based replication into the PostgreSQL, it is
possible to create high-availability and load-balancing clusters.

However, there is no support for failover in the client libraries. So, only
way to provide transparent for client application failover is IP address
migration. This approach has some limitation, i.e. it requires that
master and backup servers reside in the same subnet or may not be
feasible for other reasons.

Commercial RDBMS, such as Oracle, employ more flexible approach. They
allow to specify multiple servers in the connect string, so if primary
server is not available, client library tries to connect to other ones.

This approach allows to use geographically distributed failover clusters
and also is a cheap way to implement load-balancing (which is not
possible with IP address migration).

I wonder how useful this is at the present time.

If the primary goes down and the client gets connected to the standby,
it would have read-only access there. Most applications wouldn't cope
well with that.

Once we have multi-master replication that can be used for fail-over,
the picture will change. Then a feature like that would be very useful indeed.

"host=main-server host=standby1 host=standby2 port=5432 dbname=database"

It seems a bit arbitrary to require that all servers use the same port.

Maybe parameters like host2, port2, host3, port3 etc. might be better.

Yours,
Laurenz Albe

i totally agree with laurenz.
in addition to that you have the “problem” of transactions. if you failover in the middle
of a transaction, strange things might happen from the application point of view.

the good thing, however, is that stupid middleware is sometimes not able to handle
failed connections. however, overall i think it is more of a danger than a benefit.

regards,

hans

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Hans-Jürgen Schönig (#3)
Re: Proposal: Implement failover on libpq connect level.

Hans-Jürgen Schönig wrote:

in addition to that you have the “problem” of transactions. if you failover in the middle
of a transaction, strange things might happen from the application point of view.

the good thing, however, is that stupid middleware is sometimes not able to handle
failed connections. however, overall i think it is more of a danger than a benefit.

Maybe I misunderstood the original proposal, but my impression was that the alternative
servers would be tried only at the time the connection is established, and there would be no
such problems as you describe.

Those could only happen if libpq automatically tried to reconnect upon failure without
the client noticing.

So the stupid middleware would get an error message, but the reconnect would actually work.

Yours,
Laurenz Albe

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Hans-Jürgen Schönig
postgres@cybertec.at
In reply to: Laurenz Albe (#4)
Re: Proposal: Implement failover on libpq connect level.

On 18 Aug 2015, at 11:19, Albe Laurenz <laurenz.albe@wien.gv.at> wrote:

Hans-Jürgen Schönig wrote:

in addition to that you have the “problem” of transactions. if you failover in the middle
of a transaction, strange things might happen from the application point of view.

the good thing, however, is that stupid middleware is sometimes not able to handle
failed connections. however, overall i think it is more of a danger than a benefit.

Maybe I misunderstood the original proposal, but my impression was that the alternative
servers would be tried only at the time the connection is established, and there would be no
such problems as you describe.

it would still leave the problem of having a read only on the other side unless you are using BDR or so.

regards,

hans

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Robert Haas
robertmhaas@gmail.com
In reply to: Hans-Jürgen Schönig (#5)
Re: Proposal: Implement failover on libpq connect level.

On Tue, Aug 18, 2015 at 6:07 AM, PostgreSQL - Hans-Jürgen Schönig
<postgres@cybertec.at> wrote:

On 18 Aug 2015, at 11:19, Albe Laurenz <laurenz.albe@wien.gv.at> wrote:

Hans-Jürgen Schönig wrote:

in addition to that you have the “problem” of transactions. if you failover in the middle
of a transaction, strange things might happen from the application point of view.

the good thing, however, is that stupid middleware is sometimes not able to handle
failed connections. however, overall i think it is more of a danger than a benefit.

Maybe I misunderstood the original proposal, but my impression was that the alternative
servers would be tried only at the time the connection is established, and there would be no
such problems as you describe.

it would still leave the problem of having a read only on the other side unless you are using BDR or so.

That doesn't make this a bad idea. Some people are using replication
solutions that can cope with this already (EDB has a proprietary
product, and I'm sure there are people using BDR, too) and, as the
solutions get better and more widely deployed, more people will want
to do it.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Victor Wagner (#1)
Re: Proposal: Implement failover on libpq connect level.

On 17 August 2015 at 23:18, Victor Wagner <vitus@wagner.pp.ru> wrote:

Rationale
=========

Since introduction of the WAL-based replication into the PostgreSQL, it is
possible to create high-availability and load-balancing clusters.

However, there is no support for failover in the client libraries. So, only
way to provide transparent for client application failover is IP address
migration. This approach has some limitation, i.e. it requires that
master and backup servers reside in the same subnet or may not be
feasible for other reasons.

This is not completely true, you can always use something like
pgbouncer or other middleware to change the server to which clients
connect. you still need to solve the fact that you will have a
read-only server at the other side.

something like repmgr + pgbouncer will work fine.

i agree that once/if we ever have multimaster included then this could
be a good idea

--
Jaime Casanova www.2ndQuadrant.com
Professional PostgreSQL: Soporte 24x7 y capacitación

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Robert Haas
robertmhaas@gmail.com
In reply to: Jaime Casanova (#7)
Re: Proposal: Implement failover on libpq connect level.

On Tue, Aug 18, 2015 at 12:53 PM, Jaime Casanova
<jaime.casanova@2ndquadrant.com> wrote:

This is not completely true, you can always use something like
pgbouncer or other middleware to change the server to which clients
connect. you still need to solve the fact that you will have a
read-only server at the other side.

something like repmgr + pgbouncer will work fine.

Sure, but pgbouncer is an extra hop, and has its own foibles. There's
real appeal to doing this in the client.

i agree that once/if we ever have multimaster included then this could
be a good idea

I think it has a lot of appeal *now*.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9Amit Kapila
amit.kapila16@gmail.com
In reply to: Victor Wagner (#1)
Re: Proposal: Implement failover on libpq connect level.

On Tue, Aug 18, 2015 at 9:48 AM, Victor Wagner <vitus@wagner.pp.ru> wrote:

Behavoir
--------

If PQconnectdb encounters connect string with multiple hosts specified,
it attempts to establish connection with all these hosts simultaneously,
and begins to work with server which responds first, unless
loadbalancing parameter is true.

I think here you are mixing the behaviour for load balancing solution and
failover solution. It seems to me that for client-side failover solution
(which is also known as Transparent Application Failover), the connection
attempt to second server should be done after the first connection is
broken as that provide more flexibility.

If the loadbalancing parameter is true, it tries servers sequentially in
the random order.

If the parameter readonly is false, after authenticating with server it
executes show transaction_read_only, to find out whether current
connection is to the master or to the hot standby, and connection is
considered successful only if server allows read write transactions.

Although both ideas (load balancing and failover) seems worth discussing,
they are separate features and can be worked on separately. It will be
easier to sort out the details as well that way.

With Regards,
Amit Kapila.
EnterpriseDB: http://www.enterprisedb.com

#10Tatsuo Ishii
ishii@postgresql.org
In reply to: Victor Wagner (#1)
Re: Proposal: Implement failover on libpq connect level.

I wonder how extended protocol is handled by this proposal. Suppose
load balacing mode is enabled. PQprepare is executed on standby1. Then
PQexecPrepared gets called. This may be executed on standby2, which
will fail because there's no prepared statement created by the former
PQprepare call.

Even simple procotol is used, same thing can be said to SQL
PREPARE/EXECUTE/DEALLOCATE.

SQL BEGIN/COMMIT/ROLLBACK would be more interesting example in load
balancing mode.

Best regards,
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese:http://www.sraoss.co.jp

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Victor Wagner
vitus@wagner.pp.ru
In reply to: Laurenz Albe (#2)
Re: Proposal: Implement failover on libpq connect level.

On 2015.08.18 at 08:32:28 +0000, Albe Laurenz wrote:

I wonder how useful this is at the present time.

If the primary goes down and the client gets connected to the standby,
it would have read-only access there. Most applications wouldn't cope
well with that.

It is supposed that somebody (either system administrator or some
cluster management software) have noticed failure of master and promoted
one of the standbys to master.

So, clients have only to find out which cluster node serves as master
just now.

Idea is that we don't need any extra administration actions such as IP
migration to do it. Clients have list of alternate servers and discover
which one to work with by trial and error.

I consider in my proposal following situations:

1. Warm standby - doesn't accept client connection at all unless
promoted to master.

2. Hot standby - we have two types of clients - one for which readonly
access is sufficient, and other that need to connect only to master.
In this case intention to write is explicitely stated in the connect
string (readonly=false) and connect procedure would check if node it
tries to connect allowed write.

It seems that most people discussing in this thread think in millisecond
time intervals (failure and immediate reconnect).

I was thinking about much longer time intervals - it would probaly take
seconds to cluster management software to notice server failure and
promote backup server to master, it might be possible for application to
spend minute or so trying to reconnect, but it would take
hours to change connect string on clients - it would require visit of
support enginer to each client terminal, if we are thinking of
distributed OLTP system such as point-of-sale network with thick
clients.

"host=main-server host=standby1 host=standby2 port=5432 dbname=database"

It seems a bit arbitrary to require that all servers use the same port.

Maybe parameters like host2, port2, host3, port3 etc. might be better.

I've thought about this approach. But PostgreSQL administration guide
insists that all servers in the cluster should have as identical
configuration as possible to simplify administration.

Moreover I've seldom have seen configurations where postgresql is
accepting connection on non-default port.

Using host1, host2 etc would have unintended connotations, such is "this
is first, main server". I think that client should treat all given
servers as equal and let cluster administration to choose which one
would accept connection.

--
Victor Wagner <vitus@wagner.pp.ru>

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Amit Kapila
amit.kapila16@gmail.com
In reply to: Victor Wagner (#11)
Re: Proposal: Implement failover on libpq connect level.

On Wed, Aug 19, 2015 at 12:21 PM, Victor Wagner *EXTERN* <vitus@wagner.pp.ru>
wrote:

On 2015.08.18 at 08:32:28 +0000, Albe Laurenz wrote:

I wonder how useful this is at the present time.

If the primary goes down and the client gets connected to the standby,
it would have read-only access there. Most applications wouldn't cope
well with that.

It is supposed that somebody (either system administrator or some
cluster management software) have noticed failure of master and promoted
one of the standbys to master.

So, clients have only to find out which cluster node serves as master
just now.

Idea is that we don't need any extra administration actions such as IP
migration to do it. Clients have list of alternate servers and discover
which one to work with by trial and error.

I consider in my proposal following situations:

1. Warm standby - doesn't accept client connection at all unless
promoted to master.

2. Hot standby - we have two types of clients - one for which readonly
access is sufficient, and other that need to connect only to master.
In this case intention to write is explicitely stated in the connect
string (readonly=false) and connect procedure would check if node it
tries to connect allowed write.

It seems that most people discussing in this thread think in millisecond
time intervals (failure and immediate reconnect).

Why not have this as a separate parameter (*_timeout or something like
that)?

With Regards,
Amit Kapila.
EnterpriseDB: http://www.enterprisedb.com

#13Victor Wagner
vitus@wagner.pp.ru
In reply to: Amit Kapila (#9)
Re: Proposal: Implement failover on libpq connect level.

On 2015.08.19 at 08:28:32 +0530, Amit Kapila wrote:

On Tue, Aug 18, 2015 at 9:48 AM, Victor Wagner <vitus@wagner.pp.ru> wrote:

Behavoir
--------

If PQconnectdb encounters connect string with multiple hosts specified,
it attempts to establish connection with all these hosts simultaneously,
and begins to work with server which responds first, unless
loadbalancing parameter is true.

I think here you are mixing the behaviour for load balancing solution and
failover solution. It seems to me that for client-side failover solution
(which is also known as Transparent Application Failover), the connection
attempt to second server should be done after the first connection is
broken as that provide more flexibility.

I think that failover procedure should begin before first connection is
ever established.

When client application starts, it has no way of knowing current state
of the server cluster - which of servers is working as master now.

Application uses connect string, placed into its configuration file
long time ago, and changing this configuration might require special
permissions, user of application doesn't have. But user typically know
how to restart application or reboot his terminal. So, for the
spatially distributed networks with thick clients we can handle only
initial connections, not connection resets. At least application author
always can implement restoration of connection as closing old
connection and establishing new.

So, when application first establishes connection it have to be prepared
to connect any of alternate hosts.

I don't think that making connections in sequential order provide big
flexibility. But it can greatly increase startup time, because connect
to host which is physically down fails after significant timeout. While
application waits for first connect to fail, it might complete session
initialization with working server several times.

Of course, connecting to servers in sequential order is simpler to
implement, and allows even more mixing of load balancing with failover,
because code would be same.

Although both ideas (load balancing and failover) seems worth discussing,
they are separate features and can be worked on separately. It will be
easier to sort out the details as well that way.

Really load balancing comes almost for free if we implement connect to
alternate server for failover purposes. I'm not sure that in case of hot
standby, where only readonly transactions can be loadbalanced,
loadbalancing is very useful. And included it in the proposal only
because it is very cheap to implement in this form,

With Regards,
Amit Kapila.
EnterpriseDB: http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#14Victor Wagner
vitus@wagner.pp.ru
In reply to: Tatsuo Ishii (#10)
Re: Proposal: Implement failover on libpq connect level.

On 2015.08.19 at 12:42:45 +0900, Tatsuo Ishii wrote:

I wonder how extended protocol is handled by this proposal. Suppose
load balacing mode is enabled. PQprepare is executed on standby1. Then
PQexecPrepared gets called. This may be executed on standby2, which
will fail because there's no prepared statement created by the former
PQprepare call.

Here we are discussing load-balancing on the client level, not on the
statement level.

Suppose that we have 100 readonly clients and 3 standby servers + master.
If all clients specify all four servers in the their connect strings,
and connect randomly to them, each server would have approximately 25
clients.

But once connection is established, each client works with one
server (at least until communication failure occurs and it would call
PQreset. In this case it has to reprepare statements anyway).

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#15Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Victor Wagner (#11)
Re: Proposal: Implement failover on libpq connect level.

Victor Wagner wrote:

I wonder how useful this is at the present time.

If the primary goes down and the client gets connected to the standby,
it would have read-only access there. Most applications wouldn't cope
well with that.

It is supposed that somebody (either system administrator or some
cluster management software) have noticed failure of master and promoted
one of the standbys to master.

So, clients have only to find out which cluster node serves as master
just now.

Idea is that we don't need any extra administration actions such as IP
migration to do it. Clients have list of alternate servers and discover
which one to work with by trial and error.

Yes, but that will only work reliably if the (read-only) standby does not
allow connections before it is promoted.

I consider in my proposal following situations:

1. Warm standby - doesn't accept client connection at all unless
promoted to master.

2. Hot standby - we have two types of clients - one for which readonly
access is sufficient, and other that need to connect only to master.
In this case intention to write is explicitely stated in the connect
string (readonly=false) and connect procedure would check if node it
tries to connect allowed write.

I think that these are both valid use cases.

And as Robert said, there are people out using BDR or other proprietary
multi-master solutions, so there might well be an audience for this feature.

"host=main-server host=standby1 host=standby2 port=5432 dbname=database"

It seems a bit arbitrary to require that all servers use the same port.
Maybe parameters like host2, port2, host3, port3 etc. might be better.

I've thought about this approach. But PostgreSQL administration guide
insists that all servers in the cluster should have as identical
configuration as possible to simplify administration.

Moreover I've seldom have seen configurations where postgresql is
accepting connection on non-default port.

We do it all the time.

Using host1, host2 etc would have unintended connotations, such is "this
is first, main server". I think that client should treat all given
servers as equal and let cluster administration to choose which one
would accept connection.

I don't think that my idea of "host", "host3" is very appealing myself,
but I still don't like your original proposal of having multiple "host"
parameters.

One problem with that is that this syntax is already allowed, but
your proposal would silently change the semantics.
Today, if you have multiple "host" parameters, the last one wins.
So with your modification in place, some connect strings that work today
would start behaving in unexpected ways.

Maybe a better idea would be:
host=db1.myorg.com,db2.myorg.com port=5432,2345

Yours,
Laurenz Albe

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#16Victor Wagner
vitus@wagner.pp.ru
In reply to: Amit Kapila (#12)
Re: Proposal: Implement failover on libpq connect level.

On 2015.08.19 at 12:29:51 +0530, Amit Kapila wrote:

It seems that most people discussing in this thread think in millisecond
time intervals (failure and immediate reconnect).

Why not have this as a separate parameter (*_timeout or something like
that)?

Because it is not in the software configuration. It is in the people
heads. Or may be in the organizational configuration of the environments
we are talking about.

Each of us imagining some use-case for discussed feature. And these
cases are completely different, and have different typical time
interval.

I haven't explicitely stated my use cases in the proposal. So people
thinking in terms of their use cases, and this is very significant
feedback for me.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#17Amit Kapila
amit.kapila16@gmail.com
In reply to: Victor Wagner (#13)
Re: Proposal: Implement failover on libpq connect level.

On Wed, Aug 19, 2015 at 12:35 PM, Victor Wagner <vitus@wagner.pp.ru> wrote:

On 2015.08.19 at 08:28:32 +0530, Amit Kapila wrote:

On Tue, Aug 18, 2015 at 9:48 AM, Victor Wagner <vitus@wagner.pp.ru>

wrote:

Behavoir
--------

If PQconnectdb encounters connect string with multiple hosts specified,
it attempts to establish connection with all these hosts

simultaneously,

and begins to work with server which responds first, unless
loadbalancing parameter is true.

I think here you are mixing the behaviour for load balancing solution and
failover solution. It seems to me that for client-side failover solution
(which is also known as Transparent Application Failover), the connection
attempt to second server should be done after the first connection is
broken as that provide more flexibility.

I think that failover procedure should begin before first connection is
ever established.

As far as I understand, failover gets initiated once the master server goes
down or is not accessible due to some reason, so for such cases if you
have the connection to both the servers then it might not work.

With Regards,
Amit Kapila.
EnterpriseDB: http://www.enterprisedb.com

#18Victor Wagner
vitus@wagner.pp.ru
In reply to: Laurenz Albe (#15)
Re: Proposal: Implement failover on libpq connect level.

On 2015.08.19 at 07:15:30 +0000, Albe Laurenz wrote:

Idea is that we don't need any extra administration actions such as IP
migration to do it. Clients have list of alternate servers and discover
which one to work with by trial and error.

Yes, but that will only work reliably if the (read-only) standby does not
allow connections before it is promoted.

It would just take a bit more time for client and a bit more load for
server - to make sure that this connection is read-write by
issuing

show transaction_read_only

statement before considering connection useful.

And as Robert said, there are people out using BDR or other proprietary
multi-master solutions, so there might well be an audience for this feature.

Unfortunately I have no experience with such solutions, so I'd greatly
appreciate feedback from those people.

I've modelled my proposal after another proprietary solution - Oracle
RAC.

One problem with that is that this syntax is already allowed, but
your proposal would silently change the semantics.
Today, if you have multiple "host" parameters, the last one wins.
So with your modification in place, some connect strings that work today
would start behaving in unexpected ways.

This is serious argument. But what the use case of these connect strings
now?

It seems to me that in most cases last host in the connect string would
be only host which accepts connections, so it wins anyway

Maybe a better idea would be:
host=db1.myorg.com,db2.myorg.com port=5432,2345

I've tried not to introduce new delimiters. But this syntax definitely
have some advantages. At least it allows to specify host-port pairs as
two parallel lists.

Other idea - allow to specify host-port pair as argument of host
parameter.

host=db1.myorg.com:5432

It is consistent with URL syntax and system administrators are used to
it. And with long list of hosts there is less chances to made an error
as host and corresponding port come together.

But your variant allows to handle hostaddr parameter same way as host
and port.
--
Victor Wagner <vitus@wagner.pp.ru>

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#19Victor Wagner
vitus@wagner.pp.ru
In reply to: Amit Kapila (#17)
Re: Proposal: Implement failover on libpq connect level.

On 2015.08.19 at 12:55:15 +0530, Amit Kapila wrote:

I think that failover procedure should begin before first connection is
ever established.

As far as I understand, failover gets initiated once the master server goes
down or is not accessible due to some reason, so for such cases if you
have the connection to both the servers then it might not work.

Master server might go down when client is not started yet.
And when client starts up, it has to find out which server to connect
now.

Consider point-of-sale terminals, bank offices or anything else, which
do not work round the clock. Clerk comes to his workplace in the
morning, switches on terminal and inserts her smartcard to authorize
with server. She doesn't need to know what server name is and where it
is located. Either application finds the server automatically, or
support engineer has to be called to fix things.

Moreover, in some situations restart of application (or even client
terminal) is acceptable price for failover, as long as there is no need
to manually fix the configuration.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Victor Wagner (#18)
Re: Proposal: Implement failover on libpq connect level.

Victor Wagner wrote:

Idea is that we don't need any extra administration actions such as IP
migration to do it. Clients have list of alternate servers and discover
which one to work with by trial and error.

Yes, but that will only work reliably if the (read-only) standby does not
allow connections before it is promoted.

It would just take a bit more time for client and a bit more load for
server - to make sure that this connection is read-write by
issuing

show transaction_read_only

statement before considering connection useful.

That's not very comfortable, and a lot of middleware software won't easily
learn the trick.

But even without that use case I think that the feature is probably
worth the effort.

[about having multiple "host" parameters in the connection string]

One problem with that is that this syntax is already allowed, but
your proposal would silently change the semantics.
Today, if you have multiple "host" parameters, the last one wins.
So with your modification in place, some connect strings that work today
would start behaving in unexpected ways.

This is serious argument. But what the use case of these connect strings
now?

It seems to me that in most cases last host in the connect string would
be only host which accepts connections, so it wins anyway

I'm not saying that it is particularly wide-spread and useful; it could
happen through careless editing of connection strings or by using a
connection service file entry
(http://www.postgresql.org/docs/current/static/libpq-pgservice.html)
and overriding the host parameter on the command line.

Maybe a better idea would be:
host=db1.myorg.com,db2.myorg.com port=5432,2345

I've tried not to introduce new delimiters. But this syntax definitely
have some advantages. At least it allows to specify host-port pairs as
two parallel lists.

Other idea - allow to specify host-port pair as argument of host
parameter.

host=db1.myorg.com:5432

It is consistent with URL syntax and system administrators are used to
it. And with long list of hosts there is less chances to made an error
as host and corresponding port come together.

I don't think that is very attactive as it confuses the distinction between
"host" and "port". What would you do with

host=db1.myorg.com:2345 port=1234

Yours,
Laurenz Albe

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#21Victor Wagner
vitus@wagner.pp.ru
In reply to: Laurenz Albe (#20)
#22Tom Lane
tgl@sss.pgh.pa.us
In reply to: Laurenz Albe (#20)
#23Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#22)
#24Oleg Bartunov
oleg@sai.msu.su
In reply to: Andres Freund (#23)
#25Simon Riggs
simon@2ndQuadrant.com
In reply to: Andres Freund (#23)
#26Victor Wagner
vitus@wagner.pp.ru
In reply to: Simon Riggs (#25)
#27Tatsuo Ishii
ishii@postgresql.org
In reply to: Victor Wagner (#14)
#28Shulgin, Oleksandr
oleksandr.shulgin@zalando.de
In reply to: Victor Wagner (#26)
#29David Fetter
david@fetter.org
In reply to: Laurenz Albe (#15)
#30Victor Wagner
vitus@wagner.pp.ru
In reply to: Tatsuo Ishii (#27)
#31Tom Lane
tgl@sss.pgh.pa.us
In reply to: Victor Wagner (#30)
#32Amit Kapila
amit.kapila16@gmail.com
In reply to: Victor Wagner (#19)
#33Teodor Sigaev
teodor@sigaev.ru
In reply to: Simon Riggs (#25)
#34Shulgin, Oleksandr
oleksandr.shulgin@zalando.de
In reply to: Teodor Sigaev (#33)
#35Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#22)
#36Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#35)
#37Robert Haas
robertmhaas@gmail.com
In reply to: Amit Kapila (#32)
#38Magnus Hagander
magnus@hagander.net
In reply to: Alvaro Herrera (#36)
#39Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#36)
#40Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#39)
#41Shulgin, Oleksandr
oleksandr.shulgin@zalando.de
In reply to: Andres Freund (#40)
#42Chris Browne
cbbrowne@acm.org
In reply to: Shulgin, Oleksandr (#41)
#43Robert Haas
robertmhaas@gmail.com
In reply to: Shulgin, Oleksandr (#41)
#44Shulgin, Oleksandr
oleksandr.shulgin@zalando.de
In reply to: Robert Haas (#43)
#45Robert Haas
robertmhaas@gmail.com
In reply to: Shulgin, Oleksandr (#44)
#46Dave Page
dpage@pgadmin.org
In reply to: Robert Haas (#45)
#47Stephen Frost
sfrost@snowman.net
In reply to: Robert Haas (#45)
#48Robert Haas
robertmhaas@gmail.com
In reply to: Stephen Frost (#47)
#49Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#48)
#50Shulgin, Oleksandr
oleksandr.shulgin@zalando.de
In reply to: Robert Haas (#48)
#51Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Shulgin, Oleksandr (#50)
#52Stephen Frost
sfrost@snowman.net
In reply to: Robert Haas (#48)
#53Chris Browne
cbbrowne@acm.org
In reply to: Shulgin, Oleksandr (#50)
#54Stephen Frost
sfrost@snowman.net
In reply to: Alvaro Herrera (#51)
#55Robert Haas
robertmhaas@gmail.com
In reply to: Shulgin, Oleksandr (#50)
#56Shulgin, Oleksandr
oleksandr.shulgin@zalando.de
In reply to: Robert Haas (#55)
#57Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#45)
#58Victor Wagner
vitus@wagner.pp.ru
In reply to: Victor Wagner (#1)
#59Daniel Verite
daniel@manitou-mail.org
In reply to: Victor Wagner (#18)
#60Victor Wagner
vitus@wagner.pp.ru
In reply to: Daniel Verite (#59)
#61Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Bruce Momjian (#57)
#62Robert Haas
robertmhaas@gmail.com
In reply to: Kevin Grittner (#61)
#63Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Robert Haas (#62)
#64Robert Haas
robertmhaas@gmail.com
In reply to: Kevin Grittner (#63)
#65Victor Wagner
vitus@wagner.pp.ru
In reply to: Victor Wagner (#1)
#66Shulgin, Oleksandr
oleksandr.shulgin@zalando.de
In reply to: Victor Wagner (#65)
#67Victor Wagner
vitus@wagner.pp.ru
In reply to: Shulgin, Oleksandr (#66)
#68Craig Ringer
craig@2ndquadrant.com
In reply to: Victor Wagner (#65)
#69Victor Wagner
vitus@wagner.pp.ru
In reply to: Craig Ringer (#68)
#70Victor Wagner
vitus@wagner.pp.ru
In reply to: Victor Wagner (#65)
#71Thom Brown
thom@linux.com
In reply to: Victor Wagner (#70)
#72Victor Wagner
vitus@wagner.pp.ru
In reply to: Thom Brown (#71)
#73korry.douglas
korry.douglas@enterprisedb.com
In reply to: Victor Wagner (#70)
#74Thom Brown
thom@linux.com
In reply to: Victor Wagner (#72)
#75Victor Wagner
vitus@wagner.pp.ru
In reply to: Thom Brown (#74)
#76Victor Wagner
vitus@wagner.pp.ru
In reply to: korry.douglas (#73)
#77Robert Haas
robertmhaas@gmail.com
In reply to: korry.douglas (#73)
#78Victor Wagner
vitus@wagner.pp.ru
In reply to: Victor Wagner (#65)
#79Robert Haas
robertmhaas@gmail.com
In reply to: Victor Wagner (#78)
#80Thom Brown
thom@linux.com
In reply to: Victor Wagner (#75)
#81Peter Eisentraut
peter_e@gmx.net
In reply to: Victor Wagner (#65)
#82Peter Eisentraut
peter_e@gmx.net
In reply to: Robert Haas (#77)
#83Chris Browne
cbbrowne@acm.org
In reply to: Peter Eisentraut (#81)
#84Shulgin, Oleksandr
oleksandr.shulgin@zalando.de
In reply to: Chris Browne (#83)
#85Josh Berkus
josh@agliodbs.com
In reply to: Victor Wagner (#1)
#86Victor Wagner
vitus@wagner.pp.ru
In reply to: Peter Eisentraut (#81)
#87Peter Eisentraut
peter_e@gmx.net
In reply to: Victor Wagner (#86)
#88Robert Haas
robertmhaas@gmail.com
In reply to: Peter Eisentraut (#87)
#89Victor Wagner
vitus@wagner.pp.ru
In reply to: Robert Haas (#88)
#90Chris Browne
cbbrowne@acm.org
In reply to: Robert Haas (#88)
#91David Fetter
david@fetter.org
In reply to: Chris Browne (#90)
#92Josh Berkus
josh@agliodbs.com
In reply to: Victor Wagner (#1)
#93Peter Eisentraut
peter_e@gmx.net
In reply to: Robert Haas (#88)
#94Robert Haas
robertmhaas@gmail.com
In reply to: Peter Eisentraut (#93)
#95Victor Wagner
vitus@wagner.pp.ru
In reply to: Peter Eisentraut (#93)
#96Robert Haas
robertmhaas@gmail.com
In reply to: Victor Wagner (#95)
#97Craig Ringer
craig@2ndquadrant.com
In reply to: Robert Haas (#96)
#98Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Craig Ringer (#97)
#99Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#98)
#100Craig Ringer
craig@2ndquadrant.com
In reply to: Robert Haas (#99)
#101Victor Wagner
vitus@wagner.pp.ru
In reply to: Craig Ringer (#100)
#102Thom Brown
thom@linux.com
In reply to: Victor Wagner (#78)
#103Peter Eisentraut
peter_e@gmx.net
In reply to: Robert Haas (#99)
#104Peter Eisentraut
peter_e@gmx.net
In reply to: Victor Wagner (#95)
#105Victor Wagner
vitus@wagner.pp.ru
In reply to: Thom Brown (#102)
#106Robert Haas
robertmhaas@gmail.com
In reply to: Peter Eisentraut (#103)
#107korry.douglas
korry.douglas@enterprisedb.com
In reply to: Victor Wagner (#101)
#108korry.douglas
korry.douglas@enterprisedb.com
In reply to: korry.douglas (#107)
#109Victor Wagner
vitus@wagner.pp.ru
In reply to: korry.douglas (#107)
#110Teodor Sigaev
teodor@sigaev.ru
In reply to: Victor Wagner (#109)
#111Victor Wagner
vitus@wagner.pp.ru
In reply to: Teodor Sigaev (#110)
#112Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Victor Wagner (#111)
#113Michael Paquier
michael@paquier.xyz
In reply to: Victor Wagner (#111)
#114Thom Brown
thom@linux.com
In reply to: Victor Wagner (#111)
#115Victor Wagner
vitus@wagner.pp.ru
In reply to: Thom Brown (#114)
#116Victor Wagner
vitus@wagner.pp.ru
In reply to: Thom Brown (#114)
#117Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Victor Wagner (#116)
#118Thom Brown
thom@linux.com
In reply to: Victor Wagner (#116)
#119Thom Brown
thom@linux.com
In reply to: Thom Brown (#118)
#120Victor Wagner
vitus@wagner.pp.ru
In reply to: Alvaro Herrera (#117)
#121Thom Brown
thom@linux.com
In reply to: Thom Brown (#118)
#122Thom Brown
thom@linux.com
In reply to: Thom Brown (#121)
#123Victor Wagner
vitus@wagner.pp.ru
In reply to: Thom Brown (#121)
#124Victor Wagner
vitus@wagner.pp.ru
In reply to: Thom Brown (#122)
#125Thom Brown
thom@linux.com
In reply to: Victor Wagner (#124)
#126Thom Brown
thom@linux.com
In reply to: Thom Brown (#125)
#127Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Victor Wagner (#120)
#128David Steele
david@pgmasters.net
In reply to: Alvaro Herrera (#127)
#129Simon Riggs
simon@2ndQuadrant.com
In reply to: David Steele (#128)
#130David Steele
david@pgmasters.net
In reply to: Simon Riggs (#129)
#131Mithun Cy
mithun.cy@enterprisedb.com
In reply to: David Steele (#130)
#132Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#131)
#133Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Mithun Cy (#131)
#134Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#133)
#135Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#131)
#136Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Alvaro Herrera (#127)
#137Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#136)
#138Aleksander Alekseev
aleksander@timescale.com
In reply to: Victor Wagner (#137)
#139Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Aleksander Alekseev (#138)
#140Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#139)
#141Victor Wagner
vitus@wagner.pp.ru
In reply to: Aleksander Alekseev (#138)
#142Aleksander Alekseev
aleksander@timescale.com
In reply to: Victor Wagner (#141)
#143Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#139)
#144Aleksander Alekseev
aleksander@timescale.com
In reply to: Victor Wagner (#143)
#145Aleksander Alekseev
aleksander@timescale.com
In reply to: Aleksander Alekseev (#144)
#146Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Victor Wagner (#141)
#147Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#146)
#148Robert Haas
robertmhaas@gmail.com
In reply to: Victor Wagner (#147)
#149Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#148)
#150Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#149)
#151Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Victor Wagner (#150)
#152Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#151)
#153Michael Paquier
michael@paquier.xyz
In reply to: Victor Wagner (#152)
#154Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Victor Wagner (#152)
#155Victor Wagner
vitus@wagner.pp.ru
In reply to: Mithun Cy (#154)
#156Robert Haas
robertmhaas@gmail.com
In reply to: Victor Wagner (#155)
#157Thom Brown
thom@linux.com
In reply to: Victor Wagner (#155)
#158Robert Haas
robertmhaas@gmail.com
In reply to: Peter Eisentraut (#81)
In reply to: Robert Haas (#158)
#160Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#156)
#161Thom Brown
thom@linux.com
In reply to: Robert Haas (#160)
#162Victor Wagner
vitus@wagner.pp.ru
In reply to: Thom Brown (#161)
#163Victor Wagner
vitus@wagner.pp.ru
In reply to: Robert Haas (#160)
#164Robert Haas
robertmhaas@gmail.com
In reply to: Peter van Hardenberg (#159)
#165Victor Wagner
vitus@wagner.pp.ru
In reply to: Robert Haas (#156)
#166Peter Eisentraut
peter_e@gmx.net
In reply to: Thom Brown (#161)
#167Peter Eisentraut
peter_e@gmx.net
In reply to: Robert Haas (#164)
#168Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#164)
#169Amit Kapila
amit.kapila16@gmail.com
In reply to: Alvaro Herrera (#168)
#170Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#168)
#171Robert Haas
robertmhaas@gmail.com
In reply to: Peter Eisentraut (#167)
#172Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#164)
#173Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#172)
#174Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#173)
#175Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#174)
#176Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#175)
#177Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#176)
#178Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#177)
#179Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#178)
#180Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#179)
#181Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#180)
#182Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#181)
#183Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#182)
#184Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Mithun Cy (#183)
#185Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Tsunakawa, Takayuki (#184)
#186Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Mithun Cy (#185)
#187Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Robert Haas (#182)
#188Peter Eisentraut
peter_e@gmx.net
In reply to: Mithun Cy (#183)
#189Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Robert Haas (#182)
#190Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Mithun Cy (#185)
#191Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Peter Eisentraut (#188)
#192Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Tsunakawa, Takayuki (#190)
#193Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Mithun Cy (#192)
#194Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Tsunakawa, Takayuki (#193)
#195Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Mithun Cy (#194)
#196Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#191)
#197Robert Haas
robertmhaas@gmail.com
In reply to: Tsunakawa, Takayuki (#195)
#198Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#196)
#199Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#198)
#200Catalin Iacob
iacobcatalin@gmail.com
In reply to: Robert Haas (#199)
#201Catalin Iacob
iacobcatalin@gmail.com
In reply to: Alvaro Herrera (#198)
#202Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Catalin Iacob (#201)
#203Robert Haas
robertmhaas@gmail.com
In reply to: Catalin Iacob (#200)
#204Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#196)
#205Tatsuo Ishii
ishii@postgresql.org
In reply to: Mithun Cy (#204)
#206Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#204)
#207Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Mithun Cy (#204)
#208Robert Haas
robertmhaas@gmail.com
In reply to: Kevin Grittner (#207)
#209Catalin Iacob
iacobcatalin@gmail.com
In reply to: Robert Haas (#206)
#210Robert Haas
robertmhaas@gmail.com
In reply to: Catalin Iacob (#209)
#211Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Robert Haas (#197)
#212Craig Ringer
craig@2ndquadrant.com
In reply to: Robert Haas (#208)
#213Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Tatsuo Ishii (#205)
#214Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Craig Ringer (#212)
#215Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Robert Haas (#206)
#216Robert Haas
robertmhaas@gmail.com
In reply to: Tsunakawa, Takayuki (#211)
#217Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#216)
#218Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Mithun Cy (#217)
#219Craig Ringer
craig@2ndquadrant.com
In reply to: Robert Haas (#216)
#220Robert Haas
robertmhaas@gmail.com
In reply to: Craig Ringer (#219)
#221Craig Ringer
craig@2ndquadrant.com
In reply to: Robert Haas (#220)
#222Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Tsunakawa, Takayuki (#218)
#223Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Mithun Cy (#222)
#224Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Robert Haas (#220)
#225Robert Haas
robertmhaas@gmail.com
In reply to: Tsunakawa, Takayuki (#224)
#226Tsunakawa, Takayuki
tsunakawa.takay@jp.fujitsu.com
In reply to: Robert Haas (#225)
#227Craig Ringer
craig@2ndquadrant.com
In reply to: Mithun Cy (#222)
#228Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Craig Ringer (#227)
#229Robert Haas
robertmhaas@gmail.com
In reply to: Tsunakawa, Takayuki (#189)
#230Catalin Iacob
iacobcatalin@gmail.com
In reply to: Tsunakawa, Takayuki (#226)
#231Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Catalin Iacob (#230)
#232Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#231)
#233Kuntal Ghosh
kuntalghosh.2007@gmail.com
In reply to: Mithun Cy (#231)
#234Robert Haas
robertmhaas@gmail.com
In reply to: Kuntal Ghosh (#233)
#235Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#234)
#236Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#234)
#237Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Mithun Cy (#236)
#238Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#237)
#239Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#238)
#240Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#239)
#241Gavin Flower
GavinFlower@archidevsys.co.nz
In reply to: Mithun Cy (#239)
#242Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Robert Haas (#240)
#243Robert Haas
robertmhaas@gmail.com
In reply to: Mithun Cy (#242)