1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-04 09:43:08 +02:00
Commit Graph

4559 Commits

Author SHA1 Message Date
David Steele
46c1297be3
Remove limitation on reading files in parallel during restore.
This restriction prevented multiple files being read from a remote simultaneously, which was not supported by the protocol. Although the limitation only applied to remotes, it was applied in all cases for testing purposes and because we planned to fix it.

Protocol command multiplexing added in df8cbc91 allows files to be read simultaneously from a remote so this restriction is no longer required.

Note that there is a test for this condition since the prior code had coverage. It might be tricky to ensure that test doesn't go away, but in general we should have enough tests in place to ensure simultaneous reads function as expected.
2024-09-09 15:47:23 +03:00
David Steele
a42629f87a
Allow requested standby backup to proceed with no standby.
Add a "prefer" value to the backup-standby option to allow the backup to proceed when no standby is found. Note that this will not help if the standby is responding but fails to sync with the primary after the backup has started.

Introduce a new option modifier, bool-like, that allows a boolean option to be converted to a string or string-id option while still allowing the option to act like a boolean on the command-line, e.g. --no-backup-standby.
2024-09-09 12:56:52 +03:00
David Steele
b454b9e403 Save backup.info only when contents have changed.
This prevents backup.info from being saved again when expire does not make any changes.

More importantly, as we look to support versioning on object stores, it will be much easier to determine a good point-in-time to use for restore if there are no extraneous saves of backup.info.
2024-09-05 11:38:42 +03:00
David Steele
83802ded8c Remove invalid const keywords from info/infoBackup module.
In these functions infoBackup was marked as const even though it was modified in the function. This was allowed by the compiler because the infoBackup struct was not being directly modified but it still goes against our coding conventions.
2024-09-01 12:51:27 +07:00
Brent Graveland
95a4b9e10a
Refresh web-id token for each S3 authentication.
The token file pointed to by the AWS_WEB_IDENTITY_TOKEN_FILE environment variable was read once at startup, but for long operations the token might expire before completion.

Instead read the token on each S3 authentication so the current token is always used.
2024-09-01 11:21:56 +07:00
David Steele
d204bac75d Refactor storage/remote module to move more repository storage tests.
Move tests missed in 3b3886f3.
2024-08-30 16:23:55 +07:00
David Steele
0b4371f3ec Update comment in storage/list module.
This aligns better with other comments in the area.
2024-08-30 16:02:04 +07:00
David Steele
3b3886f3b8 Refactor storage/remote module to move repository storage tests.
Move tests that use functions that are not valid for non-Posix repositories to pg storage.

This allows for a test storage driver that only implements functions required for repositories.
2024-08-30 16:00:07 +07:00
David Steele
b3fed2cfcf Simplify command/repo tests.
Reduce the number of tests that use links and special files. This simplifies future versioning tests.
2024-08-30 15:44:43 +07:00
David Steele
94e21893e8 Add hrnSleepRemainder() to time test harness.
This function replaces some ad hoc implementations in the tests.
2024-08-30 15:39:03 +07:00
David Steele
c40dd5ae41 Improve reporting of partial reads in server test harness.
Previously partial reads would be reported as an EOF which was not very helpful.

Also update error formatting to make requests easier to compare.
2024-08-28 11:07:52 +07:00
David Steele
2ce01e57d3 Refactor interface/driver getters for IoRead/Write and StorageRead/Write.
Add getters where needed and remove the unused driver member from the StorageRead/Write objects. The new getters are only required for testing but they don't compromise the core code.
2024-08-20 20:57:06 +07:00
David Steele
a71d88481c Improve TEST_STORAGE_GET() to allow testing of missing files.
Previously a missing file would always throw an error. Now there is the option to return NULL for missing files.
2024-08-20 20:34:40 +07:00
David Steele
4eab64fcd9 Improve file removal performed after each unit test.
The rm would miss files beginning with a dot which are being used going forward for the versioning test driver.

Instead use find since it will delete all files.
2024-08-20 20:14:32 +07:00
David Steele
f6aaa3672b Merge v2.53.1 release. 2024-08-20 11:03:24 +07:00
David Steele
2b29fe9337 Move getEpoch() to cvtZToTime() and refactor.
This function will be needed elsewhere going forward and in any case it makes sense to move this out of the restore module.

