Skip to content

Commit 370fd11

Browse files
committed
feat: make errors more informative
1 parent aebdf13 commit 370fd11

File tree

16 files changed

+92
-71
lines changed

16 files changed

+92
-71
lines changed

src/tgdb/application/horizon/commit_transaction.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ async def __call__(
4141
"""
4242
:raises tgdb.application.relation.ports.relations.NoRelationError:
4343
:raises tgdb.entities.horizon.horizon.NoTransactionError:
44-
:raises tgdb.entities.horizon.horizon.InvalidTransactionStateError:
44+
:raises tgdb.entities.horizon.horizon.TransactionCommittingError:
4545
:raises tgdb.entities.horizon.transaction.ConflictError:
4646
"""
4747

src/tgdb/application/horizon/output_commits.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
from tgdb.application.horizon.ports.channel import Channel
88
from tgdb.application.horizon.ports.shared_horizon import SharedHorizon
99
from tgdb.entities.horizon.horizon import (
10-
InvalidTransactionStateError,
1110
NoTransactionError,
11+
TransactionNotCommittingError,
1212
)
1313
from tgdb.entities.horizon.transaction import XID, Commit, PreparedCommit
1414

@@ -28,7 +28,7 @@ async def __call__(self) -> None:
2828

2929
ok_commit_xids = list[XID]()
3030
error_commit_map = dict[
31-
XID, NoTransactionError | InvalidTransactionStateError
31+
XID, NoTransactionError | TransactionNotCommittingError
3232
]()
3333

3434
async with self.shared_horizon as horizon:
@@ -38,7 +38,7 @@ async def __call__(self) -> None:
3838
try:
3939
horizon.complete_commit(time, prepared_commit.xid)
4040
except (
41-
NoTransactionError, InvalidTransactionStateError
41+
NoTransactionError, TransactionNotCommittingError
4242
) as error:
4343
error_commit_map[prepared_commit.xid] = error
4444
else:

src/tgdb/application/horizon/ports/channel.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
from dataclasses import dataclass
44

55
from tgdb.entities.horizon.horizon import (
6-
InvalidTransactionStateError,
76
NoTransactionError,
7+
TransactionNotCommittingError,
88
)
99
from tgdb.entities.horizon.transaction import XID
1010

1111

1212
@dataclass(frozen=True)
1313
class Notification:
14-
error: NoTransactionError | InvalidTransactionStateError | None
14+
error: NoTransactionError | TransactionNotCommittingError | None
1515

1616

1717
class Channel(ABC):
@@ -20,7 +20,7 @@ async def publish(
2020
self,
2121
ok_commit_xids: Sequence[XID],
2222
error_commit_map: Mapping[
23-
XID, NoTransactionError | InvalidTransactionStateError
23+
XID, NoTransactionError | TransactionNotCommittingError
2424
],
2525
/,
2626
) -> None: ...

src/tgdb/application/horizon/rollback_transaction.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class RollbackTransaction:
1515
async def __call__(self, xid: XID) -> None:
1616
"""
1717
:raises tgdb.entities.horizon.horizon.NoTransactionError:
18+
:raises tgdb.entities.horizon.horizon.TransactionCommittingError:
1819
"""
1920

2021
time = await self.clock

src/tgdb/application/horizon/start_transaction.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ class StartTransaction:
1616
clock: Clock
1717

1818
async def __call__(self, isolation_level: IsolationLevel) -> XID:
19-
"""
20-
:raises tgdb.entities.horizon.horizon.InvalidTransactionStateError:
21-
"""
22-
2319
time = await self.clock
2420
xid = await self.uuids.random_uuid()
2521

src/tgdb/application/relation/view_tuples.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ async def __call__(
3030
"""
3131
:raises tgdb.application.relation.ports.relations.NoRelationError:
3232
:raises tgdb.entities.horizon.horizon.NoTransactionError:
33-
:raises tgdb.entities.horizon.horizon.InvalidTransactionStateError:
33+
:raises tgdb.entities.horizon.horizon.TransactionCommittingError:
3434
"""
3535

3636
tuples = await self.tuples.tuples_with_attribute(

src/tgdb/entities/horizon/horizon.py

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,13 @@
3030
class NoTransactionError(Exception): ...
3131

3232

33-
class InvalidTransactionStateError(Exception): ...
33+
class DoubleStartTransactionError(Exception): ...
34+
35+
36+
class TransactionCommittingError(Exception): ...
37+
38+
39+
class TransactionNotCommittingError(Exception): ...
3440

3541

3642
class HorizonAlwaysWithoutTransactionsError(Exception): ...
@@ -76,12 +82,12 @@ def start_transaction(
7682
) -> XID:
7783
"""
7884
:raises tgdb.entities.horizon.horizon.NotMonotonicTimeError:
79-
:raises tgdb.entities.horizon.horizon.InvalidTransactionStateError:
85+
:raises tgdb.entities.horizon.horizon.DoubleStartTransactionError:
8086
"""
8187

8288
assert_(
8389
all(xid not in map for map in self._transaction_maps()),
84-
else_=InvalidTransactionStateError,
90+
else_=DoubleStartTransactionError,
8591
)
8692

8793
started_transaction = start_transaction(
@@ -107,25 +113,32 @@ def include(
107113
"""
108114
:raises tgdb.entities.horizon.horizon.NotMonotonicTimeError:
109115
:raises tgdb.entities.horizon.horizon.NoTransactionError:
110-
:raises tgdb.entities.horizon.horizon.InvalidTransactionStateError:
116+
:raises tgdb.entities.horizon.horizon.TransactionCommittingError:
111117
"""
112118

113119
self.move_to_future(time)
114120

115121
transaction = self._transaction(
116-
xid, SerializableTransactionState.active
122+
xid,
123+
SerializableTransactionState.active,
124+
else_=TransactionCommittingError,
117125
)
118126
transaction.include(effect)
119127

120128
def rollback_transaction(self, time: LogicTime, xid: XID) -> None:
121129
"""
122130
:raises tgdb.entities.horizon.horizon.NotMonotonicTimeError:
123131
:raises tgdb.entities.horizon.horizon.NoTransactionError:
132+
:raises tgdb.entities.horizon.horizon.TransactionCommittingError:
124133
"""
125134

126135
self.move_to_future(time)
127136

128-
transaction = self._transaction(xid)
137+
transaction = self._transaction(
138+
xid,
139+
SerializableTransactionState.active,
140+
else_=TransactionCommittingError,
141+
)
129142
transaction.rollback()
130143
del self._transaction_map(transaction)[transaction.xid()]
131144

@@ -138,14 +151,15 @@ def commit_transaction(
138151
"""
139152
:raises tgdb.entities.horizon.horizon.NotMonotonicTimeError:
140153
:raises tgdb.entities.horizon.horizon.NoTransactionError:
141-
:raises tgdb.entities.horizon.horizon.InvalidTransactionStateError:
154+
:raises tgdb.entities.horizon.horizon.TransactionCommittingError:
142155
:raises tgdb.entities.horizon.transaction.ConflictError:
143156
"""
144157

145158
self.move_to_future(time)
146159

147160
transaction = self._transaction(
148-
xid, SerializableTransactionState.active
161+
xid, SerializableTransactionState.active,
162+
else_=TransactionCommittingError(),
149163
)
150164

151165
for effect in effects:
@@ -165,14 +179,15 @@ def commit_transaction(
165179
def complete_commit(self, time: LogicTime, xid: XID) -> Commit:
166180
"""
167181
:raises tgdb.entities.horizon.horizon.NoTransactionError:
168-
:raises tgdb.entities.horizon.horizon.InvalidTransactionStateError:
182+
:raises tgdb.entities.horizon.horizon.TransactionNotCommittingError:
169183
"""
170184

171185
self.move_to_future(time)
172186

173187
transaction = self._serializable_transaction(
174188
xid,
175189
SerializableTransactionState.prepared,
190+
else_=TransactionNotCommittingError,
176191
)
177192

178193
commit = transaction.commit()
@@ -236,10 +251,12 @@ def _serializable_transaction(
236251
self,
237252
xid: XID,
238253
state: SerializableTransactionState | None = None,
254+
*,
255+
else_: Exception | type[Exception],
239256
) -> SerializableTransaction:
240257
"""
241258
:raises tgdb.entities.horizon.horizon.NoTransactionError:
242-
:raises tgdb.entities.horizon.horizon.InvalidTransactionStateError:
259+
:raises else_:
243260
"""
244261

245262
transaction = self._serializable_transaction_map.get(xid)
@@ -251,7 +268,7 @@ def _serializable_transaction(
251268
transaction.rollback()
252269
del self._serializable_transaction_map[xid]
253270

254-
raise InvalidTransactionStateError
271+
raise else_
255272

256273
return transaction
257274

@@ -273,16 +290,18 @@ def _transaction(
273290
self,
274291
xid: XID,
275292
state: SerializableTransactionState | None = None,
293+
*,
294+
else_: Exception | type[Exception],
276295
) -> Transaction:
277296
"""
278297
:raises tgdb.entities.horizon.horizon.NoTransactionError:
279-
:raises tgdb.entities.horizon.horizon.InvalidTransactionStateError:
298+
:raises else_:
280299
"""
281300

282301
with suppress(NoTransactionError):
283302
return self._non_serializable_read_transaction(xid)
284303

285-
return self._serializable_transaction(xid, state)
304+
return self._serializable_transaction(xid, state, else_=else_)
286305

287306
def _transaction_maps(self) -> Iterable[Mapping[XID, Transaction]]:
288307
yield self._serializable_transaction_map

src/tgdb/infrastructure/adapters/channel.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
from tgdb.application.horizon.ports.channel import Channel, Notification
55
from tgdb.entities.horizon.horizon import (
6-
InvalidTransactionStateError,
76
NoTransactionError,
7+
TransactionNotCommittingError,
88
)
99
from tgdb.entities.horizon.transaction import XID
1010
from tgdb.infrastructure.async_map import AsyncMap
@@ -13,14 +13,14 @@
1313
@dataclass(frozen=True)
1414
class AsyncMapChannel(Channel):
1515
_async_map: AsyncMap[
16-
XID, NoTransactionError | InvalidTransactionStateError | None
16+
XID, NoTransactionError | TransactionNotCommittingError | None
1717
]
1818

1919
async def publish(
2020
self,
2121
ok_commit_xids: Sequence[XID],
2222
error_commit_map: Mapping[
23-
XID, NoTransactionError | InvalidTransactionStateError
23+
XID, NoTransactionError | TransactionNotCommittingError
2424
],
2525
) -> None:
2626
for ok_commit_xid in ok_commit_xids:

src/tgdb/infrastructure/adapters/relations.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ async def relation(self, relation_number: Number) -> Relation:
2424
lambda it: it.number() == relation_number
2525
)
2626
if relation is None:
27-
raise NoRelationError
27+
raise NoRelationError(relation_number)
2828

2929
return relation
3030

src/tgdb/presentation/fastapi/horizon/error_handling.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
from fastapi.responses import JSONResponse
33

44
from tgdb.entities.horizon.horizon import (
5-
InvalidTransactionStateError,
65
NoTransactionError,
6+
TransactionCommittingError,
77
)
88
from tgdb.entities.horizon.transaction import ConflictError
99
from tgdb.presentation.fastapi.horizon.schemas.error import (
10-
InvalidTransactionStateSchema,
1110
NoTransactionSchema,
11+
TransactionCommittingSchema,
1212
TransactionConflictSchema,
1313
)
1414

@@ -30,10 +30,10 @@ def _(_: object, __: object) -> Response:
3030
status_code=status.HTTP_404_NOT_FOUND,
3131
)
3232

33-
@app.exception_handler(InvalidTransactionStateError)
33+
@app.exception_handler(TransactionCommittingError)
3434
def _(_: object, __: object) -> Response:
35-
schema = InvalidTransactionStateSchema()
35+
schema = TransactionCommittingSchema()
3636
return JSONResponse(
3737
schema.model_dump(mode="json", by_alias=True),
38-
status_code=status.HTTP_404_NOT_FOUND,
38+
status_code=status.HTTP_400_BAD_REQUEST,
3939
)

0 commit comments

Comments
 (0)