Skip to content

Commit 492a959

Browse files
committed
fix sync issues
1 parent 33f1b8c commit 492a959

File tree

3 files changed

+32
-23
lines changed

3 files changed

+32
-23
lines changed

system/loggerd/loggerd.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,11 @@ size_t write_encode_data(LoggerdState *s, cereal::Event::Reader event, RemoteEnc
9999
int handle_encoder_msg(LoggerdState *s, Message *msg, std::string &name, struct RemoteEncoder &re, const EncoderInfo &encoder_info) {
100100
capnp::FlatArrayMessageReader cmsg(kj::ArrayPtr<capnp::word>((capnp::word *)msg->getData(), msg->getSize() / sizeof(capnp::word)));
101101
auto event = cmsg.getRoot<cereal::Event>();
102-
auto edata = (event.*(encoder_info.get_encode_data_func))();
103-
auto idx = edata.getIdx();
102+
auto encoder_idx = (event.*(encoder_info.get_encode_data_func))().getIdx();
104103

105104
int bytes_count = 0;
106105
// Synchronize segment and process if aligned
107-
if (re.syncSegment(s, name, idx.getSegmentNum(), s->logger.segment())) {
106+
if (re.syncSegment(s, name, encoder_idx.getSegmentNum(), s->logger.segment())) {
108107
// Process any queued messages before the current one
109108
if (!re.q.empty()) {
110109
for (auto qmsg : re.q) {

system/loggerd/loggerd.h

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -161,52 +161,61 @@ struct LoggerdState {
161161
class RemoteEncoder {
162162
public:
163163
std::unique_ptr<VideoWriter> writer;
164-
int encoder_segment_offset;
164+
int encoder_segment_offset = 0;
165165
int current_segment = -1;
166166
std::vector<Message *> q;
167167
int dropped_frames = 0;
168168
bool recording = false;
169169
bool marked_ready_to_rotate = false;
170170
bool seen_first_packet = false;
171171

172-
bool syncSegment(LoggerdState *s, const std::string &name, int encoder_segment_num, int log_segment_num) {
172+
bool syncSegment(LoggerdState *s, const std::string &name, int encoder_segment, int logger_segment) {
173173
if (!seen_first_packet) {
174174
seen_first_packet = true;
175-
encoder_segment_offset = log_segment_num;
175+
encoder_segment_offset = encoder_segment - logger_segment;
176176
LOGD("%s: has encoderd offset %d", name.c_str(), encoder_segment_offset);
177177
}
178-
int offset_segment_num = encoder_segment_num - encoder_segment_offset;
179-
printf("offset %d encoder_segment_offset: %d, log_segment_num:%d\n", offset_segment_num, encoder_segment_offset, log_segment_num);
180-
if (offset_segment_num == log_segment_num) {
181-
// loggerd is now on the segment that matches this packet
182178

183-
// if this is a new segment, we close any possible old segments, move to the new, and process any queued packets
184-
if (current_segment != log_segment_num) {
179+
// Calculate adjusted segment based on offset
180+
int adjusted_segment = encoder_segment - encoder_segment_offset;
181+
182+
// Case 1: Segments are synchronized
183+
if (adjusted_segment == logger_segment) {
184+
if (current_segment != logger_segment) {
185+
// New segment detected; reset writer if recording
185186
if (recording) {
186187
writer.reset();
187188
recording = false;
188189
}
189-
current_segment = log_segment_num;
190-
marked_ready_to_rotate = false;
190+
current_segment = logger_segment;
191191
}
192+
marked_ready_to_rotate = false;
192193
return true;
193194
}
194195

195-
if (offset_segment_num > log_segment_num) {
196-
// encoderd packet has a newer segment, this means encoderd has rolled over
196+
// Case 2: Encoder is ahead (newer segment)
197+
if (adjusted_segment > logger_segment) {
198+
int segment_gap = adjusted_segment - logger_segment;
199+
if (segment_gap > 1) {
200+
LOGE("%s: encoder jumped ahead by %d segments (adj=%d, log=%d), adjusting offset",
201+
name.c_str(), segment_gap, adjusted_segment, logger_segment);
202+
encoder_segment_offset += segment_gap - 1;
203+
}
204+
197205
if (!marked_ready_to_rotate) {
198206
marked_ready_to_rotate = true;
199207
++s->ready_to_rotate;
200208
LOGD("rotate %d -> %d ready %d/%d for %s",
201-
log_segment_num, offset_segment_num,
209+
logger_segment, adjusted_segment,
202210
s->ready_to_rotate.load(), s->max_waiting, name.c_str());
203211
}
204-
} else {
205-
LOGE("%s: encoderd packet has a older segment!!! idx.getSegmentNum():%d s->logger.segment():%d re.encoder_segment_offset:%d",
206-
name.c_str(), encoder_segment_num, log_segment_num, encoder_segment_offset);
207-
// free the message, it's useless. this should never happen
208-
// actually, this can happen if you restart encoderd
209-
encoder_segment_offset = -log_segment_num;
212+
213+
}
214+
// Case 3: Encoder is behind (older segment)
215+
else {
216+
LOGE("%s: encoderd packet has a older segment!!! idx.getSegmentNum():%d s->logger.segment():%d encoder_segment_offset:%d",
217+
name.c_str(), encoder_segment, logger_segment, encoder_segment_offset);
218+
encoder_segment_offset = encoder_segment - logger_segment;
210219
}
211220
return false;
212221
}

system/loggerd/tests/test_logger.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ TEST_CASE("RemoteEncoder::syncSegment robustness", "[sync]") {
150150
REQUIRE(encoder.encoder_segment_offset == 1); // Adjusted: += (2 - 1) = 1
151151
REQUIRE(encoder.marked_ready_to_rotate == true);
152152
REQUIRE(state.ready_to_rotate == 1);
153+
REQUIRE(encoder.syncSegment(&state, name, 2, 0) == false);
153154

154155
// Logger advances to 1, encoder at 2
155156
state.ready_to_rotate = 0;

0 commit comments

Comments
 (0)