@@ -70,6 +70,7 @@ def get_id(self) -> str:
7070class MarkerResult :
7171 data : bytes = None
7272 access_count : int = 0
73+ replayed = False
7374
7475
7576@dataclass
@@ -80,29 +81,42 @@ class MarkerHandler:
8081
8182 def record_mutable_marker (self , id : str , event_id : int , data : bytes , access_count : int ):
8283 marker = MarkerData .create (id = id , event_id = event_id , data = data , access_count = access_count )
83- self .mutable_marker_results [id ] = MarkerResult (data = data )
84+ if id in self .mutable_marker_results :
85+ self .mutable_marker_results [id ].replayed = True
86+ else :
87+ self .mutable_marker_results [id ] = MarkerResult (data = data )
8488 self .decision_context .record_marker (self .marker_name , marker .get_header (), data )
8589
86- def handle (self , id : str , func ) -> bytes :
87- result : MarkerResult = self .mutable_marker_results .get (id )
88- stored : bytes = None
89- if result :
90- stored = result .data
91- event_id = self .decision_context .decider .next_decision_event_id
92- access_count = 0 if result is None else result .access_count
93- if self .decision_context .is_replaying ():
94- data : bytes = self .get_marker_data_from_history (event_id , id , access_count )
95- if data :
96- self .record_mutable_marker (id , event_id , data , access_count )
97- return data
98- return stored
99- to_store = func (stored )
100- if to_store :
101- data = to_store
102- self .record_mutable_marker (id , event_id , data , access_count )
103- return to_store
104- return stored
90+ # Sets data without creating a decision - used when DEFAULT_VERSION is the implicit current version
91+ def set_data (self , id , data : bytes ):
92+ self .mutable_marker_results [id ] = MarkerResult (data = data )
10593
94+ def mark_replayed (self , id ):
95+ self .mutable_marker_results [id ].replayed = True
96+
97+ def handle (self , id : str , func ) -> Optional [bytes ]:
98+ event_id = self .decision_context .decider .next_decision_event_id
99+ result : MarkerResult = self .mutable_marker_results .get (id )
100+ if result or self .decision_context .is_replaying ():
101+ if result :
102+ if self .decision_context .is_replaying () and not result .replayed :
103+ # Need to insert marker to ensure that event_id is incremented
104+ self .record_mutable_marker (id , event_id , result .data , 0 )
105+ return result .data
106+ else :
107+ return None
108+ else :
109+ to_store = func ()
110+ if to_store :
111+ data = to_store
112+ self .record_mutable_marker (id , event_id , data , 0 )
113+ return to_store
114+ else :
115+ # TODO: Should this ever happen? - at least for version it will never happen
116+ pass
117+
118+ # This method is currently not being used - after adopting the version logic from the
119+ # Golang client
106120 def get_marker_data_from_history (self , event_id : int , marker_id : str , expected_access_count : int ) -> \
107121 Optional [bytes ]:
108122 event : HistoryEvent = self .decision_context .decider .get_optional_decision_event (event_id )
0 commit comments