From pr-return-1612-archive-asf-public=cust-asf.ponee.io@cassandra.apache.org Tue Nov 27 18:49:42 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 37AD1180670 for ; Tue, 27 Nov 2018 18:49:42 +0100 (CET) Received: (qmail 31805 invoked by uid 500); 27 Nov 2018 17:49:41 -0000 Mailing-List: contact pr-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: pr@cassandra.apache.org Delivered-To: mailing list pr@cassandra.apache.org Received: (qmail 31793 invoked by uid 99); 27 Nov 2018 17:49:40 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 27 Nov 2018 17:49:40 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8DC80E1226; Tue, 27 Nov 2018 17:49:40 +0000 (UTC) From: jolynch To: pr@cassandra.apache.org Reply-To: pr@cassandra.apache.org References: In-Reply-To: Subject: [GitHub] cassandra pull request #283: CASSANDRA-14459: DynamicEndpointSnitch should n... Content-Type: text/plain Message-Id: <20181127174940.8DC80E1226@git1-us-west.apache.org> Date: Tue, 27 Nov 2018 17:49:40 +0000 (UTC) Github user jolynch commented on a diff in the pull request: https://github.com/apache/cassandra/pull/283#discussion_r236776225 --- Diff: src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java --- @@ -154,31 +326,203 @@ private void registerMBean() public void close() { - updateSchedular.cancel(false); - resetSchedular.cancel(false); + if (updateScoresScheduler != null) + updateScoresScheduler.cancel(false); + if (updateSamplesScheduler != null) + updateSamplesScheduler.cancel(false); + + for (AnnotatedMeasurement measurement : samples.values()) + { + if (measurement.probeFuture != null) + measurement.probeFuture.cancel(false); + + measurement.millisSinceLastMeasure.set(0); + measurement.millisSinceLastRequest.set(MAX_PROBE_INTERVAL_MS); + measurement.probeTimerMillis = 0; + } MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); try { - mbs.unregisterMBean(new ObjectName(mbeanName)); + if (mbeanRegistered) + mbs.unregisterMBean(new ObjectName(mbeanName)); } catch (Exception e) { throw new RuntimeException(e); } } + /** + * Background task running on the samples dictionary. The default implementation sends latency probes (PING) + * messages to explore nodes that we have not received timings for recently but have ranked in + * {@link DynamicEndpointSnitch#sortedByProximity(InetAddressAndPort, ReplicaCollection)}. + */ + protected void updateSamples() + { + // Split calculation of probe timers from sending probes for testability + calculateProbes(samples, dynamicLatencyProbeInterval); + + if (!StorageService.instance.isGossipActive()) + return; + + schedulePings(samples); + } + + /** + * This method mutates the passed AnnotatedMeasurements to implement capped exponential backoff per endpoint. + * + * The algorithm is as follows: + * 1. All samples get their millisSinceLastMeasure and millisSinceLastRequest fields + * incremented by the passed interval + * 2. Any recently requested (ranked) endpoints that have not been measured recently (e.g. because the snitch + * has sent them no traffic) get probes with exponential backoff. + * + * The backoff is capped at MAX_PROBE_INTERVAL_MS. Furthermore the probes are stopped after + * MAX_PROBE_INTERVAL_MS of no ranking requests as well. + * + * At the end of this method, any passed AnnotatedMeasurements that need latency probes will have non zero + * probeTimerMillis members set. + */ + @VisibleForTesting + static void calculateProbes(Map samples, long intervalMillis) { + for (Map.Entry entry: samples.entrySet()) + { + if (entry.getKey().equals(FBUtilities.getBroadcastAddressAndPort())) + continue; + + AnnotatedMeasurement measurement = entry.getValue(); + long lastMeasure = measurement.millisSinceLastMeasure.getAndAdd(intervalMillis); + long lastRequest = measurement.millisSinceLastRequest.getAndAdd(intervalMillis); + + if (lastMeasure >= MIN_PROBE_INTERVAL_MS && lastRequest < MAX_PROBE_INTERVAL_MS) + { + if (measurement.probeTimerMillis == 0) + { + measurement.probeTimerMillis = intervalMillis; + } + else if (measurement.probeFuture != null && measurement.probeFuture.isDone()) + { + measurement.probeTimerMillis = Math.min(MAX_PROBE_INTERVAL_MS, measurement.probeTimerMillis * 2); --- End diff -- Ack, +1 --- --------------------------------------------------------------------- To unsubscribe, e-mail: pr-unsubscribe@cassandra.apache.org For additional commands, e-mail: pr-help@cassandra.apache.org