1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-14 10:13:05 +02:00
Commit Graph

4473 Commits

Author SHA1 Message Date
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
David Steele
8b82641d87 Shorten enums used in parse.auto.c.inc.
Rather than using the full enum just use the part of the enum that is unique. This makes the output a bit more readable by removing the repetitive elements. The prefix for each enum is built into its macro.
2024-07-01 11:15:14 +08:00
David Steele
cfd4fb2c7d Remove PARSE_RULE_OPTION_GROUP_MEMBER() macro from parse.auto.c.inc.
It is simpler to just set group = true in the PARSE_RULE_OPTION_GROUP_ID(), so do that.
2024-06-30 16:11:11 +08:00
David Steele
7d54073094
Default log-level-stderr option to off.
Writing warnings and errors to stderr by default leads to error messages being lost when the user does not correctly redirect stderr while generating logs for analysis. This happens so often that it seems worth changing the default to increase the quality of the logs we receive.

If the user has explicitly set log-level-stderr then there is no change in behavior.
2024-06-25 16:45:47 +08:00
David Steele
1094aecab5 Require compiler support for __builtin_clzl() and __builtin_bswap64().
These functions will be useful for optimizing varint-128 functions.

Require them in the meson build before adding new code in case there are problems with packaging.
2024-06-25 16:16:55 +08:00
David Steele
0c32757fd9 Require the lz4 library in the meson build.
We would like to use lz4 for protocol compression instead of gz but first we need to make sure this is not going to cause a problem for packaging.

To do this make lz4 required in meson but make no changes to the code so this is an easy revert for packagers if there is an issue.
2024-06-25 16:04:02 +08:00
David Steele
acb9b6ccbe Increase width of unsigned integration in performance/type module.
The prior int was too small to scale up as much as we need for performance testing.
2024-06-25 15:54:57 +08:00
David Steele
6495a46ca3 Fix --run and --scale options for unit tests.
These were broken while code was being migrated to C and went unnoticed because the options are generally only used when doing performance testing.

The C code can only take one --run param so add a check for that in test.pl.
2024-06-25 15:46:07 +08:00
David Steele
cfb8aa202e Add remote locks for stanza commands missed in 31c7824a.
31c7824a should have added remote locks when the commands were modified to run remotely. This is unlikely to have caused issues since these commands are generally not run concurrently with backup/expire but having the locks is safer.
2024-06-21 13:29:17 +08:00
David Steele
b9a9ef2d5f Clarify when code generation is run when modifying config.yaml.
The contributing guide indicated that this happened at compile time but in fact it happens when test.pl is run.
2024-06-21 11:17:42 +08:00
David Steele
bcda7f8c7e Optimize assignment of command/option rules.
Assign the rule to a local variable to make subsequent assignments more efficient.

Also fix a missing const.
2024-06-20 13:06:04 +08:00
David Steele
a0a5f2300c Replace strftime() with cvtTimeToZP() and strNew/CatTimeP().
These functions produce cleaner code and hide implementation details.
2024-06-19 10:33:46 +08:00
David Steele
cec486b6dd Refactor backup to use flag for backup standby state rather than option.
Using the option adds a bit of complexity -- it is simpler just to use the state of the standby object to determine if backup from standby is enabled.
2024-06-18 11:42:59 +08:00
David Steele
270dce41b6
Refactor lock module.
Refactor the lock module to split command-specific logic from the basic file locking functionality. Command specific logic is now in command/lock.c. This will make it easier to implement new features such as repository locking and updating lock file contents on remotes.

This implementation is essentially a drop-in replacement but there are a few differences. First, the lock names no longer require a path (the path is added in the lock module). Second, the timeout functionality has been removed since it was not being used.
2024-06-18 10:43:54 +08:00
David Steele
ad7377c75b
Fix issue with files larger on the replica than on the primary.
If a file on the primary was larger than on the replica then the next diff/incr backup would store the primary size instead of the replica size when block incremental was enabled. On the next diff/incr backup this would lead to a repo size must be > 0 for file error when validating the manifest.

