bharathv commented on a change in pull request #754: HBASE-22978 : Online slow 
response log
URL: https://github.com/apache/hbase/pull/754#discussion_r379951556
 
 

 ##########
 File path: 
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/slowlog/SlowLogEventHandler.java
 ##########
 @@ -0,0 +1,154 @@
+/*
+ *
+ * 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.hadoop.hbase.regionserver.slowlog;
+
+import com.lmax.disruptor.EventHandler;
+import com.lmax.disruptor.RingBuffer;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Queue;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.yetus.audience.InterfaceAudience;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.hbase.thirdparty.com.google.common.collect.EvictingQueue;
+import org.apache.hbase.thirdparty.com.google.common.collect.Queues;
+
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;
+import 
org.apache.hadoop.hbase.shaded.protobuf.generated.TooSlowLog.SlowLogPayload;
+
+/**
+ * Event Handler run by disruptor ringbuffer consumer
+ */
+@InterfaceAudience.Private
+class SlowLogEventHandler implements EventHandler<RingBufferEnvelope> {
+
+  private static final Logger LOG = 
LoggerFactory.getLogger(SlowLogEventHandler.class);
+
+  private final Queue<SlowLogPayload> queue;
+
+  SlowLogEventHandler(int eventCount) {
+    EvictingQueue<SlowLogPayload> evictingQueue = 
EvictingQueue.create(eventCount);
 
 Review comment:
   I think you misunderstood my comment.. My point was to get rid of lmax's 
ringbuffer implementation with and asynchronous thread-safe EvictingQueue (it 
isn't as complex as it sounds)...
   
   When I meant asynchronous, any entries added by the event producer 
(RpcServer here) is asynchronously processed by a single thread. This is easier 
to reason about than CompletableFuture.runAsync() approach you did on the 
caller.
   
   To recap my original comment, the implementation should be something like 
this I think.
   
   - We have a shared blocking queue between the producer (RpcServer) and 
consumer (the thread that serializes the input and puts it in an evicting 
queue). All the producer does is put events (too long/too big) events in this 
shared queue which automatically makes the whole thing async from a producer 
POV.
   
   - The consumer (a single thread), keeps polling entries, serializes them 
(also does logging) and puts them into a ring buffer 
   
   This would be much fewer lines of code and much more simple to reason about 
than using the lmax's ring buffer (with very similar performance for our use 
case).
   
   Thoughts?

----------------------------------------------------------------
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.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to