Skip to content

Commit 6108713

Browse files
authored
Update lori dependency from 0.8.1 to 0.11.0 (#47)
Lori 0.9.0 added a `reason` parameter to `_on_connection_failure` that identifies the failure stage (DNS, TCP, or SSL). Define redis-local `ConnectionFailureReason` types and thread the reason through the state machine to `SessionStatusNotify.redis_session_connection_failed`. Also fix FFI type mismatch in `_mort.pony` — lori 0.11.0 declares `@exit(I32)` and `@pony_os_stderr() -> Pointer[None]`, so our declarations must match.
1 parent e9bc224 commit 6108713

13 files changed

Lines changed: 126 additions & 44 deletions

File tree

CLAUDE.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ make stop-redis
2525

2626
## Dependencies
2727

28-
- `ponylang/lori` (0.8.1) — TCP networking (transitively depends on `ponylang/ssl`, hence the `ssl=` build flag)
28+
- `ponylang/lori` (0.11.0) — TCP networking (transitively depends on `ponylang/ssl`, hence the `ssl=` build flag)
2929

3030
## Architecture
3131

@@ -43,13 +43,14 @@ Package: `redis`
4343

4444
- `Session` (actor in `session.pony`): Main entry point. Manages connection lifecycle and pub/sub via a state machine. Implements `lori.TCPConnectionActor & lori.ClientLifecycleEventReceiver`. All state machine classes (`_SessionUnopened`, `_SessionNegotiating`, `_SessionConnected`, `_SessionReady`, `_SessionSubscribed`, `_SessionClosed`) are in `session.pony`, following the postgres pattern.
4545
- `ConnectInfo` (in `connect_info.pony`): Connection configuration (host, port, optional password, SSL mode, optional username, protocol version, send buffer limit).
46-
- `SessionStatusNotify` (in `session_status_notify.pony`): Lifecycle callback interface. All callbacks have default no-op implementations. Callbacks: `redis_session_connected`, `redis_session_connection_failed`, `redis_session_ready`, `redis_session_authentication_failed`, `redis_session_throttled`, `redis_session_unthrottled`, `redis_session_closed`.
46+
- `SessionStatusNotify` (in `session_status_notify.pony`): Lifecycle callback interface. All callbacks have default no-op implementations. Callbacks: `redis_session_connected`, `redis_session_connection_failed(session, reason)`, `redis_session_ready`, `redis_session_authentication_failed`, `redis_session_throttled`, `redis_session_unthrottled`, `redis_session_closed`.
4747
- `ResultReceiver` (in `result_receiver.pony`): Command response callback interface. Callbacks: `redis_response`, `redis_command_failed`.
4848
- `SubscriptionNotify` (in `subscription_notify.pony`): Pub/sub callback interface. All callbacks have default no-op implementations. Callbacks: `redis_subscribed`, `redis_unsubscribed`, `redis_message`, `redis_psubscribed`, `redis_punsubscribed`, `redis_pmessage`.
4949
- `ClientError` (in `client_error.pony`): Client-side error trait with `SessionNotReady`, `SessionClosed`, `SessionConnectionLost`, `SessionProtocolError`, `SessionInSubscribedMode`, and `SessionBackpressureOverflow` primitives.
5050
- `_ResponseHandler` (in `_response_handler.pony`): Loops `_RespParser` over a `buffered.Reader`, routing `RespPush` to `on_push` and other `RespValue`s to `on_response`. Shuts down on `RespMalformed`.
5151
- `_BuildHelloCommand` / `_BuildAuthCommand` (primitives in `session.pony`): Build HELLO 3 and AUTH commands for protocol negotiation and authentication.
5252
- `_BufferedSend` (class val in `session.pony`): Serialized command buffered during backpressure. Holds wire-format bytes and an optional `_QueuedCommand` for response matching.
53+
- `ConnectionFailureReason` (type alias in `connection_failure_reason.pony`): `(ConnectionFailedDNS | ConnectionFailedTCP | ConnectionFailedSSL)`. Passed to `redis_session_connection_failed` to identify the failure stage.
5354
- `_IllegalState` / `_Unreachable` (in `_mort.pony`): Primitives for detecting impossible states.
5455

5556
### Command Builders

corral.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"deps": [
1414
{
1515
"locator": "github.com/ponylang/lori.git",
16-
"version": "0.8.1"
16+
"version": "0.11.0"
1717
}
1818
]
1919
}

