private void readLog( String standby, int bucket, Position pos, int batchSize, Entrys entrys, boolean availableRollback, int deep) { if (deep > 50) { return; } long fileNumber = pos.fileNumber(); if (!logQ.contains(fileNumber)) { throw new IfileNotFoundException( bucket + "-bucket log file[" + fileNumber + "] does not exist!"); } String key = generateKey(standby, bucket, fileNumber); LogReader0 logReader = logCache.get(key); if (logReader == null) { return; } if (availableRollback) { if (pos.pointer() > 0) { logger.warn("{}-bucket log happen rollback, position={}.", bucket, pos); logReader.setPosition(pos.pointer()); } else { // 设置回滚点 pos.pointer(logReader.pointer()); } } boolean full = false; for (Slice record = logReader.readRecord(); record != null; record = logReader.readRecord()) { SliceInput sliceInput = record.input(); // read header if (sliceInput.available() < 12) { logReader.reportCorruption(sliceInput.available(), "log record too small"); continue; } long sequenceBegin = sliceInput.readLong(); int updateSize = sliceInput.readInt(); // read entries try { int c = readWriteBatch(bucket, sliceInput, updateSize, entrys); if (c < 1) { continue; } } catch (IOException e) { Throwables.propagate(e); } // update the maxSequence pos.curMaxSeq(sequenceBegin + updateSize - 1); pos.maxSeq(pos.curMaxSeq()); if (entrys.size() >= batchSize) { full = true; break; } } if (!full && logReader.eof(logsOffset.get(fileNumber))) { boolean next = false; for (long n : logQ) { if (next) { pos.fileNumber(n); break; } if (n == fileNumber) { next = true; } } if (fileNumber != pos.fileNumber()) { if (entrys.size() < batchSize) { readLog(standby, bucket, pos, batchSize, entrys, false, ++deep); } } } }