clebertsuconic commented on code in PR #5172: URL: https://github.com/apache/activemq-artemis/pull/5172#discussion_r1735386767
########## artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/OperationContextImpl.java: ########## @@ -165,56 +185,74 @@ public synchronized void replicationDone() { @Override public void executeOnCompletion(IOCallback runnable) { - executeOnCompletion(runnable, false); + executeOnCompletion(runnable, OperationConsistencyLevel.FULL); } @Override - public void executeOnCompletion(final IOCallback completion, final boolean storeOnly) { + public void executeOnCompletion(final IOCallback completion, final OperationConsistencyLevel consistencyLevel) { boolean executeNow = false; synchronized (this) { if (errorCode == -1) { final long storeLined = STORE_LINEUP_UPDATER.get(this); final long pageLined = PAGE_LINEUP_UPDATER.get(this); final long replicationLined = REPLICATION_LINEUP_UPDATER.get(this); - if (storeOnly) { - if (storeOnlyTasks == null) { - storeOnlyTasks = new LinkedList<>(); - } - } else { - if (tasks == null) { - tasks = new LinkedList<>(); - minimalReplicated = replicationLined; - minimalStore = storeLined; - minimalPage = pageLined; - } - } - // On this case, we can just execute the context directly - - if (replicationLined == replicated && storeLined == stored && pageLined == paged) { - // We want to avoid the executor if everything is complete... - // However, we can't execute the context if there are executions pending - // We need to use the executor on this case - if (EXECUTORS_PENDING_UPDATER.get(this) == 0) { - // No need to use an executor here or a context switch - // there are no actions pending.. hence we can just execute the task directly on the same thread - executeNow = true; - } else { - execute(completion); - } - } else { - if (storeOnly) { - if (storeLined == stored && EXECUTORS_PENDING_UPDATER.get(this) == 0) { - executeNow = true; + switch (consistencyLevel) { + case STORAGE: + if (storeOnlyTasks == null) { + storeOnlyTasks = new LinkedList<>(); + } + if (storeLined == stored) { + if (hasNoPendingExecution()) { + executeNow = true; + } else { + execute(completion); + } } else { - assert !storeOnlyTasks.isEmpty() ? storeOnlyTasks.peekLast().storeLined <= storeLined : true; storeOnlyTasks.add(new StoreOnlyTaskHolder(completion, storeLined)); } - } else { - // ensure total ordering - assert validateTasksAdd(storeLined, replicationLined, pageLined); - tasks.add(new TaskHolder(completion, storeLined, replicationLined, pageLined)); - } + break; + + case IGNORE_REPLICATION: + if (ignoreReplicationTasks == null) { + ignoreReplicationTasks = new LinkedList<>(); + } + + if (storeLined == stored && pageLined == paged) { + if (hasNoPendingExecution()) { + // No need to use an executor here or a context switch + // there are no actions pending.. hence we can just execute the task directly on the same thread + executeNow = true; + } else { + execute(completion); + } + } else { + ignoreReplicationTasks.add(new TaskHolder(completion, storeLined, replicationLined, pageLined)); Review Comment: I thought it was not needed... ignore replication is only used on Mirroring (although you never know if we may expand usage). Storage is more used.. but I'm adding it just in case. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: gitbox-unsubscr...@activemq.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: gitbox-unsubscr...@activemq.apache.org For additional commands, e-mail: gitbox-h...@activemq.apache.org For further information, visit: https://activemq.apache.org/contact