code: private void processCheckpoint(Tuple input) {
          Action action = (Action) input.getValueByField(CheckpointSpout.CHECKPOINT_FIELD_ACTION);
          long txid = input.getLongByField(CheckpointSpout.CHECKPOINT_FIELD_TXID);
          if (shouldProcessTransaction(action, txid)) {
              LOG.debug("Processing action {}, txid {}", action, txid);
              try {
                  if (txid >= lastTxid) {
                      handleCheckpoint(input, action, txid);
                      if (action == CheckPointState.Action.ROLLBACK) {
                          lastTxid = txid - 1;
                      } else {
                          lastTxid = txid;
                      }
                  } else {
                      LOG.debug("Ignoring old transaction. Action {}, txid {}", action, txid);
                      collector.ack(input);
                  }
              } catch (Throwable th) {
                  LOG.error("Got error while processing checkpoint tuple", th);
                  collector.fail(input);
                  collector.reportError(th);
              }
          } else {
              LOG.debug("Waiting for action {}, txid {} from all input tasks. checkPointInputTaskCount {}, " +
                      "transactionRequestCount {}", action, txid, checkPointInputTaskCount, transactionRequestCount);
              collector.ack(input);
          }
      }
docs: Invokes handleCheckpoint once checkpoint tuple is received on
  all input checkpoint streams to this component.