maedhroz commented on a change in pull request #1045:
URL: https://github.com/apache/cassandra/pull/1045#discussion_r687042791



##########
File path: src/java/org/apache/cassandra/transport/CQLMessageHandler.java
##########
@@ -157,41 +160,97 @@ protected boolean 
processOneContainedMessage(ShareableBytes bytes, Limit endpoin
 
         // max CQL message size defaults to 256mb, so should be safe to 
downcast
         int messageSize = Ints.checkedCast(header.bodySizeInBytes);
+        
         if (throwOnOverload)
         {
             if (!acquireCapacity(header, endpointReserve, globalReserve))
             {
-                // discard the request and throw an exception
-                ClientMetrics.instance.markRequestDiscarded();
-                logger.trace("Discarded request of size: {}. 
InflightChannelRequestPayload: {}, " +
-                             "InflightEndpointRequestPayload: {}, 
InflightOverallRequestPayload: {}, Header: {}",
-                             messageSize,
-                             channelPayloadBytesInFlight,
-                             endpointReserve.using(),
-                             globalReserve.using(),
-                             header);
-
-                handleError(new OverloadedException("Server is in overloaded 
state. " +
-                                                    "Cannot accept more 
requests at this point"), header);
-
-                // Don't stop processing incoming messages, rely on the client 
to apply
-                // backpressure when it receives OverloadedException
-                // but discard this message as we're responding with the 
overloaded error
-                incrementReceivedMessageMetrics(messageSize);
-                buf.position(buf.position() + Envelope.Header.LENGTH + 
messageSize);
+                discardAndThrow(endpointReserve, globalReserve, buf, header, 
messageSize, Overload.BYTES_IN_FLIGHT);
+                return true;
+            }
+
+            if (DatabaseDescriptor.getNativeTransportRateLimitingEnabled() && 
!requestRateLimiter.tryReserve())
+            {
+                discardAndThrow(endpointReserve, globalReserve, buf, header, 
messageSize, Overload.REQUESTS);
                 return true;
             }
         }
-        else if (!acquireCapacityAndQueueOnFailure(header, endpointReserve, 
globalReserve))
+        else

Review comment:
       I'm not sure if that's possible. My goals were to a.) avoid touching the 
limiter unnecessarily with rate limiting disabled and b.) make sure that the 
limiter check and then the capacity acquisition happen in separate blocks. 
(i.e. Even if rate limiting is enabled, we can't skip capacity acquisition.)




-- 
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]

Reply via email to