jetstream-api 0.22.1__tar.gz → 0.23.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/PKG-INFO +40 -2
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/README.md +39 -1
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/__init__.py +1 -1
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/admin.py +159 -6
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/common.py +6 -12
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/exception.py +4 -1
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/properties.py +7136 -7397
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/PKG-INFO +40 -2
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/pyproject.toml +1 -1
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/LICENSE.txt +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_codec.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_consumer.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_groupwire.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_propv2.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_qleader.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_throttle.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/admintopic.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/connectivity.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/msg.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/partitioner.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/pattern.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/producer.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/py.typed +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/qmgr.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/topic.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/util.py +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/SOURCES.txt +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/dependency_links.txt +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/requires.txt +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/top_level.txt +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/setup.cfg +0 -0
- {jetstream_api-0.22.1 → jetstream_api-0.23.0}/tests/test_example.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jetstream-api
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.23.0
|
|
4
4
|
Summary: Python client API for iLink M.O.M. (Message Oriented Middleware)
|
|
5
5
|
Author: snowjeans
|
|
6
6
|
License: Boost Software License - Version 1.0 - August 17th, 2003
|
|
@@ -60,12 +60,50 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
|
|
|
60
60
|
## 설치 방법
|
|
61
61
|
pip install jetstream-api
|
|
62
62
|
|
|
63
|
+
## 0.23.0 변경 - 큐 속성 Property v2(JSON) · 채널 STANDBY (자바 v2.19.0 와 같음, 짝 엔진 = Property v2 P3 판 이상)
|
|
64
|
+
|
|
65
|
+
- **큐 관리가 엔진 7 과 JSON(Property v2) 으로 오간다**(엔진 P3). 함수 이름은 그대로 - ``createQueue`` · ``setQueueProperty`` ·
|
|
66
|
+
``getQueueProperty`` (종류별 포함) · ``getQueueList`` (종류별 · 요약 포함) · ``removeQueue`` 가 상대가 7 이면 JSON, 6.x 면 기존 고정폭 블롭이다.
|
|
67
|
+
☠ **P3 전 7.x 엔진(7.0.1.3604 이하)에는 큐 관리가 거절된다** - 판 혼재는 지원하지 않는다(엔진 · 클라 · 하네스를 함께 올린다).
|
|
68
|
+
- ``setQueueProperty`` 는 엔진 7 에 **세터 · 대입으로 바꾼 칸만** 보낸다. 새로 만든 객체로 일부만 바꿔도 다른 칸을 덮지 않는다
|
|
69
|
+
(옛 블롭은 전체 교체였다). 바꾼 것이 없으면 보내지 않는다.
|
|
70
|
+
- 더함: ``createQueueWithResult`` · ``setQueuePropertyWithResult`` · ``removeQueueWithResult`` (``ILPropertyResult``, 6.x 엔진이면 빈 결과),
|
|
71
|
+
``ILQueueProperty.description`` (큐 설명, 200바이트, 생성 전용, 엔진 7 에서만).
|
|
72
|
+
- ``leaderGroup`` 은 JSON 으로만 오간다 - 고정폭 블롭은 6.3.4 레이아웃으로 되돌아갔다(LG 칸 없음).
|
|
73
|
+
- ``incomingDelayDepth`` · ``incomingDelay`` 의 ``0`` 은 유효한 값이다(문서 범위 고침). 세그먼트 수 · 공유 메모리 크기는 생성 전용 -
|
|
74
|
+
바꿔 보내면 ``MIMQE_IMMUTABLE_PROPERTY (SEGMENTS fixed at <n>)`` 로 거절된다.
|
|
75
|
+
- 종류별 조회(``getLocalQueueProperty`` 등)는 종류가 다르면 ``MIMQE_OBJECT_NOT_FOUND (<큐> : TYPE_NOT_MATCHED)`` (옛 엔진과 같은 사유).
|
|
76
|
+
- 채널: ``ILChannelStatus.STANDBY = 5`` (리더에서만 일하는 채널이 팔로워에서 대기). 이 값을 모르는 옛 클라는 STANDBY 채널이 섞인
|
|
77
|
+
채널 조회 · 목록이 실패한다. ``startChannelWithStatus`` 는 STANDBY · 오류(``"EXCEPTION"``)에서 기다리지 않고 곧바로 돌아온다
|
|
78
|
+
(전에는 오류에서 시한까지 기다렸다).
|
|
79
|
+
- 없앰: ``ILC.MIMQ_COORD_OBSERVER`` ("O") - ``getReplicationStatus`` 의 3370 arg1 은 빈칸이다(엔진이 r3486 부터 읽지 않는다).
|
|
80
|
+
- 예외 문구에 Property v2 본문 규칙 위반의 원인을 붙인다(전에는 ``MIMQE_INTERNAL_ERROR`` 만 보였다).
|
|
81
|
+
- 알려진 엔진 결함(P3 이전부터, 엔진에서 별건): 큐를 한 번 변경하면 그 뒤 ``setQueueTrace`` 결과가 조회에 안 보인다 -
|
|
82
|
+
트레이스는 ``setQueueProperty`` 로 바꾼다.
|
|
83
|
+
|
|
84
|
+
## 0.22.3 변경 - 옛 클러스터 블롭 코덱 · actingCoordinator 제거, servicePorts (자바 v2.18.3 와 같음, 짝 엔진 7.0.1.3603 이상 권장)
|
|
85
|
+
|
|
86
|
+
0.22.2 는 시험 판(test.pypi)만 내고 버렸다 - actingCoordinator 제거를 묶어 0.22.3 으로 나간다.
|
|
87
|
+
|
|
88
|
+
- **없앰**(호환 깨짐): 옛 고정폭 클러스터 블롭 코덱 - ``ILClusterProperty(bytes)`` · ``ba=`` · ``get_serialized`` · ``get_serialized_length`` ·
|
|
89
|
+
``LAYOUT_MARK``, ``ILClusterNode(bytes)`` · ``ba=`` · ``base=`` · ``get_serialized``, 모듈 ``CLUSTER_LAYOUT_MARK``,
|
|
90
|
+
``ILC.MIMQ_VO_CLUSTER_LEN`` / ``MIMQ_VO_CLUSTER_NODE_LEN``. 바이트를 주면 ``TypeError``. 엔진 r3601 이 그 형식을 지웠고 0.22.0 부터
|
|
91
|
+
JSON(Property v2)으로만 주고받아 쓰는 경로가 없었다. 능력 선언 ``clsblob=2`` 는 그대로.
|
|
92
|
+
- **없앰**(호환 깨짐): ``ILClusterProperty.actingCoordinator`` · ``get_acting_coordinator`` / ``getActingCoordinator`` - 0.18.1 부터 폐기 예정,
|
|
93
|
+
엔진 7.0.1.3484 부터 늘 ``None`` 이던 관측 칸이다(엔진 r3604 도 걷음). ``controllerLeader`` 를 읽는다 - 옛 이름으로 부르면 그렇게 안내한다.
|
|
94
|
+
- **더함**: ``ILClusterProperty.servicePorts`` / ``getServicePorts()`` (읽기 전용) - 응답한 서비스가 맡은 컨트롤러(ilcc) 자리의 포트 전부
|
|
95
|
+
(엔진 ``PORT`` "a,b", 맡은 자리가 없으면 빈 목록). 컨트롤러가 멈춰 있어도 나온다 - 지금 듣는 포트는 ``localCtrlPort``.
|
|
96
|
+
- 노드 ``status`` · ``nodeUuid`` · ``defTerm`` · ``defVersion`` 은 이름만 남는다(엔진 r3601 부터 와이어에 없어 늘 빈 값) - 문서를 고침.
|
|
97
|
+
- 문서 정정: 팔로워 거절 ``MIMQE_OPERATION_DENIED (STANDBY)`` 는 **토픽**의 생성 · 변경 · 삭제만이다(쿼터 · 디스크 가드 · 클러스터에는 없다).
|
|
98
|
+
- 엔진 r3603: 클러스터 서명(``signature``) 값의 재료가 정의의 공유 칸 전부로 넓어져 값이 바뀐다(키 · 형식 그대로, 클라 변경 없음).
|
|
99
|
+
|
|
63
100
|
## 0.22.1 변경 - 노드 추가 결과에 컨트롤러 기동 여부 (자바 v2.18.1 와 같음, started · wait 는 짝 엔진 7.0.1.3602 이상)
|
|
64
101
|
|
|
65
102
|
- ``addNode`` 결과(``ILClusterNodeAddResult``)에 ``started`` · ``wait``(``is_started()``): 자리를 맡은 서비스가 컨트롤러를 **띄웠는가**와
|
|
66
103
|
안 띄운 까닭(``MANUAL`` - 정의 STARTMODE 가 MANUAL 이라 :meth:`startCluster` 로 띄운다 · ``STOPPED`` - 사용자가 멈춰 둠 · ``FAILED`` -
|
|
67
104
|
띄우다 실패, ilsvc 로그). 그 전 엔진은 이 칸을 주지 않아 맡았으면 띄운 것으로 본다(종전 동작).
|
|
68
|
-
- 문서:
|
|
105
|
+
- 문서: **토픽**의 생성 · 변경 · 삭제를 클러스터 팔로워 노드에 보내면 ``MIMQE_OPERATION_DENIED (STANDBY, leader=..)``, 조회 · 목록은
|
|
106
|
+
팔로워도 답한다. 쿼터 · 디스크 가드 · 클러스터(서비스가 받는 설정)에는 이 거절이 없다(배포 뒤 정정 - 처음에는 네 오브젝트 모두로 잘못 적었다).
|
|
69
107
|
|
|
70
108
|
## 0.22.0 변경 - 7 신규 오브젝트(쿼터 · 디스크 가드 · 토픽 · 클러스터) 관리를 Property v2(JSON)로 (자바 v2.18.0 와 같음, 짝 엔진 7.0.1.3601 이상)
|
|
71
109
|
|
|
@@ -10,12 +10,50 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
|
|
|
10
10
|
## 설치 방법
|
|
11
11
|
pip install jetstream-api
|
|
12
12
|
|
|
13
|
+
## 0.23.0 변경 - 큐 속성 Property v2(JSON) · 채널 STANDBY (자바 v2.19.0 와 같음, 짝 엔진 = Property v2 P3 판 이상)
|
|
14
|
+
|
|
15
|
+
- **큐 관리가 엔진 7 과 JSON(Property v2) 으로 오간다**(엔진 P3). 함수 이름은 그대로 - ``createQueue`` · ``setQueueProperty`` ·
|
|
16
|
+
``getQueueProperty`` (종류별 포함) · ``getQueueList`` (종류별 · 요약 포함) · ``removeQueue`` 가 상대가 7 이면 JSON, 6.x 면 기존 고정폭 블롭이다.
|
|
17
|
+
☠ **P3 전 7.x 엔진(7.0.1.3604 이하)에는 큐 관리가 거절된다** - 판 혼재는 지원하지 않는다(엔진 · 클라 · 하네스를 함께 올린다).
|
|
18
|
+
- ``setQueueProperty`` 는 엔진 7 에 **세터 · 대입으로 바꾼 칸만** 보낸다. 새로 만든 객체로 일부만 바꿔도 다른 칸을 덮지 않는다
|
|
19
|
+
(옛 블롭은 전체 교체였다). 바꾼 것이 없으면 보내지 않는다.
|
|
20
|
+
- 더함: ``createQueueWithResult`` · ``setQueuePropertyWithResult`` · ``removeQueueWithResult`` (``ILPropertyResult``, 6.x 엔진이면 빈 결과),
|
|
21
|
+
``ILQueueProperty.description`` (큐 설명, 200바이트, 생성 전용, 엔진 7 에서만).
|
|
22
|
+
- ``leaderGroup`` 은 JSON 으로만 오간다 - 고정폭 블롭은 6.3.4 레이아웃으로 되돌아갔다(LG 칸 없음).
|
|
23
|
+
- ``incomingDelayDepth`` · ``incomingDelay`` 의 ``0`` 은 유효한 값이다(문서 범위 고침). 세그먼트 수 · 공유 메모리 크기는 생성 전용 -
|
|
24
|
+
바꿔 보내면 ``MIMQE_IMMUTABLE_PROPERTY (SEGMENTS fixed at <n>)`` 로 거절된다.
|
|
25
|
+
- 종류별 조회(``getLocalQueueProperty`` 등)는 종류가 다르면 ``MIMQE_OBJECT_NOT_FOUND (<큐> : TYPE_NOT_MATCHED)`` (옛 엔진과 같은 사유).
|
|
26
|
+
- 채널: ``ILChannelStatus.STANDBY = 5`` (리더에서만 일하는 채널이 팔로워에서 대기). 이 값을 모르는 옛 클라는 STANDBY 채널이 섞인
|
|
27
|
+
채널 조회 · 목록이 실패한다. ``startChannelWithStatus`` 는 STANDBY · 오류(``"EXCEPTION"``)에서 기다리지 않고 곧바로 돌아온다
|
|
28
|
+
(전에는 오류에서 시한까지 기다렸다).
|
|
29
|
+
- 없앰: ``ILC.MIMQ_COORD_OBSERVER`` ("O") - ``getReplicationStatus`` 의 3370 arg1 은 빈칸이다(엔진이 r3486 부터 읽지 않는다).
|
|
30
|
+
- 예외 문구에 Property v2 본문 규칙 위반의 원인을 붙인다(전에는 ``MIMQE_INTERNAL_ERROR`` 만 보였다).
|
|
31
|
+
- 알려진 엔진 결함(P3 이전부터, 엔진에서 별건): 큐를 한 번 변경하면 그 뒤 ``setQueueTrace`` 결과가 조회에 안 보인다 -
|
|
32
|
+
트레이스는 ``setQueueProperty`` 로 바꾼다.
|
|
33
|
+
|
|
34
|
+
## 0.22.3 변경 - 옛 클러스터 블롭 코덱 · actingCoordinator 제거, servicePorts (자바 v2.18.3 와 같음, 짝 엔진 7.0.1.3603 이상 권장)
|
|
35
|
+
|
|
36
|
+
0.22.2 는 시험 판(test.pypi)만 내고 버렸다 - actingCoordinator 제거를 묶어 0.22.3 으로 나간다.
|
|
37
|
+
|
|
38
|
+
- **없앰**(호환 깨짐): 옛 고정폭 클러스터 블롭 코덱 - ``ILClusterProperty(bytes)`` · ``ba=`` · ``get_serialized`` · ``get_serialized_length`` ·
|
|
39
|
+
``LAYOUT_MARK``, ``ILClusterNode(bytes)`` · ``ba=`` · ``base=`` · ``get_serialized``, 모듈 ``CLUSTER_LAYOUT_MARK``,
|
|
40
|
+
``ILC.MIMQ_VO_CLUSTER_LEN`` / ``MIMQ_VO_CLUSTER_NODE_LEN``. 바이트를 주면 ``TypeError``. 엔진 r3601 이 그 형식을 지웠고 0.22.0 부터
|
|
41
|
+
JSON(Property v2)으로만 주고받아 쓰는 경로가 없었다. 능력 선언 ``clsblob=2`` 는 그대로.
|
|
42
|
+
- **없앰**(호환 깨짐): ``ILClusterProperty.actingCoordinator`` · ``get_acting_coordinator`` / ``getActingCoordinator`` - 0.18.1 부터 폐기 예정,
|
|
43
|
+
엔진 7.0.1.3484 부터 늘 ``None`` 이던 관측 칸이다(엔진 r3604 도 걷음). ``controllerLeader`` 를 읽는다 - 옛 이름으로 부르면 그렇게 안내한다.
|
|
44
|
+
- **더함**: ``ILClusterProperty.servicePorts`` / ``getServicePorts()`` (읽기 전용) - 응답한 서비스가 맡은 컨트롤러(ilcc) 자리의 포트 전부
|
|
45
|
+
(엔진 ``PORT`` "a,b", 맡은 자리가 없으면 빈 목록). 컨트롤러가 멈춰 있어도 나온다 - 지금 듣는 포트는 ``localCtrlPort``.
|
|
46
|
+
- 노드 ``status`` · ``nodeUuid`` · ``defTerm`` · ``defVersion`` 은 이름만 남는다(엔진 r3601 부터 와이어에 없어 늘 빈 값) - 문서를 고침.
|
|
47
|
+
- 문서 정정: 팔로워 거절 ``MIMQE_OPERATION_DENIED (STANDBY)`` 는 **토픽**의 생성 · 변경 · 삭제만이다(쿼터 · 디스크 가드 · 클러스터에는 없다).
|
|
48
|
+
- 엔진 r3603: 클러스터 서명(``signature``) 값의 재료가 정의의 공유 칸 전부로 넓어져 값이 바뀐다(키 · 형식 그대로, 클라 변경 없음).
|
|
49
|
+
|
|
13
50
|
## 0.22.1 변경 - 노드 추가 결과에 컨트롤러 기동 여부 (자바 v2.18.1 와 같음, started · wait 는 짝 엔진 7.0.1.3602 이상)
|
|
14
51
|
|
|
15
52
|
- ``addNode`` 결과(``ILClusterNodeAddResult``)에 ``started`` · ``wait``(``is_started()``): 자리를 맡은 서비스가 컨트롤러를 **띄웠는가**와
|
|
16
53
|
안 띄운 까닭(``MANUAL`` - 정의 STARTMODE 가 MANUAL 이라 :meth:`startCluster` 로 띄운다 · ``STOPPED`` - 사용자가 멈춰 둠 · ``FAILED`` -
|
|
17
54
|
띄우다 실패, ilsvc 로그). 그 전 엔진은 이 칸을 주지 않아 맡았으면 띄운 것으로 본다(종전 동작).
|
|
18
|
-
- 문서:
|
|
55
|
+
- 문서: **토픽**의 생성 · 변경 · 삭제를 클러스터 팔로워 노드에 보내면 ``MIMQE_OPERATION_DENIED (STANDBY, leader=..)``, 조회 · 목록은
|
|
56
|
+
팔로워도 답한다. 쿼터 · 디스크 가드 · 클러스터(서비스가 받는 설정)에는 이 거절이 없다(배포 뒤 정정 - 처음에는 네 오브젝트 모두로 잘못 적었다).
|
|
19
57
|
|
|
20
58
|
## 0.22.0 변경 - 7 신규 오브젝트(쿼터 · 디스크 가드 · 토픽 · 클러스터) 관리를 Property v2(JSON)로 (자바 v2.18.0 와 같음, 짝 엔진 7.0.1.3601 이상)
|
|
21
59
|
|
|
@@ -4005,6 +4005,8 @@ class ILAdminQmgr:
|
|
|
4005
4005
|
print(q.getName(), q.get_type_string(), q.getDepth())
|
|
4006
4006
|
"""
|
|
4007
4007
|
try:
|
|
4008
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4009
|
+
return self._queueListV2()
|
|
4008
4010
|
res_msg = self.service.inquire(self.qmgrName, ILC.MIMQ_GET_QUEUE_LIST)
|
|
4009
4011
|
if res_msg.getType() == ILC.MIMQ_REPORT_MESSAGE:
|
|
4010
4012
|
raise ILOperationException(res_msg.getReportMsg().getArg2())
|
|
@@ -4028,6 +4030,8 @@ class ILAdminQmgr:
|
|
|
4028
4030
|
목록 화면을 주기적으로 갱신할 때처럼 자주 부르는 경우에 쓴다.
|
|
4029
4031
|
"""
|
|
4030
4032
|
try:
|
|
4033
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4034
|
+
return self._queueMinorListV2(ILQueueMinorProperty)
|
|
4031
4035
|
if self.revision < 2762:
|
|
4032
4036
|
props = self.getQueueList()
|
|
4033
4037
|
return [prop.get_minor_property() for prop in props]
|
|
@@ -4053,6 +4057,8 @@ class ILAdminQmgr:
|
|
|
4053
4057
|
ILException: 통신 실패.
|
|
4054
4058
|
"""
|
|
4055
4059
|
try:
|
|
4060
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4061
|
+
return self._queueListV2(ILC.MIMQ_LOCAL_PERSISTENT)
|
|
4056
4062
|
res_msg = self.service.inquire(
|
|
4057
4063
|
self.qmgrName, ILC.MIMQ_GET_QUEUE_LIST, str(ILC.MIMQ_LOCAL_PERSISTENT)
|
|
4058
4064
|
)
|
|
@@ -4075,6 +4081,8 @@ class ILAdminQmgr:
|
|
|
4075
4081
|
ILException: 통신 실패.
|
|
4076
4082
|
"""
|
|
4077
4083
|
try:
|
|
4084
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4085
|
+
return self._queueMinorListV2(ILLocalQueueMinorProperty, ILC.MIMQ_LOCAL_PERSISTENT)
|
|
4078
4086
|
if self.revision < 2762:
|
|
4079
4087
|
props = self.getLocalQueueList()
|
|
4080
4088
|
return [prop.get_minor_property() for prop in props]
|
|
@@ -4106,6 +4114,8 @@ class ILAdminQmgr:
|
|
|
4106
4114
|
ILException: 통신 실패.
|
|
4107
4115
|
"""
|
|
4108
4116
|
try:
|
|
4117
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4118
|
+
return self._queueListV2(ILC.MIMQ_REMOTE_QUEUE)
|
|
4109
4119
|
res_msg = self.service.inquire(
|
|
4110
4120
|
self.qmgrName, ILC.MIMQ_GET_QUEUE_LIST, str(ILC.MIMQ_REMOTE_QUEUE)
|
|
4111
4121
|
)
|
|
@@ -4128,6 +4138,8 @@ class ILAdminQmgr:
|
|
|
4128
4138
|
ILException: 통신 실패.
|
|
4129
4139
|
"""
|
|
4130
4140
|
try:
|
|
4141
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4142
|
+
return self._queueMinorListV2(ILRemoteQueueMinorProperty, ILC.MIMQ_REMOTE_QUEUE)
|
|
4131
4143
|
if self.revision < 2762:
|
|
4132
4144
|
props = self.getRemoteQueueList()
|
|
4133
4145
|
return [prop.get_minor_property() for prop in props]
|
|
@@ -4158,6 +4170,8 @@ class ILAdminQmgr:
|
|
|
4158
4170
|
ILException: 통신 실패.
|
|
4159
4171
|
"""
|
|
4160
4172
|
try:
|
|
4173
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4174
|
+
return self._queueListV2(ILC.MIMQ_CHANNEL_TRANSMISSION_QUEUE)
|
|
4161
4175
|
res_msg = self.service.inquire(
|
|
4162
4176
|
self.qmgrName,
|
|
4163
4177
|
ILC.MIMQ_GET_QUEUE_LIST,
|
|
@@ -4185,6 +4199,8 @@ class ILAdminQmgr:
|
|
|
4185
4199
|
깊이만 주기적으로 보며 **전송 적체**를 감시할 때 적합하다.
|
|
4186
4200
|
"""
|
|
4187
4201
|
try:
|
|
4202
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4203
|
+
return self._queueMinorListV2(ILXmitQueueMinorProperty, ILC.MIMQ_CHANNEL_TRANSMISSION_QUEUE)
|
|
4188
4204
|
if self.revision < 2762:
|
|
4189
4205
|
props = self.getXmitQueueList()
|
|
4190
4206
|
return [prop.get_minor_property() for prop in props]
|
|
@@ -4284,6 +4300,9 @@ class ILAdminQmgr:
|
|
|
4284
4300
|
**그 값들은 무시된다** - 설정해도 반영되지 않는다.
|
|
4285
4301
|
"""
|
|
4286
4302
|
try:
|
|
4303
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4304
|
+
self.createQueueWithResult(prop)
|
|
4305
|
+
return
|
|
4287
4306
|
self.service.apply(
|
|
4288
4307
|
self.qmgrName,
|
|
4289
4308
|
ILC.MIMQ_CREATE_QUEUE_REQUEST,
|
|
@@ -4349,6 +4368,9 @@ class ILAdminQmgr:
|
|
|
4349
4368
|
|
|
4350
4369
|
"""
|
|
4351
4370
|
try:
|
|
4371
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4372
|
+
self.removeQueueWithResult(queueName)
|
|
4373
|
+
return
|
|
4352
4374
|
self.service.request(
|
|
4353
4375
|
self.qmgrName,
|
|
4354
4376
|
ILC.MIMQ_REMOVE_QUEUE,
|
|
@@ -4571,6 +4593,123 @@ class ILAdminQmgr:
|
|
|
4571
4593
|
except Exception as exc:
|
|
4572
4594
|
raise ILException(exc) from exc
|
|
4573
4595
|
|
|
4596
|
+
# ── 다음 판 Property v2 (B) Queue(엔진 P3, 설계 §14) ── 상대가 7 이면 JSON, 6.x 면 기존 블롭(구버전 호환 용도로만, U7)
|
|
4597
|
+
|
|
4598
|
+
#: LIST 로 전체 속성을 받을 때의 _KEYS(설정 키 전부 + CURDEPTH). 없으면 엔진은 NAME · TYPE · CURDEPTH · MAXDEPTH 만 준다
|
|
4599
|
+
_QUEUE_LIST_KEYS = [k for k, _ in ILQueueProperty._PV2_KEYS.values()] + ["CURDEPTH"]
|
|
4600
|
+
|
|
4601
|
+
def _queueV2(self) -> bool:
|
|
4602
|
+
return _propv2.peer_speaks_v2(self.version)
|
|
4603
|
+
|
|
4604
|
+
def _queueReq(self, code: int, body: dict) -> dict:
|
|
4605
|
+
# 관리 연결이라 대상 큐 관리자 이름을 실어 ilsvc 가 중계한다(토픽과 같다)
|
|
4606
|
+
return _propv2.request(self.service, self.qmgrName, code, dict({"_TYPE": "QUEUE"}, **body))
|
|
4607
|
+
|
|
4608
|
+
def _queueItems(self, obj: dict) -> list:
|
|
4609
|
+
items = obj.get("_ITEMS", []) or []
|
|
4610
|
+
if not isinstance(items, list) or any(not isinstance(e, dict) for e in items):
|
|
4611
|
+
raise _propv2.PropV2Error("_ITEMS must be ARRAY of OBJ")
|
|
4612
|
+
return [ILQueueProperty()._pv2_from_body(e) for e in items]
|
|
4613
|
+
|
|
4614
|
+
def _queueListV2(self, qtype: int | None = None) -> list:
|
|
4615
|
+
# 종류 거르기는 클라가 한다(옛 3016 arg 의 엔진 거르기와 같은 결과)
|
|
4616
|
+
qs = self._queueItems(self._queueReq(_propv2.PROP_LIST, {"_KEYS": ILAdminQmgr._QUEUE_LIST_KEYS}))
|
|
4617
|
+
return [q for q in qs if qtype is None or q.type == qtype]
|
|
4618
|
+
|
|
4619
|
+
def _queueMinorListV2(self, cls, qtype: int | None = None) -> list:
|
|
4620
|
+
out = []
|
|
4621
|
+
for q in self._queueItems(self._queueReq(_propv2.PROP_LIST, {})):
|
|
4622
|
+
if qtype is None or q.type == qtype:
|
|
4623
|
+
m = cls()
|
|
4624
|
+
m.name, m.type, m.depth = q.name, q.type, q.depth
|
|
4625
|
+
out.append(m)
|
|
4626
|
+
return out
|
|
4627
|
+
|
|
4628
|
+
def _queueGetV2(self, queueName: str, qtype: int | None = None) -> ILQueueProperty:
|
|
4629
|
+
q = ILQueueProperty()._pv2_from_body(self._queueReq(_propv2.PROP_GET, {"NAME": queueName}))
|
|
4630
|
+
if qtype is not None and q.type != qtype:
|
|
4631
|
+
# 옛 3018 종류 거르기와 같은 사유(엔진 ConfigHelper GetQueueProperty)
|
|
4632
|
+
raise ILOperationException("MIMQE_OBJECT_NOT_FOUND (%s : TYPE_NOT_MATCHED)" % queueName)
|
|
4633
|
+
return q
|
|
4634
|
+
|
|
4635
|
+
def createQueueWithResult(self, prop: ILQueueProperty) -> ILPropertyResult:
|
|
4636
|
+
""":meth:`createQueue` 와 같고, 엔진이 무엇을 적용 · 무시했는지 돌려준다(다음 판).
|
|
4637
|
+
|
|
4638
|
+
Args:
|
|
4639
|
+
prop (ILQueueProperty): 만들 큐.
|
|
4640
|
+
|
|
4641
|
+
Returns:
|
|
4642
|
+
ILPropertyResult: 적용(``applied``) · 무시(``ignored``) 목록. **6.x 엔진이면 빈 결과**다(옛 와이어에는 결과가 없다).
|
|
4643
|
+
|
|
4644
|
+
Raises:
|
|
4645
|
+
ILOperationException: 엔진이 거절했을 때(사유 그대로).
|
|
4646
|
+
ILException: 통신 실패.
|
|
4647
|
+
"""
|
|
4648
|
+
try:
|
|
4649
|
+
if not self._queueV2():
|
|
4650
|
+
self.createQueue(prop)
|
|
4651
|
+
return ILPropertyResult({})
|
|
4652
|
+
res = ILPropertyResult(self._queueReq(_propv2.PROP_CREATE, prop._pv2_create_body()))
|
|
4653
|
+
prop._pv2_clear()
|
|
4654
|
+
return res
|
|
4655
|
+
except _PASSTHROUGH_EXCEPTIONS:
|
|
4656
|
+
raise
|
|
4657
|
+
except Exception as exc:
|
|
4658
|
+
raise ILException(exc) from exc
|
|
4659
|
+
|
|
4660
|
+
def setQueuePropertyWithResult(self, prop: ILQueueProperty) -> ILPropertyResult:
|
|
4661
|
+
""":meth:`setQueueProperty` 와 같고, 엔진이 무엇을 적용 · 무시했는지 돌려준다(다음 판).
|
|
4662
|
+
|
|
4663
|
+
엔진 7 에는 **세터 · 대입으로 바꾼 칸만** 보낸다(ALTER patch). 바꾼 것이 없으면 보내지 않고 빈 결과를 돌려준다.
|
|
4664
|
+
|
|
4665
|
+
Args:
|
|
4666
|
+
prop (ILQueueProperty): 바꿀 큐(이름으로 찾는다).
|
|
4667
|
+
|
|
4668
|
+
Returns:
|
|
4669
|
+
ILPropertyResult: 적용 · 무시 목록. **6.x 엔진이면 빈 결과**다.
|
|
4670
|
+
|
|
4671
|
+
Raises:
|
|
4672
|
+
ILOperationException: 엔진이 거절했을 때(사유 그대로).
|
|
4673
|
+
ILException: 통신 실패.
|
|
4674
|
+
"""
|
|
4675
|
+
try:
|
|
4676
|
+
if not self._queueV2():
|
|
4677
|
+
self.setQueueProperty(prop)
|
|
4678
|
+
return ILPropertyResult({})
|
|
4679
|
+
body = prop._pv2_patch_body()
|
|
4680
|
+
if not body:
|
|
4681
|
+
return ILPropertyResult({})
|
|
4682
|
+
res = ILPropertyResult(self._queueReq(_propv2.PROP_ALTER, body))
|
|
4683
|
+
prop._pv2_clear()
|
|
4684
|
+
return res
|
|
4685
|
+
except _PASSTHROUGH_EXCEPTIONS:
|
|
4686
|
+
raise
|
|
4687
|
+
except Exception as exc:
|
|
4688
|
+
raise ILException(exc) from exc
|
|
4689
|
+
|
|
4690
|
+
def removeQueueWithResult(self, queueName: str) -> ILPropertyResult:
|
|
4691
|
+
""":meth:`removeQueue` 와 같고 엔진 결과를 돌려준다(다음 판). **6.x 엔진이면 빈 결과**다.
|
|
4692
|
+
|
|
4693
|
+
Args:
|
|
4694
|
+
queueName (str): 지울 큐 이름.
|
|
4695
|
+
|
|
4696
|
+
Returns:
|
|
4697
|
+
ILPropertyResult: 엔진 결과.
|
|
4698
|
+
|
|
4699
|
+
Raises:
|
|
4700
|
+
ILOperationException: 엔진이 거절했을 때(비어 있지 않은 큐 등, 사유 그대로).
|
|
4701
|
+
ILException: 통신 실패.
|
|
4702
|
+
"""
|
|
4703
|
+
try:
|
|
4704
|
+
if not self._queueV2():
|
|
4705
|
+
self.removeQueue(queueName)
|
|
4706
|
+
return ILPropertyResult({})
|
|
4707
|
+
return ILPropertyResult(self._queueReq(_propv2.PROP_DELETE, {"NAME": queueName}))
|
|
4708
|
+
except _PASSTHROUGH_EXCEPTIONS:
|
|
4709
|
+
raise
|
|
4710
|
+
except Exception as exc:
|
|
4711
|
+
raise ILException(exc) from exc
|
|
4712
|
+
|
|
4574
4713
|
def _queueBlob(self, prop: ILQueueProperty) -> bytes:
|
|
4575
4714
|
"""큐 속성을 **붙어 있는 엔진이 이해하는 레이아웃**으로 직렬화한다.
|
|
4576
4715
|
|
|
@@ -4638,6 +4777,8 @@ class ILAdminQmgr:
|
|
|
4638
4777
|
print(q.getDepth(), "/", q.getMaxDepth())
|
|
4639
4778
|
"""
|
|
4640
4779
|
try:
|
|
4780
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4781
|
+
return self._queueGetV2(queueName)
|
|
4641
4782
|
res_msg = self.service.inquire(
|
|
4642
4783
|
self.qmgrName, ILC.MIMQ_GET_QUEUE_PROPERTY, queueName
|
|
4643
4784
|
)
|
|
@@ -4663,6 +4804,8 @@ class ILAdminQmgr:
|
|
|
4663
4804
|
ILException: 통신 실패.
|
|
4664
4805
|
"""
|
|
4665
4806
|
try:
|
|
4807
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4808
|
+
return self._queueGetV2(queueName, ILC.MIMQ_LOCAL_PERSISTENT)
|
|
4666
4809
|
res_msg = self.service.inquire(
|
|
4667
4810
|
self.qmgrName,
|
|
4668
4811
|
ILC.MIMQ_GET_QUEUE_PROPERTY,
|
|
@@ -4693,6 +4836,8 @@ class ILAdminQmgr:
|
|
|
4693
4836
|
ILException: 통신 실패.
|
|
4694
4837
|
"""
|
|
4695
4838
|
try:
|
|
4839
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4840
|
+
return self._queueGetV2(queueName, ILC.MIMQ_REMOTE_QUEUE)
|
|
4696
4841
|
res_msg = self.service.inquire(
|
|
4697
4842
|
self.qmgrName,
|
|
4698
4843
|
ILC.MIMQ_GET_QUEUE_PROPERTY,
|
|
@@ -4722,6 +4867,8 @@ class ILAdminQmgr:
|
|
|
4722
4867
|
ILException: 통신 실패.
|
|
4723
4868
|
"""
|
|
4724
4869
|
try:
|
|
4870
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4871
|
+
return self._queueGetV2(queueName, ILC.MIMQ_CHANNEL_TRANSMISSION_QUEUE)
|
|
4725
4872
|
res_msg = self.service.inquire(
|
|
4726
4873
|
self.qmgrName,
|
|
4727
4874
|
ILC.MIMQ_GET_QUEUE_PROPERTY,
|
|
@@ -4781,6 +4928,9 @@ class ILAdminQmgr:
|
|
|
4781
4928
|
**그 값들은 무시된다** - 설정해도 반영되지 않는다.
|
|
4782
4929
|
"""
|
|
4783
4930
|
try:
|
|
4931
|
+
if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
|
|
4932
|
+
self.setQueuePropertyWithResult(prop)
|
|
4933
|
+
return
|
|
4784
4934
|
self.service.apply(
|
|
4785
4935
|
self.qmgrName,
|
|
4786
4936
|
ILC.MIMQ_SET_QUEUE_PROPERTY,
|
|
@@ -5831,8 +5981,9 @@ class ILAdminQmgr:
|
|
|
5831
5981
|
timeout (int): 최대 대기 **초**.
|
|
5832
5982
|
|
|
5833
5983
|
Returns:
|
|
5834
|
-
str: 최종 상태 문자열(``"RUNNING"`` / ``"EXCEPTION"`` 등, 시간이
|
|
5835
|
-
다하면 그 시점의 상태).
|
|
5984
|
+
str: 최종 상태 문자열(``"RUNNING"`` / ``"EXCEPTION"`` / ``"STANDBY"`` 등, 시간이
|
|
5985
|
+
다하면 그 시점의 상태). ``"STANDBY"`` 는 리더에서만 일하는 채널이 팔로워에서 대기에 든 것이라
|
|
5986
|
+
기다리지 않고 곧바로 돌려준다. **예외가 아니라 문자열로 결과를 알리므로**
|
|
5836
5987
|
값을 반드시 확인하라.
|
|
5837
5988
|
|
|
5838
5989
|
Raises:
|
|
@@ -5856,7 +6007,9 @@ class ILAdminQmgr:
|
|
|
5856
6007
|
status_str = ""
|
|
5857
6008
|
for _ in range(timeout):
|
|
5858
6009
|
status_str = self.getChannelProperty(channelName).get_status_string()
|
|
5859
|
-
|
|
6010
|
+
# 채널 상태 문자열은 오류를 "EXCEPTION" 으로 낸다(자바 · ilsc 는 "ERROR") - 둘 다 끝으로 본다.
|
|
6011
|
+
# 전에는 "ERROR" 만 봐서 채널 오류에서 시한까지 기다렸다
|
|
6012
|
+
if status_str in (ILC.MIMQ_RUNNING_STR, ILC.MIMQ_ERROR_STR, "EXCEPTION", "STANDBY"):
|
|
5860
6013
|
break
|
|
5861
6014
|
time.sleep(1)
|
|
5862
6015
|
return status_str
|
|
@@ -5912,7 +6065,7 @@ class ILAdminQmgr:
|
|
|
5912
6065
|
status_str = ""
|
|
5913
6066
|
for _ in range(timeout):
|
|
5914
6067
|
status_str = self.getChannelProperty(channelName).get_status_string()
|
|
5915
|
-
if status_str in (ILC.MIMQ_STOPPED_STR, ILC.MIMQ_ERROR_STR):
|
|
6068
|
+
if status_str in (ILC.MIMQ_STOPPED_STR, ILC.MIMQ_ERROR_STR, "EXCEPTION"):
|
|
5916
6069
|
break
|
|
5917
6070
|
time.sleep(1)
|
|
5918
6071
|
return status_str
|
|
@@ -5929,7 +6082,7 @@ class ILAdminQmgr:
|
|
|
5929
6082
|
Args:
|
|
5930
6083
|
channelName (str): 채널 이름.
|
|
5931
6084
|
status (ILChannelStatus): 기다릴 목표 상태
|
|
5932
|
-
(``RUNNING`` / ``STOPPED`` / ``STARTING`` / ``STOPPING`` / ``EXCEPTION``).
|
|
6085
|
+
(``RUNNING`` / ``STOPPED`` / ``STARTING`` / ``STOPPING`` / ``EXCEPTION`` / ``STANDBY``).
|
|
5933
6086
|
timeout (int): 최대 대기 **초**.
|
|
5934
6087
|
|
|
5935
6088
|
Returns:
|
|
@@ -7117,7 +7270,7 @@ class ILAdminQmgr:
|
|
|
7117
7270
|
# (CSV / epoch / 노드 / 확장 - 줄바꿈 구분)로, 옛 엔진은 arg2 를 안 읽고 종전 REPORT 로 답한다 - 둘 다 받는다.
|
|
7118
7271
|
res = self.service.inquire_data_or_report(
|
|
7119
7272
|
self.qmgrName, ILC.MIMQ_CLUSTER_NODE_STATUS, None,
|
|
7120
|
-
|
|
7273
|
+
"", ILC.MIMQ_CLUSTER_STATUS_EXT_MARK, "")
|
|
7121
7274
|
if res.getType() == ILC.MIMQ_LONG_REPORT_MESSAGE:
|
|
7122
7275
|
body = res.getDataMsg().getData().decode("utf-8", "replace")
|
|
7123
7276
|
lines = body.split("\n", 3)
|
|
@@ -409,8 +409,8 @@ class ILC:
|
|
|
409
409
|
|
|
410
410
|
# 클러스터(HA) - 클라이언트 페일오버 지원
|
|
411
411
|
MIMQ_CLUSTER_NODE_STATUS = 3370
|
|
412
|
-
|
|
413
|
-
|
|
412
|
+
# 다음 판: 3370 요청 arg1 관측 표시 MIMQ_COORD_OBSERVER("O", 판사 시절)를 없앴다 - arg1 은 빈칸이다.
|
|
413
|
+
# 엔진 r3486 부터 이 칸을 읽지 않고 r3603 부터 엔진 C++ API 도 빈칸으로 보낸다(getClusterRole 은 원래 빈칸).
|
|
414
414
|
#: 3370 요청 arg2 = 확장 응답 요청. 엔진 r3500 부터 LONG_REPORT 4줄로 답한다(옛 엔진은 무시하고 REPORT).
|
|
415
415
|
MIMQ_CLUSTER_STATUS_EXT_MARK = "X"
|
|
416
416
|
MIMQ_CLUSTER_CLIENT_INFO = 3373
|
|
@@ -484,14 +484,8 @@ class ILC:
|
|
|
484
484
|
# 노드(큐관리자)에게 묻는 런타임 관측 리포트 (OBS-1). TEXT | JSON
|
|
485
485
|
MIMQ_GET_CLUSTER_RUNTIME = 3381
|
|
486
486
|
|
|
487
|
-
# 클러스터
|
|
488
|
-
#
|
|
489
|
-
# 판 이력: 256 -> 512(CLSTOPO-1, 3-서비스 토폴로지) -> 768(컴트롤러 정족수).
|
|
490
|
-
# ★ 768 판부터는 블롭 앞머리에 판 표시가 있다(:data:`ilink.properties.CLUSTER_LAYOUT_MARK`).
|
|
491
|
-
# 그 전 판은 표시가 없어 **레거시로 보고 거절**한다 - 길이로는 못 가른다
|
|
492
|
-
# (512+5+256 과 768+5+0 이 둘 다 773 이다).
|
|
493
|
-
MIMQ_VO_CLUSTER_LEN = 768
|
|
494
|
-
MIMQ_VO_CLUSTER_NODE_LEN = 384
|
|
487
|
+
# 0.22.3: 클러스터 속성의 옛 고정폭 블롭(768 + 5 + 384 x N) 상수 MIMQ_VO_CLUSTER_LEN / MIMQ_VO_CLUSTER_NODE_LEN 을 없앴다 -
|
|
488
|
+
# 엔진 r3601 이 클러스터를 Property v2(JSON) 전용으로 바꾸며 그 형식을 지웠다.
|
|
495
489
|
MIMQ_LIST_SIZE_LENGTH = 5
|
|
496
490
|
|
|
497
491
|
# ------------------------------------------------------------------
|
|
@@ -983,8 +977,8 @@ class ILC:
|
|
|
983
977
|
#: 능력 선언의 최대 길이(접두 포함). 넘으면 **자르지 않고 통째로 버린다** -
|
|
984
978
|
#: 자르면 ``clsblob=2`` 가 ``clsblob=`` 가 되어 **읽히는데 뜻이 다른** 값이 된다.
|
|
985
979
|
MIMQ_CLIENT_CAPS_MAX = 63
|
|
986
|
-
#:
|
|
987
|
-
#:
|
|
980
|
+
#: 능력 선언(``CAP=clsblob=2``)의 클러스터 블롭 판. 0.22.3 부터 클라는 클러스터를 JSON 으로만 주고받지만(옛 블롭 코덱 제거)
|
|
981
|
+
#: 접속 능력 선언 토큰은 바꾸지 않는다 - 엔진이 핸드셰이크에서 읽는 값이다.
|
|
988
982
|
MIMQ_CLUSTER_BLOB_VERSION = 2
|
|
989
983
|
MIMQ_SESSION_STATUS_DEAD = 0
|
|
990
984
|
MIMQ_SESSION_STATUS_IDLE = 1
|
|
@@ -82,7 +82,10 @@ class ILException(Exception):
|
|
|
82
82
|
cause = self.__cause__ or (self.args[0] if self.args else None)
|
|
83
83
|
# 0.18.1: 시간 초과도 코드만으로는 **무엇이 얼마나 걸렸고 마지막에 무슨 답을 받았나**가 안 보인다 -
|
|
84
84
|
# 발행 시간 초과를 "내부 오류" 로 오독한 일이 있었다(회귀 · 엔진). 원인 문구를 붙인다
|
|
85
|
-
|
|
85
|
+
# 다음 판: Property v2 본문 규칙 위반(모르는 열거 문자열 · 값 종류 · 깨진 JSON)도 원인이 코드로 안 담긴다 - 전에는
|
|
86
|
+
# "MIMQE_INTERNAL_ERROR" 만 보였다
|
|
87
|
+
from ._propv2 import PropV2Error
|
|
88
|
+
if isinstance(cause, (ILDeserializeException, ILTimeoutException, PropV2Error)):
|
|
86
89
|
detail = str(cause).strip()
|
|
87
90
|
if detail and detail not in base:
|
|
88
91
|
return f"{base} {detail}"
|