1. Nov 07, 2023
    • Dimitri Fontaine's avatar
    • Leslie-Alexandre DENIS's avatar
      feat(container): multi arch build (#480) · 3fda744f
      Leslie-Alexandre DENIS authored
      
      
      * feat(container): multi arch build
      * fix(container): copy whole repo for the build step; add label for gh pkg
      
      Co-authored-by: default avatarDimitri Fontaine <dim@tapoueh.org>
      3fda744f
    • Shubham Dhama's avatar
      Improve and fix connection timeout and total retry timeout. (#528) · 91fe82e0
      Shubham Dhama authored
      Previously, when a connection timeout occurred with the default connection
      timeout set to pgconnect_timeout (10 seconds), there were no retries. This
      was because the total retry timeout (maxT) passed to `pgsql_set_retry_policy`
      in `pgsql_set_interactive_retry_policy` was also set to pgconnect_timeout,
      which had already elapsed during the initial connection attempt.
      
      To address this issue, the maxT value has been updated to
      POSTGRES_PING_RETRY_TIMEOUT. This change also means that maxT cannot be
      configured by altering PGCONNECT_TIMEOUT. If one wants to configure maxT
      they can change the values in defaults.h or we can make it configurable
      through some environment variable in future.
      
      After all this change `pgconnect_timeout` seems redundant so removed it.
      91fe82e0
  2. Nov 06, 2023
    • Dimitri Fontaine's avatar
      Update pgcopydb sentinel in the main follow process. (#521) · 2a1c7788
      Dimitri Fontaine authored
      * Update pgcopydb sentinel in the main follow process.
      
      To avoid infinite looping when endpos has been reached it's important to
      update our endpos value to the sentinel's one even in the main follow
      process.
      
      In passing, review some error messages.
      
      Also refrain from stopping early from reading data from a PIPE when a
      terminating signal is received, we should finish reading as per the comments
      in the code.
      
      * Process ENDPOS in transform and replay processes.
      
      When the ENDPOS internal message is received from the PIPEs in replay mode,
      check the current sentinel.endpos value on the source database to make sure
      the ENDPOS message matches with the current setting, and that being the case
      stop processing.
      2a1c7788
    • Arunprasad Rajkumar's avatar
      Remove the usage of txn metadata file (#525) · 86e7de42
      Arunprasad Rajkumar authored
      
      
      This commit removes the usage of transaction metadata file. Initially, it was used by the apply process to bypass transactions that were already applied. However, this approach had its challenges. Specifically, in live replay mode, a transaction with numerous statements could fill the UNIX PIPE (an IPC primitive used in replay mode), leading to a potential deadlock. This is because the apply process would be waiting for the transaction metadata file.
      
      By eliminating the transaction metadata file, the apply process lets the transaction proceed and decides whether to apply or skip it based on the commit LSN during the commit phase.
      
      Signed-off-by: default avatarArunprasad Rajkumar <ar.arunprasad@gmail.com>
      86e7de42
  3. Nov 03, 2023
    • Andreas Loibl's avatar
      fix password handling in safeURI (#522) · 44d6fdff
      Andreas Loibl authored
      * remove PGPASSWORD environment processing from pgsql.c
      
      instead use `pgsql->connectionString` containing the password
      and adjust related function comments and removed unused PASSWORD_MASK
      
      * fix mismatched safe{Source,Target}PGURI.password references
      44d6fdff
    • Kirk Wolak's avatar
      Update README.md (One Typo Fixed) (#527) · f80ee851
      Kirk Wolak authored
      Apologies for such a small edit.
      Always leave things better than you found them!
      f80ee851
  4. Nov 02, 2023
  5. Oct 30, 2023
  6. Oct 26, 2023
  7. Oct 20, 2023
    • Dimitri Fontaine's avatar
      Review logical decoding client tracking of LSNs. (#502) · a3a577cf
      Dimitri Fontaine authored
      * Review logical decoding client tracking of LSNs.
      
      When replaying from file, ensure that the last transaction of a file is
      commited with synchronous_commit on, allowing better tracking of replication
      progress.
      
      Also, improve our way to keep track of the previousLSN and log when we reach
      endpos (KEEPALIVE, COMMIT, ENDPOS) to help get a sense of what's happening.
      
      By setting previousLSN to the proper value even when reaching endpos at a
      KEEPALIVE message that we skip, we allow the overall system to exit properly
      in case when there is no activity on the source server.
      
      * Enhance clean_results() to avoid blocking calls to PQgetResult().
      
      In a debug session with gdb, now enabled in our docker-compose setup, it was
      apparent that a process would block on a PQgetResult() call done in the
      context of clear_results() when an error would happen during the logical
      replication streaming.
      
      Fix both the clear_results() behavior and also refrain from calling it on
      the error path, just finish the connection without trying to get possibly
      pending results that we're not going to need anyway.
      
      * Review process startup init and setting of endpos / --endpos.
      
      When the command line option is used, we should not take the value that is
      fetched from the source pgcopydb.sentinel table. Also protect some processes
      against having already reached endpos at startup time.
      
      In passing, try to test for Broken PIPE upon connection retries. Testing is
      not conclusive on that parts, but it seems harmless.
      
      * Properly reset stdIn and stdOut booleans to false when needed.
      
      Now that we have pro-active actions implemented to check if the PIPE might
      be broken we need to pay attention to these variables.
      
      Also in passing have the catchup process between follow loops happen in
      sub-processes too. That way the process model stays the same even in that
      area of the code: the actual processing is done by sub-processes.
      
      * Review Dockerfiles: replace psutils with psmisc.
      
      psutils: PostScript document handling utilities
      psmisc: utilities that use the proc file system (including pstree)
      
      also add htop which is useful at displaying a process tree
      a3a577cf
  8. Oct 16, 2023
  9. Oct 13, 2023
    • Hanefi Onaldi's avatar
      Fix various issues with docs (#494) · 243ca7d8
      Hanefi Onaldi authored
      * Fix typo: ther -> the
      
      * Consistent casing in help messages
      
      * Update versions in docs to latest
      
      * Consistent forked process names in design docs
      
      * Update package list in rockylinux
      
      * Fix indentation in pgcopydb help message
      
      * Fix typo: Create and exports -> Create and export
      
      * Update some version outputs
      
      * Fix typo
      
      * Update version output using official docker image
      243ca7d8
    • Arunprasad Rajkumar's avatar
      Fix data loss when reading large transaction bodies (#495) · 120d3e0c
      Arunprasad Rajkumar authored
      
      
      The `read_from_stream` function in pgcopydb was encountering a data loss issue
      when reading from a source system with transaction bodies containing more than
      1024 inserts. The problem arose from the statically allocated array of size 1024
      used to split lines within the function. When the buffer held more than 1024
      lines, it caused subsequent lines to be ignored, resulting in data loss.
      
      To resolve this issue, this commit introduces the following changes:
      - We now count the number of lines in the buffer before splitting them.
      - Dynamically allocate an array to hold the split lines, based on the line count.
      
      Signed-off-by: default avatarArunprasad Rajkumar <ar.arunprasad@gmail.com>
      120d3e0c
  10. Oct 12, 2023
    • Hanefi Onaldi's avatar
      Ensure transactions are not read only by default (#490) · b1a0bcfe
      Hanefi Onaldi authored
      This change will make sure that pgcopydb can write to the database even
      if the user has set the default_transaction_read_only GUC.
      b1a0bcfe
    • Hanefi Onaldi's avatar
      Fix test runs for outside contributors · 718f9c74
      Hanefi Onaldi authored
      When an outside contributor submits a PR, the test runs fail because
      they have the commits on a fork, and there is no easy way to get the
      commits from the fork into the main repository. This change makes the
      test runs work for outside contributors by always checking out the SHA
      for the event.
      
      We no longer need to have separate steps for PRs and non-PRs as
      checkout@v3 has sane defaults for both. Below is an excerpt from the
      docs of this action that explains the behavior of ref values:
      
        The branch, tag or SHA to checkout. When checking out the repository
        that triggered a workflow, this defaults to the reference or SHA for
        that event. Otherwise, uses the default branch.
      718f9c74
    • Dimitri Fontaine's avatar
      Switch to using libpq async API. (#488) · a701e78b
      Dimitri Fontaine authored
      * Switch to using libpq async API.
      
      The easy to use API PQexec() and PQexecParams() are blocking, which means
      those functions could fail to detect when a Postgres connection has been
      lost, and now wait an indefinite amount of time.
      
      Switch to using the async API PQsendQuery() or PQsendQueryParams() with the
      PQgetResult() function, all with some lower-level socket API calls such as
      select(2) and PQconsumeInput() and PQisBusy().
      
      Note that when the server is no longer busy computing the result, we should
      loop over all the available results... apparently.
      
      * Code cleanup, add another check for interrupts.
      
      * Remove extra check for interrupts.
      a701e78b
    • Dimitri Fontaine's avatar
      Add support for database properties. (#491) · cc702401
      Dimitri Fontaine authored
      The Postgres tooling for configuration variable settings that are specific
      to a database is only activated when pg_restore --create is used, which
      means that pg_restore is in charge of CREATE DATABASE.
      
      In the context of pgcopydb, we do not want pg_restore to create the target
      database for us, but we still want to copy over the database specific
      settings that have been applied with either of the following commands:
      
          ALTER DATABASE SET
          ALTER ROLE IN DATABASE SET
      
      To achieve that we need to copy some code from the pg_dump and pg_restore
      implementation and along with it we also vendor-in some of the Postgres
      common code (a part of string_utils.c) to avoid link-time issues on
      different packaging systems.
      cc702401
  11. Oct 05, 2023
    • Dimitri Fontaine's avatar
      Improve error handling when COPY fails. (#485) · cd83ed69
      Dimitri Fontaine authored
      * Improve error handling when COPY fails.
      
      In the normal case we want the COPY process to continue with the rest of the
      tables in the queue, and in the fail-fast case we want to bubble-up the
      problem as fast as possible for a quick total failure.
      
      The partial failure in the normal case can be resumed with the existing
      option such as --resume, as long as the snapshot still is held, or when
      using the option --not-consistent.
      
      Also, ensure that when errors happen mid-flight in the COPY processes we
      still send the STOP messages in the queues, or signal all the other
      processes to terminate.
      
      * Also review error handling for vacuum/create index queues.
      cd83ed69
  12. Oct 03, 2023
  13. Sep 29, 2023
  14. Sep 25, 2023
    • Cristian R. Silva's avatar
      Fixing PING documentation (#476) · 9e99a74c
      Cristian R. Silva authored
      9e99a74c
    • Dimitri Fontaine's avatar
      Add tests coverage for Postgres 16. (#478) · 10cd0a72
      Dimitri Fontaine authored
      * Add tests coverage for Postgres 16.
      
      * Fix GitHub Actions workflow file.
      10cd0a72
    • Dimitri Fontaine's avatar
      Rewrite the ad-hoc parser for Postgres Archive TOC items. (#469) · af1c231a
      Dimitri Fontaine authored
      * Rewrite the ad-hoc parser for Postgres Archive TOC items.
      
      This time use a tokenizer and hand-roll a grammar/parser on-top of it,
      expecting tokens in the right order. We have a pretty simple grammar at the
      moment, because we don't extend the support to the ACL and COMMENT composite
      types. We might want to do that later.
      
      * Reformat parsing of ACL and COMMENTS too.
      
      * Free allocated memory for parsing pg_restore archive catalogs.
      
      * Fix rebase.
      
      * Protect against NULL pointer dereferencing.
      
      * Fix string size compute bug (include 2 bytes for prefix).
      af1c231a
  15. Sep 22, 2023
  16. Sep 19, 2023
  17. Sep 13, 2023
  18. Sep 12, 2023
    • Dimitri Fontaine's avatar
      Fix SQL identifier quoting, generalize using format %I. (#464) · 3091b456
      Dimitri Fontaine authored
      Using the Postgres function format with the %I formatter allows our code to
      bypass any formatting internally when re-using the SQL object names, both in
      our logs and also in the SQL queries we then emit.
      
      Generalize that approach to attribute names, index names, index table names,
      index constraint names, and sequences names.
      3091b456
  19. Sep 07, 2023
    • Dimitri Fontaine's avatar
      Fix error handling of fork() calls. (#459) · 6bc29fc8
      Dimitri Fontaine authored
      When failing to start a sub-process (out-of-memory can be reported when
      calling the fork() system call), properly handle the error rather than
      continue trying the migration.
      
      In order to cancel the other sub-processes that were succesfully started we
      then send a TERM signal to all processes in our process group.
      6bc29fc8
  20. Sep 06, 2023
  21. Sep 05, 2023
  22. Sep 04, 2023