aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-01-26 22:25:13 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-01-26 22:25:13 +0000
commitb0e3dd7e61a3af1ba23ed9e11bed452331cf50bf (patch)
treee6720b5b79a7fa98670d5ae5f4ca05ac5e855f68
parentbf7737a938827608ce79586efe55c642c1a4a7d3 (diff)
downloadpostgresql-b0e3dd7e61a3af1ba23ed9e11bed452331cf50bf.tar.gz
postgresql-b0e3dd7e61a3af1ba23ed9e11bed452331cf50bf.zip
Adjust Windows autovacuum service to retry for up to 5 minutes waiting
for the postmaster to start. Dave Page
-rw-r--r--contrib/pg_autovacuum/pg_autovacuum.c73
1 files changed, 50 insertions, 23 deletions
diff --git a/contrib/pg_autovacuum/pg_autovacuum.c b/contrib/pg_autovacuum/pg_autovacuum.c
index 7b53052d678..388b7313322 100644
--- a/contrib/pg_autovacuum/pg_autovacuum.c
+++ b/contrib/pg_autovacuum/pg_autovacuum.c
@@ -4,7 +4,7 @@
* Revisions by Christopher B. Browne, Liberty RMS
* Win32 Service code added by Dave Page
*
- * $PostgreSQL: pgsql/contrib/pg_autovacuum/pg_autovacuum.c,v 1.28 2005/01/24 00:13:38 neilc Exp $
+ * $PostgreSQL: pgsql/contrib/pg_autovacuum/pg_autovacuum.c,v 1.29 2005/01/26 22:25:13 tgl Exp $
*/
#include "postgres_fe.h"
@@ -90,7 +90,7 @@ log_entry(const char *logentry, int level)
{
/*
* Note: Under Windows we dump the log entries to the normal
- * stderr/logfile as well, otherwise it can be a pain to debug
+ * stderr/logfile as well, otherwise it can be a pain to debug
* service install failures etc.
*/
@@ -556,6 +556,9 @@ init_db_list(void)
Dllist *db_list = DLNewList();
db_info *dbs = NULL;
PGresult *res = NULL;
+#ifdef WIN32
+ int k = 0;
+#endif
DLAddHead(db_list, DLNewElem(init_dbinfo((char *) "template1", 0, 0)));
if (DLGetHead(db_list) == NULL)
@@ -572,6 +575,30 @@ init_db_list(void)
dbs = ((db_info *) DLE_VAL(DLGetHead(db_list)));
dbs->conn = db_connect(dbs);
+#ifdef WIN32
+ while (dbs->conn == NULL && !appMode && k < 10)
+ {
+ int j;
+
+ /* Pause for 30 seconds to allow the database to start up */
+ log_entry("Pausing 30 seconds to allow the database to startup completely", LVL_INFO);
+ fflush(LOGOUTPUT);
+ ServiceStatus.dwWaitHint = 10;
+ for (j=0; j<6; j++)
+ {
+ pg_usleep(5000000);
+ ServiceStatus.dwCheckPoint++;
+ SetServiceStatus(hStatus, &ServiceStatus);
+ fflush(LOGOUTPUT);
+ }
+
+ /* now try again */
+ log_entry("Attempting to connect again.", LVL_INFO);
+ dbs->conn = db_connect(dbs);
+ k++;
+ }
+#endif
+
if (dbs->conn != NULL)
{
res = send_query(FROZENOID_QUERY, dbs);
@@ -904,7 +931,7 @@ db_connect(db_info * dbi)
PQfinish(db_conn);
db_conn = NULL;
}
-
+
return db_conn;
} /* end of db_connect() */
@@ -980,44 +1007,44 @@ static void
perform_maintenance_command(db_info * dbi, tbl_info * tbl, int operation)
{
char buf[256];
-
- /*
+
+ /*
* Set the vacuum_cost variables if supplied on command line
- */
+ */
if (args->av_vacuum_cost_delay != -1)
- {
+ {
snprintf(buf, sizeof(buf), "set vacuum_cost_delay = %d",
args->av_vacuum_cost_delay);
send_query(buf, dbi);
}
if (args->av_vacuum_cost_page_hit != -1)
- {
+ {
snprintf(buf, sizeof(buf), "set vacuum_cost_page_hit = %d",
args->av_vacuum_cost_page_hit);
send_query(buf, dbi);
}
if (args->av_vacuum_cost_page_miss != -1)
- {
+ {
snprintf(buf, sizeof(buf), "set vacuum_cost_page_miss = %d",
args->av_vacuum_cost_page_miss);
send_query(buf, dbi);
}
if (args->av_vacuum_cost_page_dirty != -1)
- {
+ {
snprintf(buf, sizeof(buf), "set vacuum_cost_page_dirty = %d",
args->av_vacuum_cost_page_dirty);
send_query(buf, dbi);
}
if (args->av_vacuum_cost_limit != -1)
- {
+ {
snprintf(buf, sizeof(buf), "set vacuum_cost_limit = %d",
args->av_vacuum_cost_limit);
send_query(buf, dbi);
}
-
+
/*
- * if ((relisshared = t and database != template1) or
- * if operation = ANALYZE_ONLY)
+ * if ((relisshared = t and database != template1) or
+ * if operation = ANALYZE_ONLY)
* then only do an analyze
*/
if ((tbl->relisshared > 0 && strcmp("template1", dbi->dbname) != 0) ||
@@ -1027,14 +1054,14 @@ perform_maintenance_command(db_info * dbi, tbl_info * tbl, int operation)
snprintf(buf, sizeof(buf), "VACUUM ANALYZE %s", tbl->table_name);
else
return;
-
+
if (args->debug >= 1)
{
sprintf(logbuffer, "Performing: %s", buf);
log_entry(logbuffer, LVL_DEBUG);
fflush(LOGOUTPUT);
}
-
+
send_query(buf, dbi);
update_table_thresholds(dbi, tbl, operation);
@@ -1085,7 +1112,7 @@ get_cmd_args(int argc, char *argv[])
args->port = 0;
/*
- * Cost-Based Vacuum Delay Settings for pg_autovacuum
+ * Cost-Based Vacuum Delay Settings for pg_autovacuum
*/
args->av_vacuum_cost_delay = -1;
args->av_vacuum_cost_page_hit = -1;
@@ -1255,7 +1282,7 @@ usage(void)
fprintf(stderr, " [-m] vacuum_cost_page_miss (default=none)\n");
fprintf(stderr, " [-n] vacuum_cost_page_dirty (default=none)\n");
fprintf(stderr, " [-l] vacuum_cost_limit (default=none)\n");
-
+
fprintf(stderr, " [-U] username (libpq default)\n");
fprintf(stderr, " [-P] password (libpq default)\n");
fprintf(stderr, " [-H] host (libpq default)\n");
@@ -1307,10 +1334,10 @@ print_cmd_args(void)
log_entry(logbuffer, LVL_INFO);
sprintf(logbuffer, " args->analyze_scaling_factor=%f", args->analyze_scaling_factor);
log_entry(logbuffer, LVL_INFO);
-
+
if (args->av_vacuum_cost_delay != -1)
sprintf(logbuffer, " args->av_vacuum_cost_delay=%d", args->av_vacuum_cost_delay);
- else
+ else
sprintf(logbuffer, " args->av_vacuum_cost_delay=(default)");
log_entry(logbuffer, LVL_INFO);
if (args->av_vacuum_cost_page_hit != -1)
@@ -1333,7 +1360,7 @@ print_cmd_args(void)
else
sprintf(logbuffer, " args->av_vacuum_cost_limit=(default)");
log_entry(logbuffer, LVL_INFO);
-
+
sprintf(logbuffer, " args->debug=%d", args->debug);
log_entry(logbuffer, LVL_INFO);
@@ -1450,8 +1477,8 @@ InstallService(void)
if (args->av_vacuum_cost_page_dirty != -1)
sprintf(szCommand, "%s -d %d", szCommand, args->av_vacuum_cost_page_dirty);
if (args->av_vacuum_cost_limit != -1)
- sprintf(szCommand, "%s -d %d", szCommand, args->av_vacuum_cost_limit);
-
+ sprintf(szCommand, "%s -d %d", szCommand, args->av_vacuum_cost_limit);
+
/* And write the new value */
if (RegSetValueEx(hk, "ImagePath", 0, REG_EXPAND_SZ, (LPBYTE) szCommand, (DWORD) strlen(szCommand) + 1))
return -4;