code: public SyncInfo getActivitySyncInfo() {
      // The overview of this method is
      // 1. setup a source of event
      // 2. Filter based on the paths associated with this mountId
      // 3. Build History for each of the syncPoint
      // 4. If heurstics function returns sync, then we sync the syncPoint
  
      if (mPollingThread == null) {
        return SyncInfo.emptyInfo();
      }
  
      Map<AlluxioURI, Set<AlluxioURI>> syncPointFiles = new HashMap<>();
      long txId = 0;
      try (LockResource r = new LockResource(mWriteLock)) {
        initNextWindow();
        if (mEventMissed) {
          // force sync every syncpoint
          for (AlluxioURI uri : mUfsUriList) {
            syncPointFiles.put(uri, null);
            syncSyncPoint(uri.toString());
          }
          mEventMissed = false;
          LOG.debug("Missed event, syncing all sync points\n{}",
              Arrays.toString(syncPointFiles.keySet().toArray()));
          SyncInfo syncInfo = new SyncInfo(syncPointFiles, true, getLastTxId());
          return syncInfo;
        }
        for (String syncPoint : mActivity.keySet()) {
          AlluxioURI syncPointURI = new AlluxioURI(syncPoint);
          // if the activity level is below the threshold or the sync point is too old, we sync
          if (mActivity.get(syncPoint) < mActiveUfsSyncMaxActivity
              || mAge.get(syncPoint) > mActiveUfsSyncMaxAge) {
            if (!syncPointFiles.containsKey(syncPointURI)) {
              syncPointFiles.put(syncPointURI, mChangedFiles.get(syncPoint));
            }
            syncSyncPoint(syncPoint);
          }
        }
        txId = getLastTxId();
      }
      LOG.debug("Syncing {} files", syncPointFiles.size());
      LOG.debug("Last transaction id {}", txId);
  
      SyncInfo syncInfo = new SyncInfo(syncPointFiles, false, txId);
      return syncInfo;
    }
docs: Get the activity sync info.
  
  @return SyncInfo object which encapsulates the necessary information about changes