Commit 87eee431 authored by Julien Muchembled's avatar Julien Muchembled

Fix replication of unfinished imported transactions

parent 4d3f3723
...@@ -53,7 +53,10 @@ class StorageServiceHandler(BaseServiceHandler): ...@@ -53,7 +53,10 @@ class StorageServiceHandler(BaseServiceHandler):
last_tid = app.pt.getBackupTid(min) last_tid = app.pt.getBackupTid(min)
pending_list = () pending_list = ()
else: else:
last_tid = app.tm.getLastTID() # This can't be app.tm.getLastTID() for imported transactions,
# because outdated cells must at least wait that they're locked.
# For normal transactions, it would not matter.
last_tid = app.getLastTransaction()
pending_list = app.tm.registerForNotification(conn.getUUID()) pending_list = app.tm.registerForNotification(conn.getUUID())
p = Packets.AnswerUnfinishedTransactions(last_tid, pending_list) p = Packets.AnswerUnfinishedTransactions(last_tid, pending_list)
conn.answer(p) conn.answer(p)
......
...@@ -183,6 +183,10 @@ class StorageOperationHandler(EventHandler): ...@@ -183,6 +183,10 @@ class StorageOperationHandler(EventHandler):
if app.tm.isLockedTid(max_tid): if app.tm.isLockedTid(max_tid):
# Wow, backup cluster is fast. Requested transactions are still in # Wow, backup cluster is fast. Requested transactions are still in
# ttrans/ttobj so wait a little. # ttrans/ttobj so wait a little.
# This can also happen for internal replication, when
# NotifyTransactionFinished(M->S) + AskFetchTransactions(S->S)
# is faster than
# NotifyUnlockInformation(M->S)
app.queueEvent(self.askFetchTransactions, conn, app.queueEvent(self.askFetchTransactions, conn,
(partition, length, min_tid, max_tid, tid_list)) (partition, length, min_tid, max_tid, tid_list))
return return
......
...@@ -92,6 +92,7 @@ class Replicator(object): ...@@ -92,6 +92,7 @@ class Replicator(object):
def setUnfinishedTIDList(self, max_tid, ttid_list, offset_list): def setUnfinishedTIDList(self, max_tid, ttid_list, offset_list):
"""This is a callback from MasterOperationHandler.""" """This is a callback from MasterOperationHandler."""
assert self.ttid_set.issubset(ttid_list), (self.ttid_set, ttid_list)
if ttid_list: if ttid_list:
self.ttid_set.update(ttid_list) self.ttid_set.update(ttid_list)
max_ttid = max(ttid_list) max_ttid = max(ttid_list)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment