@Override public Integer apply(Writable from) { if (!(from instanceof Invocation)) return HConstants.NORMAL_QOS; Invocation inv = (Invocation) from; String methodName = inv.getMethodName(); Integer priorityByAnnotation = annotatedQos.get(methodName); if (priorityByAnnotation != null) { return priorityByAnnotation; } // scanner methods... if (methodName.equals("next") || methodName.equals("close")) { // translate! Long scannerId; try { scannerId = (Long) inv.getParameters()[0]; } catch (ClassCastException ignored) { // LOG.debug("Low priority: " + from); return HConstants.NORMAL_QOS; } String scannerIdString = Long.toString(scannerId); RegionScanner scanner = scanners.get(scannerIdString); if (scanner != null && scanner.getRegionInfo().isMetaTable()) { // LOG.debug("High priority scanner request: " + scannerId); return HConstants.HIGH_QOS; } } else if (inv.getParameterClasses().length == 0) { // Just let it through. This is getOnlineRegions, etc. } else if (inv.getParameterClasses()[0] == byte[].class) { // first arg is byte array, so assume this is a regionname: if (isMetaTable((byte[]) inv.getParameters()[0])) { // LOG.debug("High priority with method: " + methodName + // " and region: " // + Bytes.toString((byte[]) inv.getParameters()[0])); return HConstants.HIGH_QOS; } } else if (inv.getParameterClasses()[0] == MultiAction.class) { MultiAction<?> ma = (MultiAction<?>) inv.getParameters()[0]; Set<byte[]> regions = ma.getRegions(); // ok this sucks, but if any single of the actions touches a meta, the // whole // thing gets pingged high priority. This is a dangerous hack because // people // can get their multi action tagged high QOS by tossing a Get(.META.) // AND this // regionserver hosts META/-ROOT- for (byte[] region : regions) { if (isMetaTable(region)) { // LOG.debug("High priority multi with region: " + // Bytes.toString(region)); return HConstants.HIGH_QOS; // short circuit for the win. } } } // LOG.debug("Low priority: " + from.toString()); return HConstants.NORMAL_QOS; }
@Override public Integer apply(Writable from) { if (!(from instanceof Invocation)) return NORMAL_QOS; Invocation inv = (Invocation) from; String methodName = inv.getMethodName(); Integer priorityByAnnotation = annotatedQos.get(methodName); if (priorityByAnnotation != null) { return priorityByAnnotation; } // scanner methods... if (methodName.equals("next") || methodName.equals("close")) { // translate! Long scannerId; try { scannerId = (Long) inv.getParameters()[0]; } catch (ClassCastException ignored) { // LOG.debug("Low priority: " + from); return NORMAL_QOS; // doh. } String scannerIdString = Long.toString(scannerId); RegionScanner scanner = scanners.get(scannerIdString); if (scanner != null && scanner.getRegionInfo().isMetaRegion()) { // LOG.debug("High priority scanner request: " + scannerId); return HIGH_QOS; } } else if (inv.getParameterClasses().length == 0) { // Just let it through. This is getOnlineRegions, etc. } else if (inv.getParameterClasses()[0] == byte[].class) { // first arg is byte array, so assume this is a regionname: if (isMetaRegion((byte[]) inv.getParameters()[0])) { // LOG.debug("High priority with method: " + methodName + // " and region: " // + Bytes.toString((byte[]) inv.getParameters()[0])); return HIGH_QOS; } } else if (inv.getParameterClasses()[0] == MultiAction.class) { MultiAction<?> ma = (MultiAction<?>) inv.getParameters()[0]; Set<byte[]> regions = ma.getRegions(); // ok this sucks, but if any single of the actions touches a meta, the // whole // thing gets pingged high priority. This is a dangerous hack because // people // can get their multi action tagged high QOS by tossing a Get(.META.) // AND this // regionserver hosts META/-ROOT- for (byte[] region : regions) { if (isMetaRegion(region)) { // LOG.debug("High priority multi with region: " + // Bytes.toString(region)); return HIGH_QOS; // short circuit for the win. } } } // LOG.debug("Low priority: " + from.toString()); return NORMAL_QOS; }