From 4962f3da3f7280004c153263206a67dbddfca25e Mon Sep 17 00:00:00 2001 From: Yuqi Yan Date: Fri, 18 Jul 2025 12:12:45 -0700 Subject: [PATCH] IntrusiveStack.accumulate is not accumulating correctly patch by Yuqi Yan; reviewed by Benedict Elliott Smith, David Capwell for CASSANDRA-20670 --- CHANGES.txt | 1 + .../utils/concurrent/IntrusiveStack.java | 2 +- .../service/FailureRecordingCallbackTest.java | 50 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 test/unit/org/apache/cassandra/service/FailureRecordingCallbackTest.java diff --git a/CHANGES.txt b/CHANGES.txt index 20c6c89a98..5e4703f828 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.1.10 + * IntrusiveStack.accumulate is not accumulating correctly (CASSANDRA-20670) * Add nodetool get/setguardrailsconfig commands (CASSANDRA-19552) Merged from 4.0: * Ensure prepared_statement INSERT timestamp precedes eviction DELETE (CASSANDRA-19703) diff --git a/src/java/org/apache/cassandra/utils/concurrent/IntrusiveStack.java b/src/java/org/apache/cassandra/utils/concurrent/IntrusiveStack.java index e61d56545f..6998c2f288 100644 --- a/src/java/org/apache/cassandra/utils/concurrent/IntrusiveStack.java +++ b/src/java/org/apache/cassandra/utils/concurrent/IntrusiveStack.java @@ -155,7 +155,7 @@ public class IntrusiveStack> implements Iterable long value = initialValue; while (list != null) { - value = accumulator.apply(list, initialValue); + value = accumulator.apply(list, value); list = list.next; } return value; diff --git a/test/unit/org/apache/cassandra/service/FailureRecordingCallbackTest.java b/test/unit/org/apache/cassandra/service/FailureRecordingCallbackTest.java new file mode 100644 index 0000000000..609ae0894d --- /dev/null +++ b/test/unit/org/apache/cassandra/service/FailureRecordingCallbackTest.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.service; + +import java.net.UnknownHostException; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.cassandra.exceptions.RequestFailureReason; +import org.apache.cassandra.locator.InetAddressAndPort; +import org.apache.cassandra.net.Message; + +public class FailureRecordingCallbackTest +{ + @Test + public void testFailuresCount() throws UnknownHostException + { + FailureRecordingCallback cb = new FailureRecordingCallback() + { + + @Override + public void onResponse(Message msg) {} + @Override + public boolean invokeOnFailure() { return super.invokeOnFailure();} + @Override + public boolean trackLatencyForSnitch() { return super.trackLatencyForSnitch();} + }; + cb.onFailureWithMutex(InetAddressAndPort.getByName("127.0.0.1"), RequestFailureReason.UNKNOWN); + cb.onFailureWithMutex(InetAddressAndPort.getByName("127.0.0.2"), RequestFailureReason.UNKNOWN); + cb.onFailureWithMutex(InetAddressAndPort.getByName("127.0.0.3"), RequestFailureReason.TIMEOUT); + Assert.assertEquals(2, cb.failureReasonsAsMap().failureCount()); + } +}