Refactor to avoid dependency on a regular expression.
2024-08-17 12:58:55 +07:00
David Steele
60f96429b8
Fix segfault on delayed connection errors.
Connection errors could cause a segfault if the error was delayed enough to pass the initial call to sckClientOpenWait() and the error was instead thrown by a subsequent call to sckClientOpenWait(), which was not correctly initializing a variable required for error handling.

While this can be produced fairly easily in a test environment, I was unable to craft a unit test to hit this exact condition, probably due to timing. The new code still has full coverage and I added several comments to help prevent regressions.
2024-08-16 10:56:07 +07:00
Reid Thompson
04ef43d9ed
Skip local repository duplicate check for SFTP.
This check does not make sense for SFTP since the repository will never be local.
2024-08-13 13:45:24 +08:00
David Steele
80c9b3001c PostgreSQL 17beta3 support.
This release changed the control and WAL format, which is very unusual for a beta. Update control and WAL versions/structs to match.
2024-08-13 11:53:12 +08:00
David Steele
ed9b0c260a
Fix permissions when restore run as root user.
When restore was run as the root user the pg_control file would end up with root permissions. This bug was introduced in e634fd8. Fix this by directly overwriting the pg_control temp file rather than doing an atomic write that updates permissions. Also update other parameters to more closely match similar calls.

There was also an adjacent error where restore as the root user would fail if the base path did not exist. Fix this by ignoring the missing path since it will be created later and this logic is just trying to find an alternate user for permissions if the user in the manifest does not exist.
2024-08-13 11:43:05 +08:00
David Steele
5766353649 Use Posix driver to complete dummy storage driver.
Instead of stub functions, use the Posix driver to make the dummy storage driver interface more functional.
2024-08-02 15:47:30 +07:00
Stefan Fercot
b306f83493
Summarize backup reference list for info command text output.
The backup reference list can be very long so it seems better to summarize the list by default for text output and keep the full list when --set is specified.
2024-07-31 18:53:02 +07:00
Aleksey Tsalolikhin
c42d484c9d
Fix typo in user guide. 2024-07-30 12:48:32 +07:00
David Steele
8d6bceb541 Refactor config parse to remove none command, add version/help options.
The none command was a bit confusing since it was only valid when parsing failed but still needed to be added to various switches and logic. Replace with cfgInited() which should make it clearer what state configuration is in.

Make the default command help and convert --version and --help to real options.

Combine version and help output into a single function to simplify processing in main.

Additional reformatting and a bit of refactoring.
2024-07-23 16:39:02 +07:00
David Steele
6c757366c2 Simplify main() functions in core, doc, and test.
This refactor simplifies the main() functions and puts the more commonly run commands first.

For core main() also remove code duplication in local/remote role handling.
2024-07-23 11:50:12 +07:00
David Steele
faee892067 Do not allow help for command roles other than main.
Previously requesting help for roles other than main would result in a segfault since help.auto.c.inc does not include such help.

Prevent this by erroring when a user requests help for roles other than main.

This is a bug but it is unlikely to have ever been seen in the field and in any case it has a very low severity since it only impacts a corner-case for the help command.
2024-07-23 11:10:54 +07:00
David Steele
ee70c2e26e Remove internal repo-create command.
This command was used by the Perl integration tests to create buckets for storage types that required it. Now that the integration tests are written in C they can simply use the same code to create buckets.

The command was also used in the documentation but there it seems more appropriate to use the corresponding vendor CLI.
2024-07-22 14:17:47 +07:00
David Steele
55ca41e137 Update protocol and storage/remote modules to recent coding standards.
Add const as appropriate.
2024-07-22 12:43:54 +07:00
David Steele
df8cbc91c3
Protocol command multiplexing.
Previously it was not possible to read or write two files at the same time on the same remote because the protocol was entirely taken over by the read or write command. Multiple reads are required to make restores efficient when a list of bundled files is being read but blocks need to be retrieved from a separate file or a different part of the same file.

Improve that situation with sessions that allow related commands to be run with shared state. Also break read/write into separate requests (rather than pushing all data at once) so they can be multiplexed.

