docs: public void init() throws IOException {
          try {
              FileUtils.createDirIfNotExist(dataPath);
          } catch (IOException e) {
              LOGGER.error("create dataPath " + dataPath + " error:" + e.getMessage(), e);
              throw e;
          }
  
          String[] dataFiles = dataPath.list(new FilenameFilter() {
              @Override
              public boolean accept(File file, String name) {
                  return name.endsWith(DataBlock.FILE_SUFFIX);
              }
          });
  
          if (dataFiles.length == 0) {
              return;
          }
  
          // 得到最大的事务日志id, 看是否需要重放
          StoreTxLogPosition maxTxLog = null;
  
          for (String dataFile : dataFiles) {
              try {
                  DataBlock dataBlock = new DataBlock(dataFile, storeConfig);
                  NAME_BLOCK_MAP.put(dataBlock.getFileId(), dataBlock);
                  if (dataBlock.isFull()) {
                      readonlyBlocks.add(dataBlock);
                  } else {
                      writableBlocks.add(dataBlock);
                  }
  
                  if (maxTxLog == null || maxTxLog.getRecordId() < dataBlock.getLastTxLogPosition().getRecordId()) {
                      maxTxLog = dataBlock.getLastTxLogPosition();
                  }
  
              } catch (IOException e) {
                  LOGGER.error("load data block [" + dataFile + "] error:" + e.getMessage(), e);
              }
          }
          storeConfig.setLastTxLogPositionOnDataBlock(maxTxLog);
      }