tuhaihe opened a new issue, #1968:
URL: https://github.com/apache/cloudberry/issues/1968

   ### Apache Cloudberry version
   
   main (89baa48a4f4) — also present in 2.x releases.
   
   ### What happened
   
   On a Rocky Linux 10 cluster (Python 3.12), every invocation of `gpsync` /
   `gpssh` / `gpssh-exkeys` prints `SyntaxWarning` messages to stderr before it
   does any work. It surfaced while installing the Cloudberry backup utilities,
   whose `make install` calls `gpsync` to distribute binaries to the segments:
   
   ```
   $ make install
   cp /home/gpadmin/go/bin/gpbackup ... /usr/local/cloudberry-db/bin
   /usr/local/cloudberry-db/lib/python/gppylib/util/ssh_utils.py:268: 
SyntaxWarning: invalid escape sequence '\ '
     '''Escape occurrences of \ and $ as needed and package the line as an 
"eval" shell command'''
   /usr/local/cloudberry-db/bin/lib/pexpect/pxssh.py:105: SyntaxWarning: 
invalid escape sequence '\['
     self.UNIQUE_PROMPT = "\[PEXPECT\][\$\#] "
   /usr/local/cloudberry-db/bin/lib/pexpect/pxssh.py:109: SyntaxWarning: 
invalid escape sequence '\$'
     self.PROMPT_SET_SH = "PS1='[PEXPECT]\$ '"
   /usr/local/cloudberry-db/bin/lib/pexpect/pxssh.py:110: SyntaxWarning: 
invalid escape sequence '\$'
     self.PROMPT_SET_CSH = "set prompt='[PEXPECT]\$ '"
   Successfully copied gpbackup_helper and gpbackup_s3_plugin to 
/usr/local/cloudberry-db on all segments
   ```
   
   The operation itself succeeds — this is cosmetic — but it makes utility 
output
   noisy and looks like a failure to anyone reading a deployment log.
   
   Why it appears now: string literals such as `"\["` or `"\$"` contain escape
   sequences Python does not recognise. Until 3.11 that was a 