examples/backpressure/main.pony

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ actor Client is (SessionStatusNotify & ResultReceiver)
3737
be redis_session_unthrottled(session: Session) =>
3838
_out.print("Unthrottled — flushing buffered commands.")
3939

40-
be redis_session_connection_failed(session: Session) =>
40+
be redis_session_connection_failed(session: Session,
41+
reason: ConnectionFailureReason)
42+
=>
4143
_out.print("Failed to connect.")
4244

4345
be redis_response(session: Session, response: RespValue) =>

examples/basic/main.pony

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ actor Client is (SessionStatusNotify & ResultReceiver)
2424
_out.print("Connected and ready.")
2525
session.execute(RedisString.set("hello", "world"), this)
2626

27-
be redis_session_connection_failed(session: Session) =>
27+
be redis_session_connection_failed(session: Session,
28+
reason: ConnectionFailureReason)
29+
=>
2830
_out.print("Failed to connect.")
2931

3032
be redis_response(session: Session, response: RespValue) =>

examples/pipeline/main.pony

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ actor Client is (SessionStatusNotify & ResultReceiver)
4040
session.execute(cmd, this)
4141
end
4242

43-
be redis_session_connection_failed(session: Session) =>
43+
be redis_session_connection_failed(session: Session,
44+
reason: ConnectionFailureReason)
45+
=>
4446
_out.print("Failed to connect.")
4547

4648
be redis_response(session: Session, response: RespValue) =>

examples/pubsub/main.pony

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ actor PubSubDemo is
6868
_subscriber.close()
6969
_publisher.close()
7070

71-
be redis_session_connection_failed(session: Session) =>
71+
be redis_session_connection_failed(session: Session,
72+
reason: ConnectionFailureReason)
73+
=>
7274
_out.print("Failed to connect.")
7375

7476
be redis_response(session: Session, response: RespValue) =>

examples/resp3/main.pony

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ actor Client is (SessionStatusNotify & ResultReceiver)
2828
["HSET"; "_resp3_example"; "name"; "Pony"; "version"; "0.60"]
2929
session.execute(cmd, this)
3030

31-
be redis_session_connection_failed(session: Session) =>
31+
be redis_session_connection_failed(session: Session,
32+
reason: ConnectionFailureReason)
33+
=>
3234
_out.print("Failed to connect.")
3335

3436
be redis_response(session: Session, response: RespValue) =>

examples/ssl/main.pony

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ actor Client is (SessionStatusNotify & ResultReceiver)
4848
let cmd: Array[ByteSeq] val = ["PING"]
4949
session.execute(cmd, this)
5050

51-
be redis_session_connection_failed(session: Session) =>
51+
be redis_session_connection_failed(session: Session,
52+
reason: ConnectionFailureReason)
53+
=>
5254
_out.print("Failed to connect (TLS handshake or TCP failure).")
5355

5456
be redis_response(session: Session, response: RespValue) =>

redis/_mort.pony

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use @exit[None](status: U8)
2-
use @fprintf[I32](stream: Pointer[U8] tag, fmt: Pointer[U8] tag, ...)
3-
use @pony_os_stderr[Pointer[U8]]()
1+
use @exit[None](status: I32)
2+
use @fprintf[I32](stream: Pointer[None] tag, fmt: Pointer[U8] tag, ...)
3+
use @pony_os_stderr[Pointer[None]]()
44

