From: Gilles Darold <gilles.darold@dalibo.com>
To: pgsql-hackers@postgresql.org
Subject: Re: Patch pg_is_in_backup()
Date: Tue, 15 May 2012 02:52:32 +0200
Message-ID: <4FB1A8D0.4080306@dalibo.com> (raw)
In-Reply-To: <4FA17491.4040406@2ndQuadrant.it>
References: <4F26E291.9020605@dalibo.com>
<CABRT9RAo_xTOVdBAEDqzcP+QvoHa0SZW1Ud1p3vjmA5tJUnYLw@mail.gmail.com>
<CABUevExm4_a-Yw3pt=weppb5ckzAYZwK3e79m__sznQNjjDveg@mail.gmail.com>
<4F2B470F.5070107@timbira.com>
<CAHGQGwEE5Zk05cPeTVWjd+TYce10zemMs_Li7ekkroiFKPj9kw@mail.gmail.com>
<691525170451D3F76CEF7ED1@apophis.local>
<CAHGQGwFuqazEaT+YCDUoZe-HwQ-txcq=djgisayyWnHhWn+1aQ@mail.gmail.com>
<CABUevEzi=Fa5xUDRYUkCX3jeE26Y3F3AsO9T_yZQPUzYANdPpg@mail.gmail.com>
<4F50E1B0.90808@dalibo.com>
<4F76F7CF.2070908@2ndQuadrant.it>
<4F7AEB63.1000704@dalibo.com>
<4FA17491.4040406@2ndQuadrant.it>
Sorry for the the double post but it seems that my previous reply
doesn't reach the pgsql-hacker list. So here is the new patches that
limit lines to 80 characters.
Regards,
Le 02/05/2012 19:53, Gabriele Bartolini a écrit :
> Hi Gilles,
>
> Sorry for the delay.
>
> Il 03/04/12 14:21, Gilles Darold ha scritto:
>> +1, this is also my point of view.
>
> I have looked at the patch that contains both pg_is_in_backup() and
> pg_backup_start_time().
>
> From a functional point of view it looks fine to me. I was thinking
> of adding the BackupInProgress() at the beginning of
> pg_backup_start_time(), but the AllocateFile() function already make
> sure the file exists.
>
> I have performed some basic testing of both functions and tried to
> inject invalid characters in the start time field of the backup_label
> file and it is handled (with an exception) by the server. Cool.
>
> I spotted though some formatting issues, in particular indentation
> and multi-line comments. Some rows are longer than 80 chars.
>
> Please resubmit with these cosmetic changes and it is fine with me.
> Thank you.
>
> Cheers,
> Gabriele
>
--
Gilles Darold
Administrateur de bases de données
http://dalibo.com - http://dalibo.orgAttachments:download all (3 files, .tar.gz)postgresql-pg_backup_start_time-patch-v4.diff (text/x-patch, 4.6K) download
diff -ru postgresql-head/doc/src/sgml/func.sgml postgresql/doc/src/sgml/func.sgml
--- postgresql-head/doc/src/sgml/func.sgml 2012-04-03 10:44:43.979702643 +0200+++ postgresql/doc/src/sgml/func.sgml 2012-04-03 11:21:15.075701574 +0200@@ -14467,6 +14467,9 @@
<primary>pg_stop_backup</primary>
</indexterm>
<indexterm>
+ <primary>pg_backup_start_time</primary>+ </indexterm>+ <indexterm>
<primary>pg_switch_xlog</primary>
</indexterm>
<indexterm>
@@ -14532,6 +14535,13 @@
</row>
<row>
<entry>
+ <literal><function>pg_backup_start_time()</function></literal>+ </entry>+ <entry><type>timestamp with time zone</type></entry>+ <entry>Get start time of an online exclusive backup in progress.</entry>+ </row>+ <row>+ <entry>
<literal><function>pg_switch_xlog()</function></literal>
</entry>
<entry><type>text</type></entry>
diff -ru postgresql-head/src/backend/access/transam/xlogfuncs.c postgresql/src/backend/access/transam/xlogfuncs.c
--- postgresql-head/src/backend/access/transam/xlogfuncs.c 2012-04-03 10:44:44.227702645 +0200+++ postgresql/src/backend/access/transam/xlogfuncs.c 2012-04-03 11:21:15.075701574 +0200@@ -29,6 +29,7 @@
#include "utils/numeric.h"
#include "utils/guc.h"
#include "utils/timestamp.h"
+#include "storage/fd.h"
static void validate_xlog_location(char *str);
@@ -563,3 +564,67 @@
PG_RETURN_NUMERIC(result);
}
++/*+ * Returns start time of an online exclusive backup.+ *+ * When there's no exclusive backup in progress, the function+ * returns NULL.+ */+Datum+pg_backup_start_time(PG_FUNCTION_ARGS)+{+ TimestampTz xtime;+ FILE *lfp;+ char fline[MAXPGPATH];+ char backup_start_time[30];++ /*+ * See if label file is present+ */+ lfp = AllocateFile(BACKUP_LABEL_FILE, "r");+ if (lfp == NULL)+ {+ if (errno != ENOENT)+ ereport(ERROR,+ (errcode_for_file_access(),+ errmsg("could not read file \"%s\": %m",+ BACKUP_LABEL_FILE)));+ PG_RETURN_NULL();+ }++ /*+ * Parse the file to find the the START TIME line.+ */+ backup_start_time[0] = '\0';+ while (fgets(fline, sizeof(fline), lfp) != NULL)+ {+ if (sscanf(fline, "START TIME: %25[^\n]\n",+ backup_start_time) == 1)+ break;+ }++ /*+ * Close the backup label file.+ */+ if (ferror(lfp) || FreeFile(lfp)) {+ ereport(ERROR,+ (errcode_for_file_access(),+ errmsg("could not read file \"%s\": %m",+ BACKUP_LABEL_FILE)));+ }+ + if (strlen(backup_start_time) == 0) {+ ereport(ERROR,+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),+ errmsg("invalid data in file \"%s\"",+ BACKUP_LABEL_FILE)));+ }++ /*+ * Convert the time string read from file to TimestampTz form.+ */+ xtime = DatumGetTimestampTz(+ DirectFunctionCall3(timestamptz_in,+ CStringGetDatum(backup_start_time),+ ObjectIdGetDatum(InvalidOid),Int32GetDatum(-1))+ );++ PG_RETURN_TIMESTAMPTZ(xtime);+}+
diff -ru postgresql-head/src/include/access/xlog_internal.h postgresql/src/include/access/xlog_internal.h
--- postgresql-head/src/include/access/xlog_internal.h 2012-04-03 10:44:45.051702642 +0200+++ postgresql/src/include/access/xlog_internal.h 2012-04-03 11:21:15.075701574 +0200@@ -282,5 +282,6 @@
extern Datum pg_xlog_replay_resume(PG_FUNCTION_ARGS);
extern Datum pg_is_xlog_replay_paused(PG_FUNCTION_ARGS);
extern Datum pg_xlog_location_diff(PG_FUNCTION_ARGS);
+extern Datum pg_backup_start_time(PG_FUNCTION_ARGS);
#endif /* XLOG_INTERNAL_H */
diff -ru postgresql-head/src/include/catalog/pg_proc.h postgresql/src/include/catalog/pg_proc.h
--- postgresql-head/src/include/catalog/pg_proc.h 2012-04-03 10:44:45.051702642 +0200+++ postgresql/src/include/catalog/pg_proc.h 2012-04-03 11:21:15.075701574 +0200@@ -2924,6 +2924,8 @@
DESCR("prepare for taking an online backup");
DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_stop_backup _null_ _null_ _null_ ));
DESCR("finish taking an online backup");
+DATA(insert OID = 3883 ( pg_backup_start_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ pg_backup_start_time _null_ _null_ _null_ ));+DESCR("start time of an online backup");
DATA(insert OID = 2848 ( pg_switch_xlog PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_switch_xlog _null_ _null_ _null_ ));
DESCR("switch to new xlog file");
DATA(insert OID = 3098 ( pg_create_restore_point PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 25 "25" _null_ _null_ _null_ _null_ pg_create_restore_point _null_ _null_ _null_ ));
postgresql-pg_backup_start_time-pg_is_in_backup-patch-v4.diff (text/x-patch, 5.4K) download
diff -ru postgresql-head/doc/src/sgml/func.sgml postgresql/doc/src/sgml/func.sgml
--- postgresql-head/doc/src/sgml/func.sgml 2012-04-03 10:44:43.979702643 +0200+++ postgresql/doc/src/sgml/func.sgml 2012-04-03 12:00:13.099700433 +0200@@ -14467,6 +14467,12 @@
<primary>pg_stop_backup</primary>
</indexterm>
<indexterm>
+ <primary>pg_is_in_backup</primary>+ </indexterm>+ <indexterm>+ <primary>pg_backup_start_time</primary>+ </indexterm>+ <indexterm>
<primary>pg_switch_xlog</primary>
</indexterm>
<indexterm>
@@ -14532,6 +14538,20 @@
</row>
<row>
<entry>
+ <literal><function>pg_is_in_backup()</function></literal>+ </entry>+ <entry><type>bool</type></entry>+ <entry>True if an on-line exclusive backup is still in progress.</entry>+ </row>+ <row>+ <entry>+ <literal><function>pg_backup_start_time()</function></literal>+ </entry>+ <entry><type>timestamp with time zone</type></entry>+ <entry>Get start time of an online exclusive backup in progress.</entry>+ </row>+ <row>+ <entry>
<literal><function>pg_switch_xlog()</function></literal>
</entry>
<entry><type>text</type></entry>
diff -ru postgresql-head/src/backend/access/transam/xlogfuncs.c postgresql/src/backend/access/transam/xlogfuncs.c
--- postgresql-head/src/backend/access/transam/xlogfuncs.c 2012-04-03 10:44:44.227702645 +0200+++ postgresql/src/backend/access/transam/xlogfuncs.c 2012-04-03 12:02:51.043700358 +0200@@ -29,7 +29,7 @@
#include "utils/numeric.h"
#include "utils/guc.h"
#include "utils/timestamp.h"
-+#include "storage/fd.h"
static void validate_xlog_location(char *str);
@@ -563,3 +563,75 @@
PG_RETURN_NUMERIC(result);
}
++/*+ * Returns bool with current on-line backup mode, a global state.+ */+Datum+pg_is_in_backup(PG_FUNCTION_ARGS)+{+ PG_RETURN_BOOL(BackupInProgress());+}++/*+ * Returns start time of an online exclusive backup.+ *+ * When there's no exclusive backup in progress, the function+ * returns NULL.+ */+Datum+pg_backup_start_time(PG_FUNCTION_ARGS)+{+ TimestampTz xtime;+ FILE *lfp;+ char fline[MAXPGPATH];+ char backup_start_time[30];++ /*+ * See if label file is present+ */+ lfp = AllocateFile(BACKUP_LABEL_FILE, "r");+ if (lfp == NULL)+ {+ if (errno != ENOENT)+ ereport(ERROR,+ (errcode_for_file_access(),+ errmsg("could not read file \"%s\": %m",+ BACKUP_LABEL_FILE)));+ PG_RETURN_NULL();+ }++ /*+ * Parse the file to find the the START TIME line.+ */+ backup_start_time[0] = '\0';+ while (fgets(fline, sizeof(fline), lfp) != NULL)+ {+ if (sscanf(fline, "START TIME: %25[^\n]\n",+ backup_start_time) == 1)+ break;+ }++ /*+ * Close the backup label file.+ */+ if (ferror(lfp) || FreeFile(lfp)) {+ ereport(ERROR,+ (errcode_for_file_access(),+ errmsg("could not read file \"%s\": %m",+ BACKUP_LABEL_FILE)));+ }++ if (strlen(backup_start_time) == 0) {+ ereport(ERROR,+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),+ errmsg("invalid data in file \"%s\"",+ BACKUP_LABEL_FILE)));+ }++ /*+ * Convert the time string read from file to TimestampTz form.+ */+ xtime = DatumGetTimestampTz(+ DirectFunctionCall3(timestamptz_in,+ CStringGetDatum(backup_start_time),+ ObjectIdGetDatum(InvalidOid),Int32GetDatum(-1))+ );++ PG_RETURN_TIMESTAMPTZ(xtime);+}
diff -ru postgresql-head/src/include/access/xlog_internal.h postgresql/src/include/access/xlog_internal.h
--- postgresql-head/src/include/access/xlog_internal.h 2012-04-03 10:44:45.051702642 +0200+++ postgresql/src/include/access/xlog_internal.h 2012-04-03 12:06:38.955700246 +0200@@ -282,5 +282,7 @@
extern Datum pg_xlog_replay_resume(PG_FUNCTION_ARGS);
extern Datum pg_is_xlog_replay_paused(PG_FUNCTION_ARGS);
extern Datum pg_xlog_location_diff(PG_FUNCTION_ARGS);
+extern Datum pg_is_in_backup(PG_FUNCTION_ARGS);+extern Datum pg_backup_start_time(PG_FUNCTION_ARGS);
#endif /* XLOG_INTERNAL_H */
diff -ru postgresql-head/src/include/catalog/pg_proc.h postgresql/src/include/catalog/pg_proc.h
--- postgresql-head/src/include/catalog/pg_proc.h 2012-04-03 10:44:45.051702642 +0200+++ postgresql/src/include/catalog/pg_proc.h 2012-04-03 12:07:44.555700213 +0200@@ -2924,6 +2924,10 @@
DESCR("prepare for taking an online backup");
DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_stop_backup _null_ _null_ _null_ ));
DESCR("finish taking an online backup");
+DATA(insert OID = 3882 ( pg_is_in_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ pg_is_in_backup _null_ _null_ _null_ ));+DESCR("true if server is in online backup");+DATA(insert OID = 3883 ( pg_backup_start_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ pg_backup_start_time _null_ _null_ _null_ ));+DESCR("start time of an online backup");
DATA(insert OID = 2848 ( pg_switch_xlog PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_switch_xlog _null_ _null_ _null_ ));
DESCR("switch to new xlog file");
DATA(insert OID = 3098 ( pg_create_restore_point PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 25 "25" _null_ _null_ _null_ _null_ pg_create_restore_point _null_ _null_ _null_ ));
postgresql-pg_is_in_backup-patch-v4.diff (text/x-patch, 3.0K) download
diff -ru postgresql-head/doc/src/sgml/func.sgml postgresql/doc/src/sgml/func.sgml
--- postgresql-head/doc/src/sgml/func.sgml 2012-04-03 10:44:43.979702643 +0200+++ postgresql/doc/src/sgml/func.sgml 2012-04-03 11:24:41.427701474 +0200@@ -14467,6 +14467,9 @@
<primary>pg_stop_backup</primary>
</indexterm>
<indexterm>
+ <primary>pg_is_in_backup</primary>+ </indexterm>+ <indexterm>
<primary>pg_switch_xlog</primary>
</indexterm>
<indexterm>
@@ -14532,6 +14535,13 @@
</row>
<row>
<entry>
+ <literal><function>pg_is_in_backup()</function></literal>+ </entry>+ <entry><type>bool</type></entry>+ <entry>True if an on-line exclusive backup is still in progress.</entry>+ </row>+ <row>+ <entry>
<literal><function>pg_switch_xlog()</function></literal>
</entry>
<entry><type>text</type></entry>
diff -ru postgresql-head/src/backend/access/transam/xlogfuncs.c postgresql/src/backend/access/transam/xlogfuncs.c
--- postgresql-head/src/backend/access/transam/xlogfuncs.c 2012-04-03 10:44:44.227702645 +0200+++ postgresql/src/backend/access/transam/xlogfuncs.c 2012-04-03 11:24:41.427701474 +0200@@ -563,3 +563,12 @@
PG_RETURN_NUMERIC(result);
}
++/*+ * Returns bool with current on-line backup mode, a global state.+ */+Datum+pg_is_in_backup(PG_FUNCTION_ARGS)+{+ PG_RETURN_BOOL(BackupInProgress());+}
diff -ru postgresql-head/src/include/access/xlog_internal.h postgresql/src/include/access/xlog_internal.h
--- postgresql-head/src/include/access/xlog_internal.h 2012-04-03 10:44:45.051702642 +0200+++ postgresql/src/include/access/xlog_internal.h 2012-04-03 11:24:41.427701474 +0200@@ -282,5 +282,6 @@
extern Datum pg_xlog_replay_resume(PG_FUNCTION_ARGS);
extern Datum pg_is_xlog_replay_paused(PG_FUNCTION_ARGS);
extern Datum pg_xlog_location_diff(PG_FUNCTION_ARGS);
+extern Datum pg_is_in_backup(PG_FUNCTION_ARGS);
#endif /* XLOG_INTERNAL_H */
diff -ru postgresql-head/src/include/catalog/pg_proc.h postgresql/src/include/catalog/pg_proc.h
--- postgresql-head/src/include/catalog/pg_proc.h 2012-04-03 10:44:45.051702642 +0200+++ postgresql/src/include/catalog/pg_proc.h 2012-04-03 11:24:41.427701474 +0200@@ -2924,6 +2924,8 @@
DESCR("prepare for taking an online backup");
DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_stop_backup _null_ _null_ _null_ ));
DESCR("finish taking an online backup");
+DATA(insert OID = 3882 ( pg_is_in_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ pg_is_in_backup _null_ _null_ _null_ ));+DESCR("true if server is in online backup");
DATA(insert OID = 2848 ( pg_switch_xlog PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_switch_xlog _null_ _null_ _null_ ));
DESCR("switch to new xlog file");
DATA(insert OID = 3098 ( pg_create_restore_point PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 25 "25" _null_ _null_ _null_ _null_ pg_create_restore_point _null_ _null_ _null_ ));
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: gilles.darold@dalibo.com
Subject: Re: Patch pg_is_in_backup()
In-Reply-To: <4FB1A8D0.4080306@dalibo.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox