static CycleLog fromBytes(DataInputStream stream, StoreKeyFactory storeKeyFactory) throws IOException {
      CompactionDetails compactionDetails = CompactionDetails.fromBytes(stream);
      CycleLog cycleLog = new CycleLog(compactionDetails);
      cycleLog.copyStartTime = stream.readLong();
      cycleLog.commitStartTime = stream.readLong();
      cycleLog.cleanupStartTime = stream.readLong();
      cycleLog.cycleEndTime = stream.readLong();
      cycleLog.safeToken =
          stream.readByte() == STORE_TOKEN_PRESENT ? StoreFindToken.fromBytes(stream, storeKeyFactory) : null;
      return cycleLog;
    }
Create a log for a compaction cycle from a {@code stream}.
@param stream the {@link DataInputStream} that represents the serialized object.
@param storeKeyFactory the {@link StoreKeyFactory} used to generate the {@link StoreFindToken}.
@return a {@link CycleLog} that represents a cycle.
@throws IOException if there is an I/O error while reading the stream.
ambry-store/src/main/java/com/github/ambry/store/CompactionLog.java