Github user aweisberg commented on a diff in the pull request: https://github.com/apache/cassandra/pull/283#discussion_r225335637 --- Diff: src/java/org/apache/cassandra/locator/DynamicEndpointSnitchEMA.java --- @@ -0,0 +1,181 @@ +/* + * 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.locator; + +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.cassandra.gms.Gossiper; +import org.apache.cassandra.metrics.ExponentialMovingAverage; +import org.apache.cassandra.net.LatencyMeasurementType; + + +/** + * A dynamic snitching implementation that uses Exponentially Decaying Histograms to prefer or + * de-prefer hosts + * + * This was the default implementation prior to Cassandra 4.0 and is being left as the default + * in 4.0 + */ +public class DynamicEndpointSnitchEMA extends DynamicEndpointSnitch +{ + // A ~10 sample EMA + private static final double EMA_ALPHA = 0.10; + + private final ConcurrentHashMap samples = new ConcurrentHashMap<>(); + + /** + * Adds two boolean markers to the ExponentialMovingAverage for telling if the data has been + * updated or requested recently. + * + * recentlyMeasured is updated through {@link AnnotatedEMA#update(long, boolean)} + * recentlyRequested is updated through {@link DynamicEndpointSnitch#markRequested} + * + * Both markers are periodically reset via {@link DynamicEndpointSnitch#latencyProbeNeeded(long)} + */ + private static class AnnotatedEMA extends ExponentialMovingAverage --- End diff -- You can use a common base with and compose instead of extending so that the base class can contain all the type specific functionality. I think you want to wrap anyways so we can adapt the methods from the underlying reservoir. Then the map can be in the base class since it's basically common anyways. --- --------------------------------------------------------------------- To unsubscribe, e-mail: pr-unsubscribe@cassandra.apache.org For additional commands, e-mail: pr-help@cassandra.apache.org