The disadvantage for read/write is that they now require more back and forth to transfer a file. This is mitigated by sending asynchronous read/write requests to keep both server and client as busy as possible. Reads that can fit into a single buffer are optimized to transfer in a single command. Reads that transfer the entire file can also skip the close command since it is implicit on end-of-file.

These changes allow the protocol to be simplified to provide one response per request, which makes the data end message obsolete. Any data sent for the request is now added to the parameters so no data needs to be sent separately to the server outside the request parameters.

Also update the Db protocol to use the new sessions. Previously this code had tracked its own sessions.
2024-07-22 11:48:32 +07:00
David Steele
e7f4e8d800 Begin v2.54 development. 2024-07-22 09:42:33 +07:00
David Steele
6e8a45f650 v2.53: Concurrent Backups
IMPORTANT NOTE: The log-level-stderr option default has been changed from warn to off. This makes it easier to capture errors when only redirecting stdout. To preserve the prior behavior set log-level-stderr=warn.

NOTE TO PACKAGERS: The lz4 library is now required by the meson build.

NOTE TO PACKAGERS: Compiler support for __builtin_clzl() and __builtin_bswap64() is now required by the meson build.

Bug Fixes:

* Fix SFTP renaming failure when file already exists. (Fixed by Reid Thompson. Reviewed by David Steele. Reported by ahmed112212.)

Features:

* Allow backups to run concurrently on different repositories. (Reviewed by Reid Thompson, Stefan Fercot.)
* Support IP-based SANs for TLS certificate validation. (Contributed by David Christensen. Reviewed by David Steele.)

Improvements:

* Default log-level-stderr option to off. (Reviewed by Greg Sabino Mullane, Stefan Fercot.)
* Allow alternative WAL segment sizes for PostgreSQL ≤ 10. (Contributed by Viktor Kurilko. Reviewed by David Steele.)
* Add hint to check SFTP authorization log. (Contributed by Vitalii Zurian. Reviewed by Reid Thompson, David Steele.)

Documentation Improvements:

* Clarify archive-push multi-repo behavior. (Reviewed by Stefan Fercot.)
2024-07-22 09:33:31 +07:00
David Steele
dea48be06d Fix incorrect examples in doc/test help.
The help for help was copied from core but the examples were not updated.

Update the examples to be appropriate for doc/help.
2024-07-21 17:01:23 +07:00
David Steele
32a6dd6c3d Improve config file handling in doc/test config load.
Since 1141dc20 it has been possible to request that cfgParse() skip loading the config file. Use this logic to replace the code used to ignore config files in doc/test config load.
2024-07-21 16:57:35 +07:00
David Steele
ec3e387bb7
Clarify archive-push multi-repo behavior.
Clarify that archive-push will not be able to push ahead in other repositories if one is failing unless archive-async in enabled.
2024-07-18 11:19:25 +07:00
David Steele
c85191e024 Update Minio test/documentation container version. 2024-07-16 09:45:22 +07:00
David Steele
d8ff89ae75 Update EOL Debian 10 to Debian 11/Ubuntu 20.04 in CI.
Typically we use the oldest Debian/Ubuntu to run 32-bit unit and integration tests. However, 32-bit is no longer fully supported by Ubuntu (multiple packages we need are missing) and apt.postgresql.org no longer packages for any 32-bit version.

To address these changes, do 64-bit integration testing on the oldest Debian/Ubuntu (currently Ubuntu 20.04) and 32-bit unit/integration testing on the oldest Debian (currently 11) using the included version for integration testing.
2024-07-15 11:53:57 +07:00
David Steele
ce2493c3f6 Remove obsolete vm constants.
The VM[2-4] constants do not serve a purpose anymore (removed in 794c5771) and just make the mappings more complicated, so remove them.
2024-07-15 11:22:13 +07:00
David Steele
c84ab4914f Remove references to mock integration tests.
Mock integration tests were removed in d41b21c8 but CI was still trying to run them, so remove from CI.

Also rename mock to integration in test unit tests to avoid confusion in the future.
2024-07-15 11:12:53 +07:00
David Christensen
dfb620b0b8
Support IP-based SANs for TLS certificate validation.
The prior SAN code only recognized DNS-based SANs, which meant that it would not properly validate if using an IP-based SAN. 