Fix this by limiting copy based on sizeOriginal rather than size so size can be set to the value expected to be stored in the manifest. As a bonus sizePrior is no longer needed since size can be used for the same purpose.
2024-06-16 11:55:04 +08:00
David Steele
2ec99ca4d9 Specify test images that get valgrind installed.
This means valgrind is no longer built from source, which caused image builds to run for a very long time.

Valgrind is only required in a few images for testing.
2024-06-12 16:08:17 +10:00
David Steele
886bb281f6 Migrate CentOS 7 integration tests to Rocky 8.
CentOS 7 will be EOL on June 30 and since there is no CentOS 8 migrate instead to Rocky 8.
2024-06-11 15:20:04 +10:00
Viktor Kurilko
4ac3b82c99 Allow alternative WAL segment sizes for PostgreSQL <= 10.
Alternative WAL segment sizes can be configured in PostgreSQL <= 10 with compile-time options. We have not allowed these before since it was not a well-tested feature of PostgreSQL.

However, forks such as Greenplum allow alternative WAL segment sizes at initdb time (which are presumably well-tested) so it makes sense to allow it.

Since the PostgreSQL versions in question are all EOL it is not important to have this restriction in place anymore.
2024-06-11 12:08:52 +10:00
David Steele
e8b965756c Add unit tests for backup from standby with block incremental.
These tests are important for an upcoming bug fix related to differing sizes of a file on a primary vs standby.

The test that demonstrates the bug cannot be included here since it causes a test failure, but this commit introduces the infrastructure and one test to guard against a regression in the bug fix.
2024-06-09 11:39:58 +10:00
David Steele
cf478bc753 Improve efficiency of incremental manifest build.
Move the file.copy check before the manifest lookup to save a lookup and (probably) find for zero-length files when bundling.

This also removes a layer of indentation which helps with readability.
2024-06-08 13:00:53 +10:00
David Steele
48823b6cd3 Simplify lock file scanning in stop command.
This simpler implementation only requires that a lock file begin with the stanza (followed by a dash) and end in .lock.

This will make the implementation more resilient to planned changes in lock file naming.
2024-06-07 14:24:08 +10:00
David Steele
ea1596152c Avoid possible race condition while reading lock files in info command.
Since lockRead() was being called twice the state of the lock file could change between leading to invalid data in the info output.

Instead call lockRead() once and use the result for both the validity test and output.
2024-06-07 14:09:17 +10:00
David Steele
01838995ce Replace tabs with spaces in meson.build files.
These were probably copied over from Makefile.in.
2024-06-07 09:21:13 +10:00
David Steele
6f562fba60 Migrate coverage testing to C and remove dependency on lcov.
lcov does not seem to be very well maintained and is often not compatible with the version of gcc it ships with until a few months after a new distro is released. In any case, lcov is that not useful for us because it generates reports on all coverage while we are mainly interested in missing coverage during development.

Instead use the JSON output generated by gcov to generate our minimal coverage report and metrics for the documentation.

There are some slight differences in the metrics. The difference in the common module was due to a bug in the old code -- build/common was being added into common as well as being reported separately. The source of the two additional branches in the backup module is unknown but almost certainly down to how exclusions are processed with regular expressions. Since there is additional coverage rather than coverage missing this seems fine.

Since this was pretty much a rewrite it was also a good time to migrate to C.
2024-05-31 14:52:07 +10:00
David Steele
49e252f492 Begin v2.53 development. 2024-05-27 11:49:21 +10:00
David Steele
dfc14b1934 v2.52: PostgreSQL 17 support
NOTE TO PACKAGERS: The build system for pgBackRest is now meson. The autoconf/make build will not receive any new features and will be removed after a few releases.

Features:

* Add GCS batch delete support. (Reviewed by Reid Thompson.)
* S3 SSE-C encryption support. (Reviewed by Tim Jones. Suggested by Tim Jones.)
* PostgreSQL 17 support. (Reviewed by Stefan Fercot.)

Improvements:

