1. Nov 21, 2023
  2. Nov 20, 2023
  3. Nov 09, 2023
  4. Nov 08, 2023
    • Shubham Dhama's avatar
      Improve migration speed by using same connection in a LOB worker. (#533) · 385ee3d5
      Shubham Dhama authored
      Presently, each LOB worker creates a new connection for every object copy,
      impacting migration performance, especially with a large number of objects.
      The fix here is simple: use the same connection within each worker.
      
      However, while doing so, we encountered an unexpected error:
      
      `BUG: call to pgsql_commit() without holding an open multi statement
      connection`
      
      Upon investigation, we discovered that the `connectionStatementType` was
      set to an unusual value of 32767. In GDB, it was
      (PGSQL_CONNECTION_MULTI_STATEMENT | unknown: 32766). This happens only
      after the call of `msgrcv` function. There are a few theories; one suggests
      that because both `msg` and `dst` are on the stack, `msgrcv` is overwriting
      `dst` data when it should only change `msg`. Despite having
      `-fstack-protector` enabled, we did not observe a "stack smashing detected"
      error, so maybe this theory is incorrect.
      
      In any case, moving `msg` to the heap seemed to resolve the issue. However,
      it's important to fully understand this problem, as it may have
      implications in other areas of the code as well.
      385ee3d5
  5. Nov 07, 2023
  6. 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
  7. 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
  8. Nov 02, 2023
  9. Oct 30, 2023
  10. Oct 26, 2023
  11. 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
  12. Oct 16, 2023
  13. 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
  14. 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
  15. 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
  16. Oct 03, 2023
  17. Sep 29, 2023
  18. Sep 25, 2023