Add support for IPv4 and IPv6 SANs with exact matching only.

This simplifies testing when certificate generation tools have trouble generating a DNS:1.2.3.4-style SAN, preferring to include the SAN as IP:1.2.3.4.
2024-07-11 10:54:20 +07:00
David Steele
d295156dd3 Improve command/role parsing.
Reduce redundancy by improving cfgParseCommandId() to work when a command role is present. This way the function does not need to be called twice.

Also, remove the use of StringList in cfgParse() since checking for a colon is faster and saves memory allocations. Modify cfgParseCommandRoleEnum() to accept char * since a String is no longer produced for the role name.
2024-07-09 16:07:40 +07:00
Vitalii Zurian
ccae609402
Add hint to check SFTP authorization log.
In the case of authorization failures there many be valuable information in the log.
2024-07-09 11:34:13 +07:00
David Steele
cf8625d24b Require OpenSSL >= 1.1.1.
Versions below 1.1.1 are quite old and no longer need to be supported.

Also add a missing const in tlsAsn1ToStr().
2024-07-09 11:17:25 +07:00
David Steele
b71d4b53d6 Auto-generate code before building test binary.
Errors in code generation can cause the test binary build to fail and then it is not possible to see the generated code.

Instead, generate code first so any errors can be seen and analyzed.
2024-07-09 10:48:27 +07:00
David Steele
66d3cd42b5 Improve error messages for allow range and allow list options.
Create mappings between integer, size, time, and stringid option values and their string equivalents. This allows for better error messages and means that the mappings do not need to be stored with defaults, allow lists, etc.
2024-07-09 10:45:47 +07:00
David Steele
aadfb54046 Add units to all option sizes.
Some sizes were missing units. Add units to make it clear that they are sizes in messages.
2024-07-09 10:09:55 +07:00
David Steele
6f5066b0b6 Fix overly long lines. 2024-07-07 17:06:44 +07:00
Reid Thompson
d6f0bf88af
Fix SFTP renaming failure when file already exists.
Update error handling for libssh2_sftp_rename_ex() in storageWriteSftpClose() when a file already exists. 

The SFTP servers used during development and testing never returned LIBSSH2_FX_FILE_ALREADY_EXISTS, rather they returned LIBSSH2_FX_FAILURE when a file already existed. However, it is clear that some SFTP servers use LIBSSH2_FX_FILE_ALREADY_EXISTS so add support.
2024-07-04 16:53:07 +07:00
David Steele
edd61636a9
Allow backups to run concurrently on different repositories.
The prior locking only allowed one backup per stanza, which was required by PostgreSQL <= 9.5 and didn't present a problem when only one stanza could be created.

Now that multiple stanzas are allowed relax this restriction so that backups can run concurrently for PostgreSQL > 9.5. To do this, update the locking to be per stanza and repo rather than per stanza. Remotes are not aware of the repos that require locking so send an explicit list of files to be locked to the remote. Also remove the advisory lock for PostgreSQL > 9.5.

For info output the running backups are combined for progress output in order to avoid changing the JSON format. It definitely makes sense to have per repo progress as well but that will be left for a future commit.
2024-07-04 16:22:17 +07:00
David Steele
3a2266f327 Display time option defaults and allowed values with appropriate units.
Similar to size options in 038abaa7, time option defaults and allowed values were displayed in seconds, which could be confusing when the values were large.

The time options were not updated in 038abaa7 because it required removing the ability to do fractional seconds, e.g. 0.5 seconds. In theory this could cause breakage for users but it seems really unlikely. Fractional seconds are used in tests, however, so the tests have been changed to use milliseconds where required, e.g. 500ms.
2024-07-04 15:42:09 +07:00
David Steele
df469471e3 Fix invalid default inherited in job-retry-interval.
This default was being mistakenly inherited from job-retry and would set job-retry-interval to 1 second for archive get and push. In practice this did not matter since archive get and push default to one retry and the first retry interval is always 0, but it still makes sense to fix it to correct the behavior when the value of job-retry is changed.
2024-07-04 09:28:57 +07:00