Till Westmann has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2087

Change subject: [WIP] Tracing experiment
......................................................................

[WIP] Tracing experiment

Change-Id: I3f26ae988d3786ef4ddb17e8fe78f911e7e628f1
---
M 
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
M 
hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
M 
hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
M 
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
M 
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
M 
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
A 
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/TraceCategoryRegistry.java
M 
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
A 
hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceCategoryRegistryTest.java
9 files changed, 224 insertions(+), 14 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/87/2087/1

diff --git 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
index 3791f61..fcd00a1 100644
--- 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
+++ 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
@@ -140,7 +140,8 @@
 
     @Override
     public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
-        long tid = tracer.durationB("Ingestion-Store", "Process-Frame", null);
+        final String cat = "Process-Frame";
+        long tid = tracer.durationB("Ingestion-Store", cat, null);
         try {
             FeedUtils.processFeedMessage(buffer, message, fta);
             writer.nextFrame(buffer);
@@ -148,7 +149,7 @@
             LOGGER.log(Level.WARNING, "Failure Processing a frame at store 
side", e);
             throw HyracksDataException.create(e);
         } finally {
-            tracer.durationE(tid, null);
+            tracer.durationE(tid, cat, null);
         }
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
index a377d75..9e46798 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
@@ -123,7 +123,7 @@
         try {
             flush(writer);
         } finally {
-            ITracer.check(tracer).durationE(tid, args);
+            ITracer.check(tracer).durationE(tid, cat, args);
         }
     }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
index ea53c25..ae2e691 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java
@@ -157,7 +157,7 @@
             flushedBytes = frameTupleAppender.getBuffer().capacity();
             long tid = ITracer.check(tracer).durationB(name, cat, args);
             frameTupleAppender.write(writer, true);
-            ITracer.check(tracer).durationE(tid, args);
+            ITracer.check(tracer).durationE(tid, cat, args);
             if (!frameTupleAppender.append(tupleAccessor, tIndex)) {
                 throw 
HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME,
                         tupleAccessor.getTupleLength(tIndex));
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
index 9cc8022..af743da 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
@@ -87,7 +87,7 @@
         try {
             return ioOp.call();
         } finally {
-            tracer.durationE(tid, "{\"optional\":\"value\"}");
+            tracer.durationE(tid, cat, "{\"optional\":\"value\"}");
         }
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
index b3f5c98..aa29086 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Event.java
@@ -23,8 +23,10 @@
 final class Event {
     private static final long NANOTIME_DELTA_TO_EPOCH =
             System.nanoTime() - 
TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis());
+    private final TraceCategoryRegistry registry = 
TraceCategoryRegistry.INSTANCE;
+
     public final String name;
-    public final String cat;
+    public final long cat;
     public final ITracer.Phase ph;
     public final long ts;
     public final int pid;
@@ -32,7 +34,7 @@
     public final ITracer.Scope scope;
     public final String args;
 
