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

43
docker/docker-compose.yml Normal file
View file

@ -0,0 +1,43 @@
name: acquire-core-x
services:
db:
image: postgres:15
environment:
POSTGRES_DB: acq
POSTGRES_USER: acq
POSTGRES_PASSWORD: acq
# XA / 2-phase commit needs prepared transactions enabled.
command: ["-c", "max_prepared_transactions=100"]
volumes:
- ../db/schema.sql:/docker-entrypoint-initdb.d/10-schema.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U acq -d acq"]
interval: 3s
timeout: 3s
retries: 20
networks:
- acqnet
app:
image: acquire-x/endurox:7.0.12
depends_on:
db:
condition: service_healthy
# Enduro/X posix-mqueue runtime requirements (ndrxd won't boot otherwise).
sysctls:
fs.mqueue.msg_max: "512"
fs.mqueue.msgsize_max: "65536"
ulimits:
msgqueue: 536870912
nofile: 65536
volumes:
- ../app:/app
working_dir: /app
entrypoint: ["/bin/bash", "/app/entrypoint.sh"]
networks:
- acqnet
networks:
acqnet:
driver: bridge