[ 
https://issues.apache.org/jira/browse/HBASE-10993?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13985685#comment-13985685
 ] 

Jonathan Hsieh commented on HBASE-10993:
----------------------------------------

Instead of boolean could we make this a string and have some validation it?  
'fifo' and 'deadline' seems like reasonable names for the two versions.  This 
would allow for newer queues to be added without adding a new wonky configs and 
invalid config patterns.
{code}
+  /** If set to true, uses a priority queue and deprioritize long-running 
scans */
+  public static final String DEADLINE_CALL_QUEUE_CONF_KEY = 
"ipc.server.use.deadline.callqueue";
+
{code}

This should have one more consistent tiebreaker -- deadlineA and deadlineB 
could be equal (see 
http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html).. hm.. 
revisiting after reading BoundedPriorityBlockingQueue -- need to put warning on 
this saying that ties are explicitly allowed and handled by special queue.
{code}
+    @Override
+    public int compare(CallRunner a, CallRunner b) {
+      RpcServer.Call callA = a.getCall();
+      RpcServer.Call callB = b.getCall();
+      long deadlineA = priority.getDeadline(callA.getHeader(), callA.param);
+      long deadlineB = priority.getDeadline(callB.getHeader(), callB.param);
+      deadlineA = callA.timestamp + Math.min(deadlineA, maxDelay);
+      deadlineB = callB.timestamp + Math.min(deadlineB, maxDelay);
+      return (int)(deadlineA - deadlineB);
+    }
{code}

It isn't how long the scan request lives but how many times it is used (which 
is captured by vtime),  right?
{code}
+      // get the 'virtual time' of the scanner, and applies sqrt() to get a
+      // nice curve for the delay. longer a scan request lives the less 
priority it gets.
+      // The weight is used to have more control on the delay.
{code}

nice, I like how the queue logic is separate from locking behavior of the 
queue. (would have been nice to have some javadoc about this pattern on the 
private static class PriorityQueue<E> (I thought this was racy until I got to 
the next section).

nit: two ';'s 
+  // Lock used for all operations
+  private final ReentrantLock lock = new ReentrantLock();;

nit: why this (multiple times). is this an artifact of previous iteration?
+
+    final ReentrantLock lock = this.lock;
+    lock.lock();

this is basically the right idea, but I think the equation is a little off -- 
shouldn't it the sum of time each call was waiting as opposed to the more 
costly 2x penalization of subsequent calls?
{code}
+      int cumsum = 0;
+      for (int i = 0; i < work.size(); ++i) {
+        LOG.debug("Request i=" + i + " value=" + work.get(i));
+        cumsum += cumsum + work.get(i);
+      }
+      LOG.debug("Time cumulative sum=" + cumsum);
+
+      // -> [small small small huge small large small small]
+      // -> NO REORDER   [10 10 10 100 10 50 10 10] -> 4150 (FIFO Queue)
                                           10 20 30 130 140 190 200 210 -> 930  
 // this instead of this sequence
                                           10 30 70 240 490 1030 2070 4150
+      // -> WITH REORDER [10 10 10 10 10 10 50 100] -> 2720 (Deadline Queue)
                                            10 20 30 40 50 60 110 210 -> 530    
// this instead of this sequence.
                                            10 30 70 150 310 630 1310 2720

{code}



> Deprioritize long-running scanners
> ----------------------------------
>
>                 Key: HBASE-10993
>                 URL: https://issues.apache.org/jira/browse/HBASE-10993
>             Project: HBase
>          Issue Type: Sub-task
>            Reporter: Matteo Bertozzi
>            Assignee: Matteo Bertozzi
>            Priority: Minor
>             Fix For: 0.99.0
>
>         Attachments: HBASE-10993-v0.patch, HBASE-10993-v1.patch, 
> HBASE-10993-v2.patch
>
>
> Currently we have a single call queue that serves all the "normal user"  
> requests, and the requests are executed in FIFO.
> When running map-reduce jobs and user-queries on the same machine, we want to 
> prioritize the user-queries.
> Without changing too much code, and not having the user giving hints, we can 
> add a “vtime” field to the scanner, to keep track from how long is running. 
> And we can replace the callQueue with a priorityQueue. In this way we can 
> deprioritize long-running scans, the longer a scan request lives the less 
> priority it gets.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to