### Description

This is a followup to #85926.

As part of the ingest processing pipeline, we call `CollectionUtils.ensureNoSelfReferences(...)` to ensure that a script processor didn't accidentally introduce a circular object. However, this check is only necessary if we know there was the potential for a circular option, which can only happen with either a custom processor (a plugin where we have no control), or a script processor. We should be able to only call this sanity check if we know we need it, rather than for every document.
server/src/main/java/org/elasticsearch/action/index/IndexRequest.java
* If the document last modification was assigned a different term a
     * {@link org.elasticsearch.index.engine.VersionConflictEngineException} will be thrown.
     */
    public long ifPrimaryTerm() {
        return ifPrimaryTerm;
    }
    @Override
    public VersionType versionType() {
        return this.versionType;
    }
    @Override
    public void process(IndexRouting indexRouting) {
        indexRouting.process(this);
    }
    /**
     * Set the {@code #id()} to an automatically generated one and make this
     * request compatible with the append-only optimization.
     */
    public void autoGenerateId() {
        assert id == null;
        assert autoGeneratedTimestamp == UNSET_AUTO_GENERATED_TIMESTAMP : "timestamp has already been generated!";
        assert ifSeqNo == UNASSIGNED_SEQ_NO;
        assert ifPrimaryTerm == UNASSIGNED_PRIMARY_TERM;
        /*
         * Set the auto generated timestamp so the append only optimization
         * can quickly test if this request *must* be unique without reaching
         * into the Lucene index. We lock it >0 because UNSET_AUTO_GENERATED_TIMESTAMP
         * has a special meaning and is a negative value. This optimiation will
         * never work before 1970, but that's ok. It's after 1970.
         */