-    private Event(String name, String cat, ITracer.Phase ph, long ts, int pid, 
long tid, ITracer.Scope scope,
+    private Event(String name, long cat, ITracer.Phase ph, long ts, int pid, 
long tid, ITracer.Scope scope,
             String args) {
         this.name = name;
         this.cat = cat;
@@ -49,6 +51,12 @@
     }
 
     public static Event create(String name, String cat, ITracer.Phase ph, int 
pid, long tid, ITracer.Scope scope,
+            String args, TraceCategoryRegistry registry) {
+        long catCode = registry.get(cat);
+        return new Event(name, catCode, ph, timestamp(), pid, tid, scope, 
args);
+    }
+
+    public static Event create(String name, long cat, ITracer.Phase ph, int 
pid, long tid, ITracer.Scope scope,
             String args) {
         return new Event(name, cat, ph, timestamp(), pid, tid, scope, args);
     }
@@ -62,8 +70,9 @@
         if (name != null) {
             sb.append("\"name\":\"").append(name).append("\",");
         }
-        if (cat != null) {
-            sb.append("\"cat\":\"").append(cat).append("\",");
+        if (cat != 0L) {
+            final String catName = registry.getName(cat);
+            sb.append("\"cat\":\"").append(catName).append("\",");
         }
         sb.append("\"ph\":\"").append(ph).append("\",");
         sb.append("\"pid\":\"").append(pid).append("\",");
diff --git 
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
index 01b78da..ddff568 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/ITracer.java
@@ -68,12 +68,27 @@
         }
 
         @Override
-        public void durationE(long tid, String args) {
+        public void durationE(long tid, String cat, String args) {
             // nothing to do here
         }
 
         @Override
         public void instant(String name, String cat, Scope scope, String args) 
{
+            // nothing to do here
+        }
+
+        @Override
+        public long durationB(String name, long cat, String args) {
+            return -1;
+        }
+
+        @Override
+        public void durationE(long tid, long cat, String args) {
+            // nothing to do here
+        }
+
+        @Override
+        public void instant(String name, long cat, Scope scope, String args) {
             // nothing to do here
         }
     };
@@ -91,10 +106,16 @@
 
     long durationB(String name, String cat, String args);
 
-    void durationE(long tid, String args);
+    void durationE(long tid, String cat, String args);
 
     void instant(String name, String cat, Scope scope, String args);
 
+    long durationB(String name, long cat, String args);
+
+    void durationE(long tid, long cat, String args);
+
+    void instant(String name, long cat, Scope scope, String args);
+
     @Override
     String toString();
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/TraceCategoryRegistry.java
 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/TraceCategoryRegistry.java
new file mode 100644
index 0000000..c72f241
--- /dev/null
+++ 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/TraceCategoryRegistry.java
@@ -0,0 +1,65 @@
+/*
+ * 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.hyracks.util.trace;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TraceCategoryRegistry {
+
+    public static TraceCategoryRegistry INSTANCE = new TraceCategoryRegistry();
+
+    static final int NO_CATEGORIES = 64;
+    private Map<String, Long> categories = new HashMap<>();
+    private int bitPos = 0;
+
+    public long register(String name) {
+        if (categories.containsKey(name)) {
+            throw new IllegalStateException("Category " + name + " already 
exsits");
+        }
+        if (bitPos > NO_CATEGORIES - 1) {
+            throw new IllegalStateException("Cannot add category " + name);
+        }
+        final long categoryCode = 1L << bitPos++;
+        categories.put(name, categoryCode);
+        return categoryCode;
+    }
+
+    public long get(String name) {
+        return categories.get(name);
+    }
+
+    public long get(String... names) {
+        long result = 0;
+        for (String name : names) {
+            result |= get(name);
+        }
+        return result;
+    }
+
+    public String getName(long categoryCode) {
+        for (Map.Entry<String, Long> e : categories.entrySet()) {
+            if (categoryCode == e.getValue()) {
+                return e.getKey();
+            }
+        }
+        throw new IllegalArgumentException("No category for code " + 
categoryCode);
+    }
+}
diff --git 
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
index 00991e4..518ad42 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
@@ -35,6 +35,8 @@
 
     public static final Logger LOGGER = 
Logger.getLogger(Tracer.class.getName());
 
+    private final TraceCategoryRegistry registry = 
TraceCategoryRegistry.INSTANCE;
+
     protected static final Level TRACE_LOG_LEVEL = Level.INFO;
     protected static final String CAT = "Tracer";
     protected static final DateFormat DATE_FORMAT = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
@@ -77,19 +79,38 @@
 
     @Override
     public long durationB(String name, String cat, String args) {
+        Event e = Event.create(name, cat, Phase.B, pid, 
Thread.currentThread().getId(), null, args, registry);
+        traceLog.log(TRACE_LOG_LEVEL, e.toJson());
+        return e.tid;
+    }
+
+    @Override
+    public void durationE(long tid, String cat, String args) {
+        Event e = Event.create(null, null, Phase.E, pid, tid, null, args, 
registry);
+        traceLog.log(TRACE_LOG_LEVEL, e.toJson());
+    }
+
+    @Override
+    public void instant(String name, String cat, Scope scope, String args) {
+        Event e = Event.create(name, cat, Phase.i, pid, 
Thread.currentThread().getId(), scope, args, registry);
+        traceLog.log(TRACE_LOG_LEVEL, e.toJson());
+    }
+
+    @Override
+    public long durationB(String name, long cat, String args) {
         Event e = Event.create(name, cat, Phase.B, pid, 
Thread.currentThread().getId(), null, args);
         traceLog.log(TRACE_LOG_LEVEL, e.toJson());
         return e.tid;
     }
 
     @Override
-    public void durationE(long tid, String args) {
-        Event e = Event.create(null, null, Phase.E, pid, tid, null, args);
+    public void durationE(long tid, long cat, String args) {
+        Event e = Event.create(null, 0L, Phase.E, pid, tid, null, args);
         traceLog.log(TRACE_LOG_LEVEL, e.toJson());
     }
 
     @Override
-    public void instant(String name, String cat, Scope scope, String args) {
+    public void instant(String name, long cat, Scope scope, String args) {
         Event e = Event.create(name, cat, Phase.i, pid, 
Thread.currentThread().getId(), scope, args);
         traceLog.log(TRACE_LOG_LEVEL, e.toJson());
     }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceCategoryRegistryTest.java
 
b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceCategoryRegistryTest.java
new file mode 100644
index 0000000..fc725cb
--- /dev/null
+++ 
b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceCategoryRegistryTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.hyracks.util.trace;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TraceCategoryRegistryTest {
+
+    @Test
+    public void limit() {
+        TraceCategoryRegistry registry = new TraceCategoryRegistry();
+
+        int success = 0;
+        int fail = 0;
+        String expectedError = "Cannot add category";
+        String actualError = null;
+        for (int i = 0; i < TraceCategoryRegistry.NO_CATEGORIES + 1; ++i) {
+            try {
+                final String name = "cat" + Integer.toHexString(i);
+                registry.register(name);
+                ++success;
+            } catch (IllegalStateException ise) {
+                actualError = ise.getMessage();
+                ++fail;
+            }
+        }
+        Assert.assertEquals(64, success);
+        Assert.assertEquals(1, fail);
+        Assert.assertTrue(actualError.contains(expectedError));
+    }
+
+    @Test
+    public void getNameValidCode() {
+        TraceCategoryRegistry registry = new TraceCategoryRegistry();
+        registry.register("catA");
+        registry.register("catB");
+        registry.register("catC");
+
+        int success = 0;
+        int fail = 0;
+        String expectedError = "No category for code";
+        String actualError = null;
+        String expectedResult = "catC";
+        String actualResult = null;
+        for (int i = 0; i < TraceCategoryRegistry.NO_CATEGORIES; ++i) {
+            try {
+                final long code = 1L << i;
+                actualResult = registry.getName(code);
+                ++success;
+            } catch (IllegalArgumentException iae) {
+                actualError = iae.getMessage();
+                ++fail;
+            }
+        }
+
+        Assert.assertEquals(3, success);
+        Assert.assertEquals(61, fail);
+        Assert.assertEquals(actualResult, expectedResult);
+        Assert.assertTrue(actualError.contains(expectedError));
+    }
+
+    @Test
+    public void getNameInvalidCode() {
+        TraceCategoryRegistry registry = new TraceCategoryRegistry();
+
+        final String expectedError = "No category for code";
+        String actualError = null;
+        try {
+            registry.getName(11);
+        } catch (IllegalArgumentException iae) {
+            actualError = iae.getMessage();
+        }
+        Assert.assertTrue(actualError.contains(expectedError));
+    }
+}

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2087
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3f26ae988d3786ef4ddb17e8fe78f911e7e628f1
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Till Westmann <[email protected]>

Reply via email to