Le 03/02/2010 22:00, Guillaume Lelarge a écrit :
> Le 03/02/2010 21:26, Magnus Hagander a écrit :
>> On Wed, Feb 3, 2010 at 21:22, Guillaume Lelarge <[email protected]>
>> wrote:
>>> Le 03/02/2010 21:04, Magnus Hagander a écrit :
>>>> On Wed, Feb 3, 2010 at 00:11, Guillaume Lelarge <[email protected]>
>>>> wrote:
>>>>> Hi,
>>>>>
>>>>> I tried both of them yesterday night and tonight to have a look at what
>>>>> could be done on pgAdmin for these features. AFAICT, not a lot.
>>>>>
>>>>> Actually, I have a really small patch that adds some informations in the
>>>>> server panel. This information is quite simple. It tells the user if the
>>>>> selected server is in recovery mode and the last xlog replay location.
>>>>> I'm not sure we can do more. Streaming Replication can be detected if
>>>>> max_wal_senders is greater than zero, but I'm not sure we really need to
>>>>> add this kind of information on the server panel.
>>>>
>>>> It would be interesting to know *which* slaves are connected to a master,
>>>> no?
>>>>
>>>
>>> AFAICT, there is no way to know that automatically in Hot Standby and in
>>> Streaming Replication. If you know some way to get that, I'm really
>>> interested. At first, I had hoped I could at least get the conninfo
>>> string on the slave, but recovery parameters are not available via show.
>>
>> Hmm. In that case, a way to do it should perhaps be created :-)
>>
>
> This means working on patch for the Streaming Replication. Could be
> interesting, but not something I can do right now.
>
This new version of the patch adds support for
pg_last_xlog_receive_location().
During FOSDEM, I discussed with Heikki about some interesting (at least
for us) informations: mainly knowing who the master is and knowing who
the slaves are.
He confirmed me there is actually no way to get that information.
There's also no way to have the contents of recovery.conf available as
all other GUCs. We found that we could at least read the recovery.conf
file in the master with pg_file_read, which will give us the master host
(via the primary_conninfo parameter) for people using the adminpack
module contrib. Is it something interesting enough that I put some time
to code this? or do we stop here, commit what I already have and see
later what's coming next? (the "what's coming next" could be something I
would code for next release)
--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com
diff --git a/pgadmin/include/schema/pgServer.h b/pgadmin/include/schema/pgServer.h
index 013a5c6..c7a08f7 100644
--- a/pgadmin/include/schema/pgServer.h
+++ b/pgadmin/include/schema/pgServer.h
@@ -81,6 +81,15 @@ public:
bool GetCreateRole() const { return createRole; }
void iSetCreateRole(const bool b) { createRole=b; }
+ bool GetInRecovery() const { return inRecovery; }
+ void iSetInRecovery(const bool b) { inRecovery=b; }
+ wxDateTime GetConfLoadedSince() { return confLoadedSince; }
+ void iSetConfLoadedSince(const wxDateTime &d) { confLoadedSince = d; }
+ wxString GetReceiveLoc() const { return receiveLoc; }
+ void iSetReceiveLoc(const wxString& s) { receiveLoc=s; }
+ wxString GetReplayLoc() const { return replayLoc; }
+ void iSetReplayLoc(const wxString& s) { replayLoc=s; }
+
pgConn *CreateConn(wxString dbName=wxEmptyString, OID oid=0, wxString applicationname=wxEmptyString);
wxString GetLastDatabase() const { return lastDatabase; }
@@ -154,6 +163,10 @@ private:
wxString dbRestriction;
wxString colour;
+ bool inRecovery;
+ wxString receiveLoc, replayLoc;
+ wxDateTime confLoadedSince;
+
#ifdef WIN32
SC_HANDLE scmHandle;
SC_HANDLE serviceHandle;
diff --git a/pgadmin/schema/pgServer.cpp b/pgadmin/schema/pgServer.cpp
index 27e884f..33ae298 100644
--- a/pgadmin/schema/pgServer.cpp
+++ b/pgadmin/schema/pgServer.cpp
@@ -663,6 +663,16 @@ int pgServer::Connect(frmMain *form, bool askPassword, const wxString &pwd, bool
hasUptime=true;
sql += wxT(", CASE WHEN usesuper THEN pg_postmaster_starttime() ELSE NULL END as upsince");
}
+ if (conn->BackendMinimumVersion(8, 4))
+ {
+ sql += wxT(", CASE WHEN usesuper THEN pg_conf_load_time() ELSE NULL END as confloadedsince");
+ }
+ if (conn->BackendMinimumVersion(8, 5))
+ {
+ sql += wxT(", CASE WHEN usesuper THEN pg_is_in_recovery() ELSE NULL END as inrecovery");
+ sql += wxT(", CASE WHEN usesuper THEN pg_last_xlog_receive_location() ELSE NULL END as receiveloc");
+ sql += wxT(", CASE WHEN usesuper THEN pg_last_xlog_replay_location() ELSE NULL END as replayloc");
+ }
pgSet *set=ExecuteSet(sql + wxT("\n FROM pg_user WHERE usename=current_user"));
if (set)
@@ -671,6 +681,14 @@ int pgServer::Connect(frmMain *form, bool askPassword, const wxString &pwd, bool
iSetSuperUser(set->GetBool(wxT("usesuper")));
if (hasUptime)
iSetUpSince(set->GetDateTime(wxT("upsince")));
+ if (conn->BackendMinimumVersion(8, 4))
+ iSetConfLoadedSince(set->GetDateTime(wxT("confloadedsince")));
+ if (conn->BackendMinimumVersion(8, 5))
+ {
+ iSetInRecovery(set->GetBool(wxT("inrecovery")));
+ iSetReplayLoc(set->GetVal(wxT("replayloc")));
+ iSetReceiveLoc(set->GetVal(wxT("receiveloc")));
+ }
delete set;
}
@@ -956,8 +974,16 @@ void pgServer::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *prop
{
if (GetUpSince().IsValid())
properties->AppendItem(_("Up since"), GetUpSince());
+ if (GetConfLoadedSince().IsValid())
+ properties->AppendItem(_("Configuration loaded since"), GetConfLoadedSince());
if (conn->BackendMinimumVersion(8,1))
properties->AppendItem(wxT("Autovacuum"), (autovacuumRunning ? _("running") : _("not running")));
+ if (conn->BackendMinimumVersion(8,5))
+ {
+ properties->AppendItem(wxT("In recovery"), (GetInRecovery() ? _("yes") : _("no")));
+ properties->AppendItem(wxT("Last XLOG receive location"), GetReceiveLoc());
+ properties->AppendItem(wxT("Last XLOG replay location"), GetReplayLoc());
+ }
}
if (GetServerControllable())
properties->AppendItem(_("Running?"), GetServerRunning());
--
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers