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

Anoop Sam John commented on HBASE-13448:
----------------------------------------

Using below addition in KeyValue.java we can better track #calls 
{code}
  @Override
  public short getRowLength() {
    incInvokeCounts("getRowLength", this);
    return Bytes.toShort(this.bytes, getKeyOffset());
  }
  
  private static Map<String, Map<String, Pair<Integer, StringBuilder>>> 
invokeCounts = new HashMap<String, Map<String, Pair<Integer, StringBuilder>>>();
  private static final byte NEW_LINE = '\n';
  
  private static void incInvokeCounts(String method, Cell thisObj){
    ByteBufferOutputStream os = new ByteBufferOutputStream(100);
    new Exception().printStackTrace(new PrintStream(os));
    byte[] bb = os.getByteBuffer().array();
    int offset = nThIndexOf(bb, NEW_LINE, 3) + 1;
    int endOffset = nThIndexOf(bb, NEW_LINE, 9);
    String msg = null;
    if (endOffset == -1) {
      msg = Bytes.toString(bb, offset);
    } else {
      msg = Bytes.toString(bb, offset, (endOffset - 1 - offset));
    }
    msg = msg.replaceAll("\\r?\\n\\tat", " -> ");
    String s = thisObj.toString();
    String key = s.substring(0, s.lastIndexOf('/'));
    Map<String, Pair<Integer, StringBuilder>> methodMap = 
invokeCounts.get(method);
    if(methodMap == null){
      methodMap =  new HashMap<String, Pair<Integer, StringBuilder>>();
      invokeCounts.put(method, methodMap);
    }
    Pair<Integer, StringBuilder> p = methodMap.get(key);
    if(p == null){
      p = new Pair<Integer, StringBuilder>(0, new StringBuilder());
      methodMap.put(key, p);
    }
    p.setFirst(p.getFirst().intValue()+1);
    StringBuilder sb = p.getSecond();
    sb.append('\n').append(msg);
  }

  public static void printInvokeCounts() {
    for (Entry<String, Map<String, Pair<Integer, StringBuilder>>> entry : 
invokeCounts.entrySet()) {
      for (Entry<String, Pair<Integer, StringBuilder>> e : 
entry.getValue().entrySet()) {
        System.out.println(e.getKey() + "#" + entry.getKey() + "  :  " + 
e.getValue().getFirst());
        System.out.println(e.getValue().getSecond().toString());
      }

      System.out.println("=================================================");
    }
  }

  public static void cleanInvokeCounts() {
    invokeCounts.clear();
  }

  private static int nThIndexOf(byte[] array, byte target, int n) {
    int c = 1;
    for (int i = 0; i < array.length; i++) {
      if (array[i] == target) {
        if(c==n) return i;
        c++;
      }
    }
    return -1;
  }
{code}

> New Cell implementation with cached component offsets/lengths
> -------------------------------------------------------------
>
>                 Key: HBASE-13448
>                 URL: https://issues.apache.org/jira/browse/HBASE-13448
>             Project: HBase
>          Issue Type: Sub-task
>          Components: Scanners
>            Reporter: Anoop Sam John
>            Assignee: Anoop Sam John
>             Fix For: 2.0.0
>
>         Attachments: HBASE-13448.patch, HBASE-13448_V2.patch, gc.png, hits.png
>
>
> This can be extension to KeyValue and can be instantiated and used in read 
> path.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to