55
primitive _IllegalState
66
"""

redis/_test_session.pony

Lines changed: 66 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ actor \nodoc\ _ConnectAndReadyNotify is SessionStatusNotify
5151
_done = true
5252
_h.complete(true)
5353

54-
be redis_session_connection_failed(session: Session) =>
54+
be redis_session_connection_failed(session: Session,
55+
reason: ConnectionFailureReason)
56+
=>
5557
_h.fail("Connection failed")
5658
_h.complete(false)
5759

@@ -140,7 +142,9 @@ actor \nodoc\ _SetAndGetClient is (SessionStatusNotify & ResultReceiver)
140142
_h.fail("Command failed: " + failure.message())
141143
_h.complete(false)
142144

143-
be redis_session_connection_failed(session: Session) =>
145+
be redis_session_connection_failed(session: Session,
146+
reason: ConnectionFailureReason)
147+
=>
144148
_h.fail("Connection failed")
145149
_h.complete(false)
146150

@@ -175,7 +179,9 @@ actor \nodoc\ _ConnectionFailureNotify is SessionStatusNotify
175179
new create(h: TestHelper) =>
176180
_h = h
177181

178-
be redis_session_connection_failed(session: Session) =>
182+
be redis_session_connection_failed(session: Session,
183+
reason: ConnectionFailureReason)
184+
=>
179185
_done = true
180186
_h.complete(true)
181187

@@ -285,7 +291,9 @@ actor \nodoc\ _ExecuteAfterCloseClient is
285291
_h.fail("Should not have received a response")
286292
_h.complete(false)
287293

288-
be redis_session_connection_failed(session: Session) =>
294+
be redis_session_connection_failed(session: Session,
295+
reason: ConnectionFailureReason)
296+
=>
289297
_h.fail("Connection failed")
290298
_h.complete(false)
291299

@@ -380,7 +388,9 @@ actor \nodoc\ _MultipleCommandsClient is
380388
_h.fail("Command failed: " + failure.message())
381389
_h.complete(false)
382390

383-
be redis_session_connection_failed(session: Session) =>
391+
be redis_session_connection_failed(session: Session,
392+
reason: ConnectionFailureReason)
393+
=>
384394
_h.fail("Connection failed")
385395
_h.complete(false)
386396

@@ -480,7 +490,9 @@ actor \nodoc\ _PipelineClient is (SessionStatusNotify & ResultReceiver)
480490
_h.fail("Command failed: " + failure.message())
481491
_h.complete(false)
482492

483-
be redis_session_connection_failed(session: Session) =>
493+
be redis_session_connection_failed(session: Session,
494+
reason: ConnectionFailureReason)
495+
=>
484496
_h.fail("Connection failed")
485497
_h.complete(false)
486498

@@ -583,7 +595,9 @@ actor \nodoc\ _PipelineMixedClient is (SessionStatusNotify & ResultReceiver)
583595
_h.fail("Command failed: " + failure.message())
584596
_h.complete(false)
585597

586-
be redis_session_connection_failed(session: Session) =>
598+
be redis_session_connection_failed(session: Session,
599+
reason: ConnectionFailureReason)
600+
=>
587601
_h.fail("Connection failed")
588602
_h.complete(false)
589603

@@ -659,7 +673,9 @@ actor \nodoc\ _PipelineCloseClient is (SessionStatusNotify & ResultReceiver)
659673
_h.complete(false)
660674
end
661675

662-
be redis_session_connection_failed(session: Session) =>
676+
be redis_session_connection_failed(session: Session,
677+
reason: ConnectionFailureReason)
678+
=>
663679
_h.fail("Connection failed")
664680
_h.complete(false)
665681

@@ -709,7 +725,9 @@ actor \nodoc\ _ServerErrorClient is (SessionStatusNotify & ResultReceiver)
709725
_h.fail("Command failed: " + failure.message())
710726
_h.complete(false)
711727

712-
be redis_session_connection_failed(session: Session) =>
728+
be redis_session_connection_failed(session: Session,
729+
reason: ConnectionFailureReason)
730+
=>
713731
_h.fail("Connection failed")
714732
_h.complete(false)
715733

@@ -798,7 +816,9 @@ actor \nodoc\ _PubSubClient is
798816
_h.fail("Command failed: " + failure.message())
799817
_h.complete(false)
800818

801-
be redis_session_connection_failed(session: Session) =>
819+
be redis_session_connection_failed(session: Session,
820+
reason: ConnectionFailureReason)
821+
=>
802822
_h.fail("Connection failed")
803823
_h.complete(false)
804824

@@ -895,7 +915,9 @@ actor \nodoc\ _PubSubPatternClient is
895915
_h.fail("Command failed: " + failure.message())
896916
_h.complete(false)
897917

898-
be redis_session_connection_failed(session: Session) =>
918+
be redis_session_connection_failed(session: Session,
919+
reason: ConnectionFailureReason)
920+
=>
899921
_h.fail("Connection failed")
900922
_h.complete(false)
901923

@@ -967,7 +989,9 @@ actor \nodoc\ _ExecuteWhileSubscribedClient is
967989
_h.fail("Should not have received a response while subscribed")
968990
_h.complete(false)
969991

970-
be redis_session_connection_failed(session: Session) =>
992+
be redis_session_connection_failed(session: Session,
993+
reason: ConnectionFailureReason)
994+
=>
971995
_h.fail("Connection failed")
972996
_h.complete(false)
973997

@@ -1050,7 +1074,9 @@ actor \nodoc\ _PubSubBackToReadyClient is
10501074
_h.fail("Command failed: " + failure.message())
10511075
_h.complete(false)
10521076

1053-
be redis_session_connection_failed(session: Session) =>
1077+
be redis_session_connection_failed(session: Session,
1078+
reason: ConnectionFailureReason)
1079+
=>
10541080
_h.fail("Connection failed")
10551081
_h.complete(false)
10561082

@@ -1168,7 +1194,9 @@ actor \nodoc\ _PipelineDrainClient is
11681194
_h.fail("Command failed: " + failure.message())
11691195
_h.complete(false)
11701196

1171-
be redis_session_connection_failed(session: Session) =>
1197+
be redis_session_connection_failed(session: Session,
1198+
reason: ConnectionFailureReason)
1199+
=>
11721200
_h.fail("Connection failed")
11731201
_h.complete(false)
11741202

@@ -1211,7 +1239,9 @@ actor \nodoc\ _SSLConnectionFailureNotify is SessionStatusNotify
12111239
new create(h: TestHelper) =>
12121240
_h = h
12131241

1214-
be redis_session_connection_failed(session: Session) =>
1242+
be redis_session_connection_failed(session: Session,
1243+
reason: ConnectionFailureReason)
1244+
=>
12151245
_done = true
12161246
_h.complete(true)
12171247

@@ -1260,7 +1290,9 @@ actor \nodoc\ _SSLConnectAndReadyNotify is SessionStatusNotify
12601290
_done = true
12611291
_h.complete(true)
12621292

1263-
be redis_session_connection_failed(session: Session) =>
1293+
be redis_session_connection_failed(session: Session,
1294+
reason: ConnectionFailureReason)
1295+
=>
12641296
_h.fail("SSL connection failed")
12651297
_h.complete(false)
12661298

@@ -1356,7 +1388,9 @@ actor \nodoc\ _SSLSetAndGetClient is (SessionStatusNotify & ResultReceiver)
13561388
_h.fail("Command failed: " + failure.message())
13571389
_h.complete(false)
13581390

1359-
be redis_session_connection_failed(session: Session) =>
1391+
be redis_session_connection_failed(session: Session,
1392+
reason: ConnectionFailureReason)
1393+
=>
13601394
_h.fail("SSL connection failed")
13611395
_h.complete(false)
13621396

@@ -1394,7 +1428,9 @@ actor \nodoc\ _Resp3ConnectAndReadyNotify is SessionStatusNotify
13941428
_done = true
13951429
_h.complete(true)
13961430

1397-
be redis_session_connection_failed(session: Session) =>
1431+
be redis_session_connection_failed(session: Session,
1432+
reason: ConnectionFailureReason)
1433+
=>
13981434
_h.fail("Connection failed")
13991435
_h.complete(false)
14001436

@@ -1484,7 +1520,9 @@ actor \nodoc\ _Resp3SetAndGetClient is (SessionStatusNotify & ResultReceiver)
14841520
_h.fail("Command failed: " + failure.message())
14851521
_h.complete(false)
14861522

1487-
be redis_session_connection_failed(session: Session) =>
1523+
be redis_session_connection_failed(session: Session,
1524+
reason: ConnectionFailureReason)
1525+
=>
14881526
_h.fail("Connection failed")
14891527
_h.complete(false)
14901528

@@ -1575,7 +1613,9 @@ actor \nodoc\ _Resp3FallbackClient is (SessionStatusNotify & ResultReceiver)
15751613
_h.fail("Command failed: " + failure.message())
15761614
_h.complete(false)
15771615

1578-
be redis_session_connection_failed(session: Session) =>
1616+
be redis_session_connection_failed(session: Session,
1617+
reason: ConnectionFailureReason)
1618+
=>
15791619
_h.fail("Connection to RESP2-only server failed")
15801620
_h.complete(false)
15811621

@@ -1653,7 +1693,9 @@ actor \nodoc\ _CommandApiSetAndGetClient is
16531693
_h.fail("Command failed: " + failure.message())
16541694
_h.complete(false)
16551695

1656-
be redis_session_connection_failed(session: Session) =>
1696+
be redis_session_connection_failed(session: Session,
1697+
reason: ConnectionFailureReason)
1698+
=>
16571699
_h.fail("Connection failed")
16581700
_h.complete(false)
16591701

@@ -1783,7 +1825,9 @@ actor \nodoc\ _BackpressureOverflowClient is
17831825
_h.complete(false)
17841826
end
17851827

1786-
be redis_session_connection_failed(session: Session) =>
1828+
be redis_session_connection_failed(session: Session,
1829+
reason: ConnectionFailureReason)
1830+
=>
17871831
_h.fail("Connection to fake server failed")
17881832
_h.complete(false)
17891833

0 commit comments

Comments
 (0)