@Override
  public void read(DataInput in) throws IOException {
    try {
      long msb = in.readLong();
      long lsb = in.readLong();
      this.token = new UUID(msb, lsb);
    } catch (Exception e) {
      throw new UnknownStoreVersionException(e);
    }

    if (!token.equals(JobSchedulerStoreImpl.SCHEDULER_STORE_TOKEN)) {
      throw new UnknownStoreVersionException(token.toString());
    }
    this.version = in.readInt();
    if (in.readBoolean()) {
      setLastUpdateLocation(LocationMarshaller.INSTANCE.readPayload(in));
    } else {
      setLastUpdateLocation(null);
    }
    this.storedSchedulers =
        new BTreeIndex<String, JobSchedulerImpl>(store.getPageFile(), in.readLong());
    this.storedSchedulers.setKeyMarshaller(StringMarshaller.INSTANCE);
    this.storedSchedulers.setValueMarshaller(new JobSchedulerMarshaller(this.store));
    this.journalRC = new BTreeIndex<Integer, Integer>(store.getPageFile(), in.readLong());
    this.journalRC.setKeyMarshaller(IntegerMarshaller.INSTANCE);
    this.journalRC.setValueMarshaller(IntegerMarshaller.INSTANCE);
    this.removeLocationTracker =
        new BTreeIndex<Integer, List<Integer>>(store.getPageFile(), in.readLong());
    this.removeLocationTracker.setKeyMarshaller(IntegerMarshaller.INSTANCE);
    this.removeLocationTracker.setValueMarshaller(new IntegerListMarshaller());

    LOG.info("Scheduler Store version {} loaded", this.version);
  }
 @Override
 public void write(DataOutput out) throws IOException {
   out.writeLong(this.token.getMostSignificantBits());
   out.writeLong(this.token.getLeastSignificantBits());
   out.writeInt(this.version);
   if (getLastUpdateLocation() != null) {
     out.writeBoolean(true);
     LocationMarshaller.INSTANCE.writePayload(getLastUpdateLocation(), out);
   } else {
     out.writeBoolean(false);
   }
   out.writeLong(this.storedSchedulers.getPageId());
   out.writeLong(this.journalRC.getPageId());
   out.writeLong(this.removeLocationTracker.getPageId());
 }