josh-mckenzie commented on a change in pull request #1045: URL: https://github.com/apache/cassandra/pull/1045#discussion_r687166497
########## File path: src/java/org/apache/cassandra/utils/concurrent/NonBlockingRateLimiter.java ########## @@ -0,0 +1,183 @@ +/* + * 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.utils.concurrent; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; +import com.google.common.base.Ticker; + +import javax.annotation.concurrent.ThreadSafe; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +/** + * A rate limiter implementation that allows callers to reserve permits that may only be available + * in the future, delegating to them decisions about how to schedule/delay work and whether or not + * to block execution to do so. + */ +@SuppressWarnings("UnstableApiUsage") +@ThreadSafe +public class NonBlockingRateLimiter +{ + private static final long DEFAULT_BURST_NANOS = TimeUnit.SECONDS.toNanos(1); + + /** a starting time for elapsed time calculations */ + private final long startedNanos; + + /** + * nanoseconds of "burst time" + * + * ex. If this is configured at the default of 1 second, the limiter will allow a + * number of permits equal to the configured number of permits/second to be issued Review comment: Ah, yes. That's a fairly clean way to describe the algorithm around allowing bursting; it's somewhat ironic that the long-winded example I gave above actually distills to `burstSeconds / (1 / (permits/second))`, or essentially just burstSeconds * permits/second. 👍 on updating the example in the comment for posterity. Thanks for the clarification and patience. -- 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: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]

