Skip to content

Commit f248f59

Browse files
authored
Merge pull request #862 from jwilger/transaction_manager_errors
Improved Exceptions in TransactionManager
2 parents fb7b9ea + 2915dce commit f248f59

File tree

2 files changed

+25
-22
lines changed

2 files changed

+25
-22
lines changed

Diff for: lib/kafka/transaction_manager.rb

+13-8
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def add_partitions_to_transaction(topic_partitions)
9595
force_transactional!
9696

9797
if @transaction_state.uninitialized?
98-
raise 'Transaction is uninitialized'
98+
raise Kafka::InvalidTxnStateError, 'Transaction is uninitialized'
9999
end
100100

101101
# Extract newly created partitions
@@ -138,8 +138,8 @@ def add_partitions_to_transaction(topic_partitions)
138138

139139
def begin_transaction
140140
force_transactional!
141-
raise 'Transaction has already started' if @transaction_state.in_transaction?
142-
raise 'Transaction is not ready' unless @transaction_state.ready?
141+
raise Kafka::InvalidTxnStateError, 'Transaction has already started' if @transaction_state.in_transaction?
142+
raise Kafka::InvalidTxnStateError, 'Transaction is not ready' unless @transaction_state.ready?
143143
@transaction_state.transition_to!(TransactionStateMachine::IN_TRANSACTION)
144144

145145
@logger.info "Begin transaction #{@transactional_id}, Producer ID: #{@producer_id} (Epoch #{@producer_epoch})"
@@ -159,7 +159,7 @@ def commit_transaction
159159
end
160160

161161
unless @transaction_state.in_transaction?
162-
raise 'Transaction is not valid to commit'
162+
raise Kafka::InvalidTxnStateError, 'Transaction is not valid to commit'
163163
end
164164

165165
@transaction_state.transition_to!(TransactionStateMachine::COMMITTING_TRANSACTION)
@@ -192,7 +192,8 @@ def abort_transaction
192192
end
193193

194194
unless @transaction_state.in_transaction?
195-
raise 'Transaction is not valid to abort'
195+
@logger.warn('Aborting transaction that was never opened on brokers')
196+
return
196197
end
197198

198199
@transaction_state.transition_to!(TransactionStateMachine::ABORTING_TRANSACTION)
@@ -221,7 +222,7 @@ def send_offsets_to_txn(offsets:, group_id:)
221222
force_transactional!
222223

223224
unless @transaction_state.in_transaction?
224-
raise 'Transaction is not valid to send offsets'
225+
raise Kafka::InvalidTxnStateError, 'Transaction is not valid to send offsets'
225226
end
226227

227228
add_response = transaction_coordinator.add_offsets_to_txn(
@@ -250,6 +251,10 @@ def error?
250251
@transaction_state.error?
251252
end
252253

254+
def ready?
255+
@transaction_state.ready?
256+
end
257+
253258
def close
254259
if in_transaction?
255260
@logger.warn("Aborting pending transaction ...")
@@ -264,11 +269,11 @@ def close
264269

265270
def force_transactional!
266271
unless transactional?
267-
raise 'Please turn on transactional mode to use transaction'
272+
raise Kafka::InvalidTxnStateError, 'Please turn on transactional mode to use transaction'
268273
end
269274

270275
if @transactional_id.nil? || @transactional_id.empty?
271-
raise 'Please provide a transaction_id to use transactional mode'
276+
raise Kafka::InvalidTxnStateError, 'Please provide a transaction_id to use transactional mode'
272277
end
273278
end
274279

Diff for: spec/transaction_manager_spec.rb

+12-14
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@
210210
manager.add_partitions_to_transaction(
211211
'hello' => [1, 2, 3]
212212
)
213-
end.to raise_error(/please turn on transactional mode/i)
213+
end.to raise_error(Kafka::InvalidTxnStateError, /please turn on transactional mode/i)
214214
end
215215
end
216216
end
@@ -256,7 +256,7 @@
256256
it 'raises exception' do
257257
expect do
258258
manager.init_transactions
259-
end.to raise_error(/please turn on transactional mode/i)
259+
end.to raise_error(Kafka::InvalidTxnStateError, /please turn on transactional mode/i)
260260
end
261261

262262
it 'changes state to error' do
@@ -291,7 +291,7 @@
291291
it 'raises exception' do
292292
expect do
293293
manager.begin_transaction
294-
end.to raise_error(/transaction has already started/i)
294+
end.to raise_error(Kafka::InvalidTxnStateError, /transaction has already started/i)
295295
end
296296

297297
it 'changes state to error' do
@@ -306,7 +306,7 @@
306306
it 'raises exception' do
307307
expect do
308308
manager.begin_transaction
309-
end.to raise_error(/transaction is not ready/i)
309+
end.to raise_error(Kafka::InvalidTxnStateError, /transaction is not ready/i)
310310
end
311311

312312
it 'changes state to error' do
@@ -325,7 +325,7 @@
325325
it 'raises exception' do
326326
expect do
327327
manager.begin_transaction
328-
end.to raise_error(/please turn on transactional mode/i)
328+
end.to raise_error(Kafka::InvalidTxnStateError, /please turn on transactional mode/i)
329329
end
330330

331331
it 'changes state to error' do
@@ -401,17 +401,15 @@
401401
manager.init_transactions
402402
end
403403

404-
it 'raises exception' do
405-
expect do
406-
manager.abort_transaction
407-
end.to raise_error(/transaction is not valid to abort/i)
404+
it 'does not raise an exception' do
405+
expect { manager.abort_transaction }.not_to raise_error
408406
end
409407

410-
it 'changes state to error' do
408+
it 'leaves transaction manager in ready state' do
411409
begin
412410
manager.abort_transaction
413411
rescue; end
414-
expect(manager.error?).to eql(true)
412+
expect(manager.ready?).to eql(true)
415413
end
416414
end
417415

@@ -423,7 +421,7 @@
423421
it 'raises exception' do
424422
expect do
425423
manager.abort_transaction
426-
end.to raise_error(/please turn on transactional mode/i)
424+
end.to raise_error(Kafka::InvalidTxnStateError, /please turn on transactional mode/i)
427425
end
428426

429427
it 'changes state to error' do
@@ -502,7 +500,7 @@
502500
it 'raises exception' do
503501
expect do
504502
manager.commit_transaction
505-
end.to raise_error(/transaction is not valid to commit/i)
503+
end.to raise_error(Kafka::InvalidTxnStateError, /transaction is not valid to commit/i)
506504
end
507505

508506
it 'changes state to error' do
@@ -521,7 +519,7 @@
521519
it 'raises exception' do
522520
expect do
523521
manager.commit_transaction
524-
end.to raise_error(/please turn on transactional mode/i)
522+
end.to raise_error(Kafka::InvalidTxnStateError, /please turn on transactional mode/i)
525523
end
526524

527525
it 'changes state to error' do

0 commit comments

Comments
 (0)