code: public ExecutionEngine getExecutionEngine() {
          if (m_ee != null) {
              return m_ee;
          }
          // m_site is declared as SiteProcedureConnection here.
          // SiteProcedureConnection only has two implementations: Site and MpRoSite.
          // Only SP site has an underlying ExecutionEngine, MpRoSite does not.
          if (m_site instanceof Site) {
              m_ee = ((Site)m_site).getExecutionEngine();
              return m_ee;
          }
          return null;
      }
docs: This function returns the ExecutionEngine for this site.
  ProcedureRunner needs the access to the ExecutionEngine for two purposes:
  - Telling the C++ side to turn on/off the per-fragment time measurement.
  - Collecting the time measurements and the failure indicator from
  the per-fragment stats shared buffer.
  The ExecutionEngine may not have been initialized when a ProcedureRunner is created,
  (See BaseInitiator.java, the configureCommon() function)
  so we do not find this engine in the constructor.