Phase 1: 실동작 Enduro/X + PostgreSQL XA 매입 슬라이스

- Enduro/X 7.0.12 소스빌드 이미지(-DENABLE_POSTGRES=ON, libndrxxaecpg XA 스위치)
- docker-compose: postgres(max_prepared_transactions=100) + endurox app
- ECPG XA 서비스 3종: ACQUIRE→RECONCILE→SETTLE (tpservice + EXEC SQL)
- 클라이언트 tpbegin/tpcall체인/tpcommit → tmsrv 2PC(prepare/commit) 원자 커밋
- 검증: 서비스 AVAIL, 커밋 row(status=S) psql 확인, 롤백 시 무잔존, pg_prepared_xacts=0
- 규명된 런타임 요건: sysctl fs.mqueue.*, ulimit msgqueue/nofile, XA open-str JSON
- docs/architecture.md, README, service-catalog 설계

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
forge-bot 2026-07-19 09:16:12 +00:00
commit e6e29e6b5d
19 changed files with 1005 additions and 0 deletions

55
app/conf/ndrxconfig.xml Normal file
View file

@ -0,0 +1,55 @@
<?xml version="1.0" ?>
<endurox>
<appconfig>
<sanity>1</sanity>
<brrefresh>5</brrefresh>
<restart_min>1</restart_min>
<restart_step>1</restart_step>
<restart_max>5</restart_max>
<restart_to_check>20</restart_to_check>
<gather_pq_stats>Y</gather_pq_stats>
</appconfig>
<defaults>
<min>1</min>
<max>1</max>
<autokill>1</autokill>
<start_max>20</start_max>
<pingtime>100</pingtime>
<ping_max>800</ping_max>
<end_max>30</end_max>
<killtime>1</killtime>
</defaults>
<servers>
<!-- XA transaction manager for RM1 = the ECPG/PostgreSQL resource.
XA env (NDRX_XA_*) is inherited from the shell (see setapp.sh). -->
<server name="tmsrv">
<srvid>40</srvid>
<min>1</min>
<max>1</max>
<sysopt>-e ${NDRX_APPHOME}/log/tmsrv-rm1.log -r -- -t1 -l${NDRX_APPHOME}/tmlogs/rm1 -m10</sysopt>
</server>
<!-- The three ECPG XA services. Separate binaries so the in-chain
tpcall()s (ACQUIRE->RECONCILE->SETTLE) hit distinct server
processes (avoids single-server self-call deadlock) while sharing
one global transaction across their DB branches. -->
<server name="acqacquire">
<srvid>100</srvid>
<min>1</min>
<max>1</max>
<sysopt>-e ${NDRX_APPHOME}/log/acqacquire.log -r</sysopt>
</server>
<server name="acqreconcile">
<srvid>110</srvid>
<min>1</min>
<max>1</max>
<sysopt>-e ${NDRX_APPHOME}/log/acqreconcile.log -r</sysopt>
</server>
<server name="acqsettle">
<srvid>120</srvid>
<min>1</min>
<max>1</max>
<sysopt>-e ${NDRX_APPHOME}/log/acqsettle.log -r</sysopt>
</server>
</servers>
</endurox>