docs: public boolean checkPartition(TransactionState txnState, TheHashinator hashinator) {
          if (m_isSinglePartition) {
              // can happen when a proc changes from multi-to-single after it's routed
              if (hashinator == null) {
                  return false; // this will kick it back to CI for re-routing
              }
  
              if (m_site.getCorrespondingPartitionId() == MpInitiator.MP_INIT_PID) {
                  // SP txn misrouted to MPI, possible to happen during catalog update
                  throw new ExpectedProcedureException("Single-partition procedure routed to multi-partition initiator");
              }
  
              StoredProcedureInvocation invocation = txnState.getInvocation();
              VoltType parameterType;
              Object parameterAtIndex;
  
              // check if AdHoc_RO_SP or AdHoc_RW_SP
              if (m_procedure instanceof AdHocBase) {
                  // ClientInterface should pre-validate this param is valid
                  parameterAtIndex = invocation.getParameterAtIndex(0);
                  parameterType = VoltType.get((Byte) invocation.getParameterAtIndex(1));
  
                  if (parameterAtIndex == null && m_isReadOnly) {
                      assert (m_procedure instanceof AdHoc_RO_SP);
                      // Replicated table reads can run on any partition, skip check
                      return true;
                  }
  
              } else {
                  parameterType = m_partitionColumnType;
                  parameterAtIndex = invocation.getParameterAtIndex(m_partitionColumn);
              }
  
              // Note that @LoadSinglepartitionTable has problems if the parititoning param
              // uses integers as bytes and isn't padded to 8b or using the right byte order.
              // Since this is not exposed to users, we're ok for now. The right fix is to probably
              // accept the right partitioning type from the user, then rewrite the params internally
              // before we initiate the proc (like adhocs).
  
              try {
                  int partition = hashinator.getHashedPartitionForParameter(parameterType, parameterAtIndex);
                  if (partition == m_site.getCorrespondingPartitionId()) {
                      return true;
                  } else {
                      // Wrong partition, should restart the txn
                      if (HOST_TRACE_ENABLED) {
                          log.trace("Txn " + txnState.getInvocation().getProcName() +
                                  " will be restarted");
                      }
                  }
              } catch (Exception e) {
                  log.warn("Unable to check partitioning of transaction " + txnState.m_spHandle, e);
              }
              return false;
          } else {
              if (!m_catProc.getEverysite() && m_site.getCorrespondingPartitionId() != MpInitiator.MP_INIT_PID) {
                  log.warn("Detected MP transaction misrouted to SPI. This can happen during a schema update. " +
                          "Otherwise, it is unexpected behavior. " +
                          "Please report the following information to support@voltdb.com");
                  log.warn("procedure name: " + m_catProc.getTypeName() +
                          ", site partition id: " + m_site.getCorrespondingPartitionId() +
                          ", site HSId: " + m_site.getCorrespondingHostId() + ":" + m_site.getCorrespondingSiteId() +
                          ", txnState initiatorHSId: " + CoreUtils.hsIdToString(txnState.initiatorHSId));
                  if (txnState.getNotice() instanceof Iv2InitiateTaskMessage) {
                      Iv2InitiateTaskMessage initiateTaskMessage = (Iv2InitiateTaskMessage) txnState.getNotice();
                      log.warn("Iv2InitiateTaskMessage: sourceHSId: " +
                              CoreUtils.hsIdToString(initiateTaskMessage.m_sourceHSId) +
                              ", dump: " + initiateTaskMessage);
                  }
                  // MP txn misrouted to SPI, possible to happen during catalog update
                  throw new ExpectedProcedureException("Multi-partition procedure routed to single-partition initiator");
              }
  
              // For n-partition transactions, we need to rehash the partitioning values and check
              // if they still hash to the assigned partitions.
              //
              // Note that when n-partition transaction runs, it's run on the MPI site, so calling
              // m_site.getCorrespondingPartitionId() will return the MPI's partition ID. We need
              // another way of getting what partitions were assigned to this transaction.
              return true;
          }
      }