docs: @Override
      public void runForRejoin(SiteProcedureConnection siteConnection,
              TaskLog m_taskLog) throws IOException
      {
          // After doInitialization(), the rejoin producer is inserted into the task queue,
          // and then we come here repeatedly until the stream snapshot restore finishes.
          // The first time when this producer method is run (m_commaSeparatedNameOfViewsToPause is null),
          // we need to figure out which views to pause so that they are handled properly
          // before the snapshot streams arrive.
          if (m_commaSeparatedNameOfViewsToPause == null) {
              // The very first execution of runForRejoin will lead us here.
              StringBuilder commaSeparatedViewNames = new StringBuilder();
              Database db = VoltDB.instance().getCatalogContext().database;
              for (Table table : VoltDB.instance().getCatalogContext().tables) {
                  if (CatalogUtil.isSnapshotablePersistentTableView(db, table)) {
                      // If the table is a snapshotted persistent table view, we will try to
                      // temporarily disable its maintenance job to boost restore performance.
                      commaSeparatedViewNames.append(table.getTypeName()).append(",");
                  }
              }
              // Get rid of the trailing comma.
              if (commaSeparatedViewNames.length() > 0) {
                  commaSeparatedViewNames.setLength(commaSeparatedViewNames.length() - 1);
              }
              m_commaSeparatedNameOfViewsToPause = commaSeparatedViewNames.toString();
              // Set enabled to false for the views we found.
              siteConnection.setViewsEnabled(m_commaSeparatedNameOfViewsToPause, false);
          }
          if (m_hasPersistentTables) {
              boolean sourcesReady = false;
              RestoreWork rejoinWork = m_rejoinSiteProcessor.poll(m_snapshotBufferAllocator);
              if (rejoinWork != null) {
                  restoreBlock(rejoinWork, siteConnection);
                  sourcesReady = true;
              }
  
              if (m_rejoinSiteProcessor.isEOF() == false) {
                  returnToTaskQueue(sourcesReady);
              } else {
                  REJOINLOG.debug(m_whoami + "Rejoin snapshot transfer is finished");
                  m_rejoinSiteProcessor.close();
  
                  boolean allSitesFinishStreaming;
                  if (m_streamSnapshotMb != null) {
                      VoltDB.instance().getHostMessenger().removeMailbox(m_streamSnapshotMb.getHSId());
                      m_streamSnapshotMb = null;
                      allSitesFinishStreaming = s_streamingSiteCount.decrementAndGet() == 0;
                  }
                  else {
                      int pendingSites = s_streamingSiteCount.get();
                      assert(pendingSites >= 0);
                      allSitesFinishStreaming = pendingSites == 0;
                  }
                  if (allSitesFinishStreaming) {
                      doFinishingTask(siteConnection);
                  }
                  else {
                      returnToTaskQueue(sourcesReady);
                  }
              }
          }
          else {
              doFinishingTask(siteConnection);
              // Remove the completion monitor for an empty (zero table) rejoin.
              m_snapshotCompletionMonitor.set(null);
          }
      }