Commit 0634602
committed
fix: 비멱등 주문 응답 유실 시 재전송 금지 — live 이중 체결 위험 차단
브로커가 주문(POST)을 받았으나 응답이 유실되면(타임아웃·연결 리셋) 체결 여부가
불명하다. 기존에는 _request가 빈 dict를 돌려주고 buy_order/sell_order가 None을
반환했는데, _execute_with_retry가 이 None을 "단순 실패"로 보고 같은 주문을
재전송(최대 3회)해 한 신호에 두 번 체결될 수 있었다(HIGH).
응답 유실(체결 불명)과 브로커의 명시적 거부(주문 미접수)를 구분해 처리한다.
- api/kis_api.py: 비멱등 요청의 네트워크/타임아웃 오류 시 빈 dict 대신
KISOrderResponseUnknown 예외를 던진다(POST는 여전히 1회만). 해외주문 경로는
계약 유지를 위해 예외를 잡아 None 반환.
- core/order_executor.py: _execute_with_retry가 이 예외를 받으면 재전송하지 않고
ORDER_RESPONSE_UNKNOWN 표식을 반환. 호출부는 주문을 SUBMITTED로 유지하고
OrderGuard도 유지(중복 차단)하며, 장부 미반영 + requires_reconcile로 다음
KIS↔DB 동기화에서 실제 체결분을 대조하게 한다. dead-letter에는 넣지 않는다
(접수됐을 수 있어 '주문 누락'이 아님).
- 명시적 거부(rt_cd!=0)·서킷오픈·400/403 등 '미접수' 경로는 기존대로 None →
재시도·dead-letter 유지.
테스트: 응답 유실 시 buy_order 1회 호출·reconcile 대기·OrderGuard 유지·장부
미반영 회귀 테스트 추가. 기존 idempotency 테스트는 새 계약(예외)으로 갱신.1 parent 5814fd3 commit 0634602
4 files changed
Lines changed: 150 additions & 21 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
29 | 38 | | |
30 | 39 | | |
31 | 40 | | |
| |||
400 | 409 | | |
401 | 410 | | |
402 | 411 | | |
403 | | - | |
| 412 | + | |
| 413 | + | |
404 | 414 | | |
405 | 415 | | |
406 | 416 | | |
407 | 417 | | |
408 | | - | |
| 418 | + | |
409 | 419 | | |
410 | 420 | | |
411 | 421 | | |
| |||
419 | 429 | | |
420 | 430 | | |
421 | 431 | | |
422 | | - | |
| 432 | + | |
423 | 433 | | |
424 | 434 | | |
425 | 435 | | |
| |||
430 | 440 | | |
431 | 441 | | |
432 | 442 | | |
433 | | - | |
| 443 | + | |
434 | 444 | | |
435 | 445 | | |
436 | 446 | | |
| |||
1442 | 1452 | | |
1443 | 1453 | | |
1444 | 1454 | | |
1445 | | - | |
1446 | | - | |
1447 | | - | |
1448 | | - | |
1449 | | - | |
1450 | | - | |
1451 | | - | |
| 1455 | + | |
| 1456 | + | |
| 1457 | + | |
| 1458 | + | |
| 1459 | + | |
| 1460 | + | |
| 1461 | + | |
| 1462 | + | |
| 1463 | + | |
| 1464 | + | |
| 1465 | + | |
| 1466 | + | |
1452 | 1467 | | |
1453 | 1468 | | |
1454 | 1469 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
35 | 41 | | |
36 | 42 | | |
37 | 43 | | |
| |||
910 | 916 | | |
911 | 917 | | |
912 | 918 | | |
| 919 | + | |
| 920 | + | |
913 | 921 | | |
914 | 922 | | |
915 | 923 | | |
| |||
1328 | 1336 | | |
1329 | 1337 | | |
1330 | 1338 | | |
| 1339 | + | |
| 1340 | + | |
1331 | 1341 | | |
1332 | 1342 | | |
1333 | 1343 | | |
| |||
1790 | 1800 | | |
1791 | 1801 | | |
1792 | 1802 | | |
| 1803 | + | |
| 1804 | + | |
| 1805 | + | |
| 1806 | + | |
| 1807 | + | |
| 1808 | + | |
| 1809 | + | |
| 1810 | + | |
| 1811 | + | |
| 1812 | + | |
| 1813 | + | |
| 1814 | + | |
| 1815 | + | |
| 1816 | + | |
| 1817 | + | |
| 1818 | + | |
| 1819 | + | |
| 1820 | + | |
| 1821 | + | |
| 1822 | + | |
| 1823 | + | |
| 1824 | + | |
| 1825 | + | |
| 1826 | + | |
| 1827 | + | |
| 1828 | + | |
| 1829 | + | |
| 1830 | + | |
| 1831 | + | |
1793 | 1832 | | |
1794 | 1833 | | |
1795 | 1834 | | |
| |||
2063 | 2102 | | |
2064 | 2103 | | |
2065 | 2104 | | |
2066 | | - | |
| 2105 | + | |
| 2106 | + | |
| 2107 | + | |
| 2108 | + | |
| 2109 | + | |
| 2110 | + | |
| 2111 | + | |
| 2112 | + | |
| 2113 | + | |
| 2114 | + | |
| 2115 | + | |
2067 | 2116 | | |
2068 | 2117 | | |
2069 | 2118 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
864 | 864 | | |
865 | 865 | | |
866 | 866 | | |
| 867 | + | |
| 868 | + | |
| 869 | + | |
| 870 | + | |
| 871 | + | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
| 875 | + | |
| 876 | + | |
| 877 | + | |
| 878 | + | |
| 879 | + | |
| 880 | + | |
| 881 | + | |
| 882 | + | |
| 883 | + | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
| 913 | + | |
| 914 | + | |
| 915 | + | |
| 916 | + | |
| 917 | + | |
| 918 | + | |
| 919 | + | |
| 920 | + | |
| 921 | + | |
| 922 | + | |
| 923 | + | |
| 924 | + | |
| 925 | + | |
| 926 | + | |
| 927 | + | |
| 928 | + | |
| 929 | + | |
| 930 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | | - | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
49 | 50 | | |
50 | 51 | | |
51 | 52 | | |
52 | | - | |
| 53 | + | |
53 | 54 | | |
54 | 55 | | |
55 | 56 | | |
| |||
59 | 60 | | |
60 | 61 | | |
61 | 62 | | |
62 | | - | |
| 63 | + | |
| 64 | + | |
63 | 65 | | |
64 | | - | |
65 | 66 | | |
66 | 67 | | |
67 | 68 | | |
68 | 69 | | |
69 | | - | |
| 70 | + | |
70 | 71 | | |
71 | 72 | | |
72 | 73 | | |
| |||
75 | 76 | | |
76 | 77 | | |
77 | 78 | | |
78 | | - | |
| 79 | + | |
| 80 | + | |
79 | 81 | | |
80 | | - | |
81 | 82 | | |
82 | 83 | | |
83 | 84 | | |
| |||
0 commit comments