docs: @SuppressWarnings("unchecked")
      synchronized void update(CatalogContext catalogContext) {
          CatalogMap<Procedure> procedures = catalogContext.database.getProcedures();
  
          Map<String, ProcedureRunnerNTGenerator> runnerGeneratorMap = new TreeMap<>();
  
          for (Procedure procedure : procedures) {
              if (procedure.getTransactional()) {
                  continue;
              }
  
              // this code is mostly lifted from transactional procedures
              String className = procedure.getClassname();
              Class<? extends VoltNonTransactionalProcedure> clz = null;
              try {
                  clz = (Class<? extends VoltNonTransactionalProcedure>) catalogContext.classForProcedureOrUDF(className);
              } catch (ClassNotFoundException e) {
                  if (className.startsWith("org.voltdb.")) {
                      String msg = String.format(LoadedProcedureSet.ORGVOLTDB_PROCNAME_ERROR_FMT, className);
                      VoltDB.crashLocalVoltDB(msg, false, null);
                  }
                  else {
                      String msg = String.format(LoadedProcedureSet.UNABLETOLOAD_ERROR_FMT, className);
                      VoltDB.crashLocalVoltDB(msg, false, null);
                  }
              }
  
              // The ProcedureRunnerNTGenerator has all of the dangerous and slow
              // stuff in it. Like classfinding, instantiation, and reflection.
              ProcedureRunnerNTGenerator prntg = new ProcedureRunnerNTGenerator(clz);
              runnerGeneratorMap.put(procedure.getTypeName(), prntg);
          }
  
          m_procs = ImmutableMap.<String, ProcedureRunnerNTGenerator>builder().putAll(runnerGeneratorMap).build();
  
          // reload all sysprocs
          loadSystemProcedures(false);
  
          // Set the system to start accepting work again now that ebertything is updated.
          // We had to stop because stats would be wonky if we called a proc while updating
          // this stuff.
          m_paused = false;
  
          // release all of the pending invocations into the real queue
          m_pendingInvocations
              .forEach(pi -> callProcedureNT(pi.ciHandle, pi.user, pi.ccxn, pi.isAdmin,
                       pi.ntPriority, pi.task));
          m_pendingInvocations.clear();
      }