docs: public CreateTransactionResult createTransaction(
              final long connectionId,
              final long txnId,
              final long uniqueId,
              final StoredProcedureInvocation invocation,
              final boolean isReadOnly,
              final boolean isSinglePartition,
              final boolean isEveryPartition,
              final int[] partitions,
              final int messageSize,
              long nowNanos,
              final boolean isForReplay)
      {
          assert(!isSinglePartition || (partitions.length == 1));
          final ClientInterfaceHandleManager cihm = m_cihm.get(connectionId);
          if (cihm == null) {
              hostLog.rateLimitedLog(60, Level.WARN, null,
                      "InvocationDispatcher.createTransaction request rejected. "
                      + "This is likely due to VoltDB ceasing client communication as it "
                      + "shuts down.");
              return CreateTransactionResult.NO_CLIENT_HANDLER;
          }
  
          Long initiatorHSId = null;
          boolean isShortCircuitRead = false;
          /*
           * Send the read to the partition leader only
           * @MigratePartitionLeader always goes to partition leader
           */
          if (isSinglePartition && !isEveryPartition) {
              initiatorHSId = m_cartographer.getHSIdForSinglePartitionMaster(partitions[0]);
          } else {
              // Multi-part transactions go to the multi-part coordinator
              initiatorHSId = m_cartographer.getHSIdForMultiPartitionInitiator();
  
              // Treat all MP reads as short-circuit since they can run out-of-order
              // from their arrival order due to the MP Read-only execution pool
              if (isReadOnly) {
                  isShortCircuitRead = true;
              }
          }
  
          if (initiatorHSId == null) {
              hostLog.rateLimitedLog(60, Level.INFO, null,
                      "InvocationDispatcher.createTransaction request rejected. "
                      + "This is likely due to parition leader being removed during elastic shrink.");
              return CreateTransactionResult.PARTITION_REMOVED;
          }
  
          long handle = cihm.getHandle(isSinglePartition, isSinglePartition ? partitions[0] : -1, invocation.getClientHandle(),
                  messageSize, nowNanos, invocation.getProcName(), initiatorHSId, isShortCircuitRead);
  
          Iv2InitiateTaskMessage workRequest =
              new Iv2InitiateTaskMessage(m_siteId,
                      initiatorHSId,
                      Iv2InitiateTaskMessage.UNUSED_TRUNC_HANDLE,
                      txnId,
                      uniqueId,
                      isReadOnly,
                      isSinglePartition,
                      (partitions == null) || (partitions.length < 2) ? null : partitions,
                      invocation,
                      handle,
                      connectionId,
                      isForReplay);
  
          Long finalInitiatorHSId = initiatorHSId;
          final VoltTrace.TraceEventBatch traceLog = VoltTrace.log(VoltTrace.Category.CI);
          if (traceLog != null) {
              traceLog.add(() -> VoltTrace.instantAsync("inittxn",
                                                        invocation.getClientHandle(),
                                                        "clientHandle", Long.toString(invocation.getClientHandle()),
                                                        "ciHandle", Long.toString(handle),
                                                        "partitions", partitions.toString(),
                                                        "dest", CoreUtils.hsIdToString(finalInitiatorHSId)));
          }
  
          Iv2Trace.logCreateTransaction(workRequest);
          m_mailbox.send(initiatorHSId, workRequest);
          return CreateTransactionResult.SUCCESS;
      }