* Allow explicit disabling of optional dependencies in meson builds. (Contributed by Michael Schout. Reviewed by David Steele.)
* Dynamically find python in meson build. (Contributed by Michael Schout. Reviewed by David Steele.)
* Tag pgbackrest build target in meson as installable. (Contributed by Bradford Boyle. Reviewed by David Steele.)

Documentation Improvements:

* Update start/stop documentation to reflect actual functionality. (Reviewed by Stefan Fercot.)
2024-05-27 11:13:16 +10:00
David Steele
899b892788 New CI container build for PostgreSQL 17 beta1.
Update the catalog version for beta 1 so pgbackrest will not work with any prior development versions.

Also improve the integration/all test so the catalog version does not need to be updated again during the beta period.
2024-05-24 12:24:11 +10:00
David Steele
c401ae8fb8 Explicitly run test servers on ipv4 localhost.
If a host defaults to ipv6 then it can confuse the tests and lead to connection failures and inconsistent error messages.

For now just hard-code the servers to run on ipv4 but this is an area for later improvement.
2024-05-23 11:03:59 +10:00
David Steele
04b0437976 Exclude documentation code coverage from metrics report.
Coverage of the documentation code is not important enough to report to users. If it were reported it should be in a separate section (along with test code coverage).
2024-05-23 10:58:52 +10:00
David Steele
91156bf7e1 Fix comment typos and formatting. 2024-05-23 08:19:50 +10:00
David Steele
b6ac11beec
Update start/stop documentation to reflect actual functionality.
The exact functionality of start/stop has evolved over time and has become a bit confusing. It may be appropriate to make the behavior more consistent but for now at least document the behavior correctly. The documentation for start/stop was fairly inaccurate.
2024-05-23 08:17:02 +10:00
David Steele
9910a4eddb Add hrnTzSet() to set timezone in tests.
3c8819e1 replaced gmtime/localtime with gmtime_r/localtime_r but did not take into account a subtle difference in how they operate. While gmtime/localtime operate as if tzset() has been called, i.e. they operate on the TZ env variable directly, gmtime_r/localtime_r require tzset() to be called after changing TZ for consistent results.

Rather than call tzset() every time TZ is changed, add hrnTzSet() to encapsulate both operations.
2024-05-20 08:44:37 +10:00
David Steele
28ad1badd9 Update Fedora test image to Fedora 40. 2024-05-18 18:55:53 +10:00
David Steele
ffe9a17fcb Replace erroneous THROW_SYS_ERROR_FMT() in storageInfo().
This was copied from storagePosixInfo() in a474ba54 but there is no guarantee that errno will be valid at this point. In most cases errno was zero so no system error message was displayed, but when using the Posix driver it could output "[2] No such file or directory". For other drivers errno was generally not set but could output a random error message in that case that errno was set by some unrelated action.

Use THROW_FMT() instead since errno will not always be set correctly and in any case "[2] No such file or directory" is not very useful information since the main error message already says that.

While this is technically a bug it is so harmless that it doesn't merit mention in the release notes.

This was discovered while testing on Fedora 40 which threw "[38] Function not implemented" -- clearly unrelated to missing paths/files.
2024-05-18 14:33:40 +10:00
David Steele
9e477c4321 Update GitHub test checkout and codeql action versions.
checkout@v3, codeql-action/init@v2, and codeql-action/analyze@v3 are now deprecated.
2024-05-18 09:59:32 +10:00
David Steele
db4eefae1a Remove ASSERT() in sckClientOpen() to silence Coverity complaint.
Coverity complains that this comparison might have a side effect because the variable is volatile. It's hard to see what that might be but since the assertion is not all that important, just remove it. During testing this sort of error will generally be caught by valgrind.
2024-05-10 10:01:16 +09:30
David Steele
d32eb5bb54 Silence invalid Coverity complaint in jsonReadPush().
Coverity complains that the output from THROW_FMT will be unpredictable since the order of operations in the call is not deterministic, but it fails to understand that subsequent calls to jsonReadTypeNextIgnoreComma() are noops until the value has been processed.

Silence Coverity by assigning the actual type to a local variable so jsonReadTypeNextIgnoreComma() is only called once.

Also fix an adjacent comment typo.
2024-05-10 09:45:01 +09:30