`DeprecationWarning`,
   hidden by default; **Python 3.12 promoted it to a `SyntaxWarning`, which is
   printed** ([What's New in 
3.12](https://docs.python.org/3/whatsnew/3.12.html#other-language-changes)).
   So the same code is quiet on Rocky 8/9 (Python 3.6/3.9) and noisy on Rocky 
10,
   Fedora 40+, and Ubuntu 24.10+. The Python docs also state these sequences
   **will become a `SyntaxError` in a future release**, so this is not purely
   cosmetic in the long run.
   
   Note the warnings can repeat on every run: if `$GPHOME` is root-owned and the
   utility runs as `gpadmin`, CPython cannot write `__pycache__`, so the modules
   are recompiled — and re-warn — each time.
   
   ### What you think should happen instead
   
   `gpsync`/`gpssh` should produce no Python warnings. The literals in question 
are
   regexes and shell snippets that were meant to be raw strings; they should be
   written as such (`r"\[PEXPECT\]..."`), which leaves their value unchanged.
   
   Compiling everything under `gpMgmt/` shows the problem is broader than the 
four
   warnings above — 41 literals in 16 files:
   
   | File | Lines |
   | --- | --- |
   | `gpMgmt/bin/gpload.py` | 720, 2530, 2675, 2689 |
   | `gpMgmt/bin/gpload_test/gpload/TEST.py` | 322 (×2), 329, 331, 333, 335, 
353, 355, 410 |
   | 
`gpMgmt/bin/gppylib/programs/test/unit/test_cluster_clsrecoversegment_triples.py`
 | 297, 304, 332 |
   | `gpMgmt/bin/gppylib/test/unit/test_unit_database_segment_guc.py` | 26 |
   | `gpMgmt/bin/gppylib/test/unit/test_unit_file_segment_guc.py` | 31 |
   | `gpMgmt/bin/gppylib/test/unit/test_unit_gppkg.py` | 72 |
   | `gpMgmt/bin/gppylib/test/unit/test_unit_gpsegrecovery.py` | 304, 333 |
   | `gpMgmt/bin/gppylib/test/unit/test_unit_gpsegsetuprecovery.py` | 262, 287 |
   | `gpMgmt/bin/gppylib/test/unit/test_unit_package.py` | 122 |
   | `gpMgmt/bin/gppylib/util/ssh_utils.py` | 268 |
   | `gpMgmt/bin/lib/pexpect/pxssh.py` | 105, 109, 110 |
   | `gpMgmt/sbin/seg_update_pg_hba.py` | 41 |
   | `gpMgmt/test/behave/mgmt_utils/steps/gpstate_utils.py` | 79 |
   | `gpMgmt/test/behave/mgmt_utils/steps/mgmt_utils.py` | 683, 908, 2007, 
2223, 3346, 3351, 3849, 3980 |
   | `gpMgmt/test/behave/mgmt_utils/steps/replication_slots_utils.py` | 27, 90 |
   | `gpMgmt/test/behave_utils/utils.py` | 682 |
   
   A further 67 literals in 11 files under `src/` and `contrib/` have the same
   problem (`src/backend/gporca/scripts/`, `contrib/try_convert/scripts/`). 
Those
   are developer scripts rather than shipped utilities, so they are lower 
priority.
   
   Two side findings while auditing:
   
   1. `gpMgmt/bin/lib/pexpect` is a vendored copy of **pexpect 3.3** (2013).
      Upstream pexpect made these literals raw years ago; refreshing the 
vendored
      copy — or dropping it in favour of the packaged `pexpect` — would be worth
      considering separately.
   2. `gpMgmt/test/behave/mgmt_utils/steps/replication_slots_utils.py:31` reads
      `export WITH_MIRRORS={with_mirrors} && \A`, in the middle of a run of 
shell
      line continuations. The stray `A` looks like a keystroke slip: the shell
      receives `&& A ./demo_cluster.sh -d && ...` and tries to run a command 
named
      `A`. Pre-existing, unrelated to the encoding of the escape, and probably
      deserves its own fix.
   
   ### How to reproduce
   
   On any host with Python 3.12 or newer (Rocky Linux 10, Fedora 40+,
   Ubuntu 24.10+):
   
   ```
   $ gpsync --help          # or: gpssh --help
   ```
   
   Or without a cluster, straight from a source checkout:
   
   ```
   $ python3 --version
   Python 3.12.4
   $ python3 -W error::SyntaxWarning -m py_compile \
       gpMgmt/bin/gppylib/util/ssh_utils.py gpMgmt/bin/lib/pexpect/pxssh.py
   ```
   
   To enumerate every occurrence in the tree:
   
   ```
   $ python3 - <<'PY'
   import pathlib, warnings
   for p in sorted(pathlib.Path('gpMgmt').rglob('*.py')):
       with warnings.catch_warnings(record=True) as w:
           warnings.simplefilter('always')
           try:
               compile(p.read_text(encoding='utf-8', errors='replace'), str(p), 
'exec')
           except SyntaxError:
               continue
           for i in w:
               if issubclass(i.category, SyntaxWarning):
                   print(f'{p}:{i.lineno}: {i.message}')
   PY
   ```
   
   ### Operating System
   
   Rocky Linux 10 (Python 3.12); reproduced on macOS with Python 3.12.4.
   
   ### Anything else
   
   Happens every time on Python 3.12+, never on Python ≤ 3.11.
   
   Workaround for operators until this is fixed:
   
   ```
   $ PYTHONWARNINGS=ignore::SyntaxWarning make install
   ```
   
   I am preparing a PR that fixes the 41 literals under `gpMgmt/`, with the
   `src/`+`contrib/` remainder as a follow-up.
   
   ### Are you willing to submit PR?
   
   - [x] Yes, I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [x] I agree to follow this project's [Code of 
Conduct](https://github.com/apache/cloudberry/blob/main/CODE_OF_CONDUCT.md).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to