Skip to content

Commit

Permalink
[pgmoneta#187] Receive WAL end pos of backup from server
Browse files Browse the repository at this point in the history
  • Loading branch information
Jubilee101 committed Apr 8, 2024
1 parent 7c9b38b commit f8e707b
Show file tree
Hide file tree
Showing 6 changed files with 193 additions and 46 deletions.
5 changes: 5 additions & 0 deletions src/include/info.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,10 @@ extern "C" {
#define INFO_RESTORE "RESTORE"
#define INFO_TABLESPACES "TABLESPACES"
#define INFO_START_WALPOS "START_WALPOS"
#define INFO_END_WALPOS "END_WALPOS"
#define INFO_CHKPT_WALPOS "CHKPT_WALPOS"
#define INFO_START_TIMELINE "START_TIMELINE"
#define INFO_END_TIMELINE "END_TIMELINE"

#define VALID_UNKNOWN -1
#define VALID_FALSE 0
Expand All @@ -75,9 +77,12 @@ struct backup
char tablespaces[MAX_NUMBER_OF_TABLESPACES][MISC_LENGTH]; /**< The names of the tablespaces */
uint32_t start_lsn_hi32; /**< The high 32 bits of WAL starting position of the backup */
uint32_t start_lsn_lo32; /**< The low 32 bits of WAL starting position of the backup */
uint32_t end_lsn_hi32; /**< The high 32 bits of WAL ending position of the backup */
uint32_t end_lsn_lo32; /**< The low 32 bits of WAL ending position of the backup */
uint32_t checkpoint_lsn_hi32; /**< The high 32 bits of WAL checkpoint position of the backup */
uint32_t checkpoint_lsn_lo32; /**< The low 32 bits of WAL checkpoint position of the backup */
uint32_t start_timeline; /**< The starting timeline of the backup */
uint32_t end_timeline; /**< The ending timeline of the backup */
} __attribute__ ((aligned (64)));

/**
Expand Down
6 changes: 2 additions & 4 deletions src/include/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -748,15 +748,13 @@ int
pgmoneta_read_wal(char* directory, char** wal);

/**
* Read the start WAL location and checkpoint WAL location from a backup_label file
* Read the checkpoint WAL location from a backup_label file
* @param directory The base directory
* @param startpos [out] The start WAL position
* @param chkptpos [out] The checkpoint WAL position
* @param start_timeline [out] The timeline this backup starts with
* @return 0 on success, 1 if otherwise
*/
int
pgmoneta_read_wal_info(char* directory, char** startpos, char** chkptpos, uint32_t* start_timeline);
pgmoneta_read_checkpoint_info(char* directory, char** chkptpos);

/**
* Get the directory for a server
Expand Down
8 changes: 8 additions & 0 deletions src/libpgmoneta/info.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,10 @@ pgmoneta_get_backup(char* directory, char* label, struct backup** backup)
{
sscanf(&value[0], "%X/%X", &bck->start_lsn_hi32, &bck->start_lsn_lo32);
}
else if (pgmoneta_starts_with(&key[0], INFO_END_WALPOS))
{
sscanf(&value[0], "%X/%X", &bck->end_lsn_hi32, &bck->end_lsn_lo32);
}
else if (pgmoneta_starts_with(&key[0], INFO_CHKPT_WALPOS))
{
sscanf(&value[0], "%X/%X", &bck->checkpoint_lsn_hi32, &bck->checkpoint_lsn_lo32);
Expand All @@ -407,6 +411,10 @@ pgmoneta_get_backup(char* directory, char* label, struct backup** backup)
{
bck->start_timeline = atoi(&value[0]);
}
else if (pgmoneta_starts_with(&key[0], INFO_END_TIMELINE))
{
bck->end_timeline = atoi(&value[0]);
}
}
}

Expand Down
152 changes: 149 additions & 3 deletions src/libpgmoneta/prometheus.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,21 @@ home_page(int client_fd)
data = pgmoneta_append(data, " </tbody>\n");
data = pgmoneta_append(data, " </table>\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_backup_end_timeline</h2>\n");
data = pgmoneta_append(data, " The ending timeline of a backup for a server\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
data = pgmoneta_append(data, " <tbody>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>name</td>\n");
data = pgmoneta_append(data, " <td>The identifier for the server</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>label</td>\n");
data = pgmoneta_append(data, " <td>The backup label</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " </tbody>\n");
data = pgmoneta_append(data, " </table>\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_backup_start_walpos</h2>\n");
data = pgmoneta_append(data, " The starting WAL position of a backup for a server\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
Expand All @@ -544,7 +559,7 @@ home_page(int client_fd)
data = pgmoneta_append(data, " </table>\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_backup_checkpoint_walpos</h2>\n");
data = pgmoneta_append(data, " The checkpoint WAL pos for a server\n");
data = pgmoneta_append(data, " The checkpoint WAL pos of a backup for a server\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
data = pgmoneta_append(data, " <tbody>\n");
data = pgmoneta_append(data, " <tr>\n");
Expand All @@ -562,6 +577,25 @@ home_page(int client_fd)
data = pgmoneta_append(data, " </tbody>\n");
data = pgmoneta_append(data, " </table>\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_backup_end_walpos</h2>\n");
data = pgmoneta_append(data, " The ending WAL pos of a backup for a server\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
data = pgmoneta_append(data, " <tbody>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>name</td>\n");
data = pgmoneta_append(data, " <td>The identifier for the server</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>label</td>\n");
data = pgmoneta_append(data, " <td>The backup label</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>walpos</td>\n");
data = pgmoneta_append(data, " <td>The backup ending WAL position</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " </tbody>\n");
data = pgmoneta_append(data, " </table>\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_restore_newest_size</h2>\n");
data = pgmoneta_append(data, " The size of the newest restore for a server\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
Expand Down Expand Up @@ -1309,7 +1343,7 @@ general_information(int client_fd)

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "} ");
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append_int(data, workers);

Expand Down Expand Up @@ -1676,7 +1710,7 @@ backup_information(int client_fd)
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\",label=\"");
data = pgmoneta_append(data, backups[j]->label);
data = pgmoneta_append(data, ", major=\"");
data = pgmoneta_append(data, "\", major=\"");
data = pgmoneta_append_int(data, backups[j]->version);
data = pgmoneta_append(data, "\", minor=\"");
data = pgmoneta_append_int(data, backups[j]->minor_version);
Expand Down Expand Up @@ -1819,6 +1853,58 @@ backup_information(int client_fd)
}
data = pgmoneta_append(data, "\n");

data = pgmoneta_append(data, "#HELP pgmoneta_backup_end_timeline The ending timeline of a backup for a server\n");
data = pgmoneta_append(data, "#TYPE pgmoneta_backup_end_timeline gauge\n");
for (int i = 0; i < config->number_of_servers; i++)
{
d = pgmoneta_get_server_backup(i);

number_of_backups = 0;
backups = NULL;

pgmoneta_get_backups(d, &number_of_backups, &backups);

if (number_of_backups > 0)
{
for (int j = 0; j < number_of_backups; j++)
{
if (backups[j]->valid == VALID_TRUE)
{
data = pgmoneta_append(data, "pgmoneta_backup_end_timeline{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\",label=\"");
data = pgmoneta_append(data, backups[j]->label);
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append_int(data, backups[j]->end_timeline);

data = pgmoneta_append(data, "\n");
}
}
}
else
{
data = pgmoneta_append(data, "pgmoneta_backup_end_timeline{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\",label=\"0\"} 0");

data = pgmoneta_append(data, "\n");
}

for (int j = 0; j < number_of_backups; j++)
{
free(backups[j]);
}
free(backups);

free(d);
}
data = pgmoneta_append(data, "\n");

data = pgmoneta_append(data, "#HELP pgmoneta_backup_start_walpos The starting WAL position of a backup for a server\n");
data = pgmoneta_append(data, "#TYPE pgmoneta_backup_start_walpos gauge\n");
for (int i = 0; i < config->number_of_servers; i++)
Expand Down Expand Up @@ -1938,6 +2024,66 @@ backup_information(int client_fd)
}
data = pgmoneta_append(data, "\n");

data = pgmoneta_append(data, "#HELP pgmoneta_backup_end_walpos The ending WAL position of a backup for a server\n");
data = pgmoneta_append(data, "#TYPE pgmoneta_backup_end_walpos gauge\n");
for (int i = 0; i < config->number_of_servers; i++)
{
d = pgmoneta_get_server_backup(i);

number_of_backups = 0;
backups = NULL;

pgmoneta_get_backups(d, &number_of_backups, &backups);

if (number_of_backups > 0)
{
for (int j = 0; j < number_of_backups; j++)
{
if (backups[j]->valid == VALID_TRUE)
{
char walpos[MISC_LENGTH];
memset(walpos, 0, MISC_LENGTH);
data = pgmoneta_append(data, "pgmoneta_backup_end_walpos{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\",label=\"");
data = pgmoneta_append(data, backups[j]->label);
data = pgmoneta_append(data, "\", ");

snprintf(walpos, MISC_LENGTH, "%X/%X", backups[j]->end_lsn_hi32, backups[j]->end_lsn_lo32);
data = pgmoneta_append(data, "walpos=\"");
data = pgmoneta_append(data, walpos);
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append_int(data, 1);

data = pgmoneta_append(data, "\n");
}
}
}
else
{
data = pgmoneta_append(data, "pgmoneta_backup_end_walpos{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\",label=\"0\", ");
data = pgmoneta_append(data, "walpos=\"0/0\"} 0");

data = pgmoneta_append(data, "\n");
}

for (int j = 0; j < number_of_backups; j++)
{
free(backups[j]);
}
free(backups);

free(d);
}
data = pgmoneta_append(data, "\n");

if (data != NULL)
{
send_chunk(client_fd, data);
Expand Down
31 changes: 3 additions & 28 deletions src/libpgmoneta/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -2551,20 +2551,16 @@ pgmoneta_read_wal(char* directory, char** wal)
}

int
pgmoneta_read_wal_info(char* directory, char** startpos, char** chkptpos, uint32_t* start_timeline)
pgmoneta_read_checkpoint_info(char* directory, char** chkptpos)
{
char label[MAX_PATH];
char buffer[MAX_PATH];
char* start = NULL;
char* chkpt = NULL;
FILE* file = NULL;
uint32_t tli = 0;
int numfields = 0;

start = (char*)malloc(MISC_LENGTH);
chkpt = (char*)malloc(MISC_LENGTH);

memset(start, 0, MISC_LENGTH);
memset(chkpt, 0, MISC_LENGTH);
memset(buffer, 0, sizeof(buffer));
memset(label, 0, MAX_PATH);
Expand All @@ -2578,17 +2574,7 @@ pgmoneta_read_wal_info(char* directory, char** startpos, char** chkptpos, uint32
}
while (fgets(buffer, sizeof(buffer), file) != NULL)
{
if (pgmoneta_starts_with(buffer, "START WAL LOCATION"))
{
numfields = sscanf(buffer, "START WAL LOCATION: %s (file ", start);
if (numfields != 1)
{
pgmoneta_log_error("Error parsing start wal location");
goto error;
}
*startpos = start;
}
else if (pgmoneta_starts_with(buffer, "CHECKPOINT LOCATION"))
if (pgmoneta_starts_with(buffer, "CHECKPOINT LOCATION"))
{
numfields = sscanf(buffer, "CHECKPOINT LOCATION: %s\n", chkpt);
if (numfields != 1)
Expand All @@ -2597,18 +2583,8 @@ pgmoneta_read_wal_info(char* directory, char** startpos, char** chkptpos, uint32
goto error;
}
*chkptpos = chkpt;
break;
}
else if (pgmoneta_starts_with(buffer, "START TIMELINE"))
{
numfields = sscanf(buffer, "START TIMELINE: %u\n", &tli);
if (numfields != 1)
{
pgmoneta_log_error("Error parsing backup start timeline");
goto error;
}
*start_timeline = tli;
}

memset(buffer, 0, sizeof(buffer));
}

Expand All @@ -2620,7 +2596,6 @@ pgmoneta_read_wal_info(char* directory, char** startpos, char** chkptpos, uint32
{
fclose(file);
}
free(start);
free(chkpt);
return 1;
}
Expand Down

0 comments on commit f8e707b

Please sign in to comment.