HTRACE-359. TraceRunnable and TraceCallable should be built using parent spanId not scope (Mike Drob via cmccabe)
diff --git a/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java b/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java
index 9cf478d..2318552 100644
--- a/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java
+++ b/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java
@@ -24,14 +24,14 @@
 public class TraceCallable<V> implements Callable<V> {
   private final Tracer tracer;
   private final Callable<V> impl;
-  private final TraceScope parent;
+  private final SpanId parentId;
   private final String description;
 
-  TraceCallable(Tracer tracer, TraceScope parent, Callable<V> impl,
+  public TraceCallable(Tracer tracer, SpanId parentId, Callable<V> impl,
       String description) {
     this.tracer = tracer;
     this.impl = impl;
-    this.parent = parent;
+    this.parentId = parentId;
     this.description = description;
   }
 
@@ -41,7 +41,7 @@
     if (description == null) {
       description = Thread.currentThread().getName();
     }
-    try (TraceScope chunk = tracer.newScope(description, parent.getSpan().getSpanId())) {
+    try (TraceScope chunk = tracer.newScope(description, parentId)) {
       return impl.call();
     }
   }
diff --git a/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java b/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java
index f2db5c2..ad5b36a 100644
--- a/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java
+++ b/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java
@@ -21,14 +21,23 @@
  */
 public class TraceRunnable implements Runnable {
   private final Tracer tracer;
-  private final TraceScope parent;
+  private final SpanId parentId;
   private final Runnable runnable;
   private final String description;
 
+  /**
+   * @deprecated Use {@link #TraceRunnable(Tracer, SpanId, Runnable, String)} instead.
+   */
+  @Deprecated
   public TraceRunnable(Tracer tracer, TraceScope parent,
       Runnable runnable, String description) {
+    this(tracer, parent.getSpanId(), runnable, description);
+  }
+
+  public TraceRunnable(Tracer tracer, SpanId parentId,
+      Runnable runnable, String description) {
     this.tracer = tracer;
-    this.parent = parent;
+    this.parentId = parentId;
     this.runnable = runnable;
     this.description = description;
   }
@@ -39,7 +48,7 @@
     if (description == null) {
       description = Thread.currentThread().getName();
     }
-    try (TraceScope chunk = tracer.newScope(description, parent.getSpan().getSpanId())) {
+    try (TraceScope chunk = tracer.newScope(description, parentId)) {
       runnable.run();
     }
   }
diff --git a/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java b/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java
index a04c9b9..f78e0a0 100644
--- a/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java
+++ b/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java
@@ -446,7 +446,7 @@
     if (parentScope == null) {
       return callable;
     }
-    return new TraceCallable<V>(this, parentScope, callable, description);
+    return new TraceCallable<V>(this, parentScope.getSpanId(), callable, description);
   }
 
   /**
diff --git a/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java b/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java
index bf98a1a..dbdd27c 100644
--- a/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java
+++ b/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java
@@ -66,6 +66,28 @@
     }
   }
 
+  @Test
+  public void testWrappingFromSpan() throws Exception {
+    HTraceConfiguration conf = HTraceConfiguration.fromKeyValuePairs("sampler.classes", "AlwaysSampler");
+
+    ExecutorService es = Executors.newSingleThreadExecutor();
+    try (Tracer tracer = new Tracer.Builder("TestTraceExecutor").conf(conf).build()) {
+      SpanId random = SpanId.fromRandom();
+      try (TraceScope parentScope = tracer.newScope("parent")) {
+        Callable<SpanId> callable = new TraceCallable<SpanId>(tracer, random, new Callable<SpanId>() {
+          @Override
+          public SpanId call() throws Exception {
+            return Tracer.getCurrentSpan().getParents()[0];
+          }
+        }, "child");
+        SpanId result = es.submit(callable).get(WAIT_TIME_SECONDS, TimeUnit.SECONDS);
+        assertEquals(random, result);
+      }
+    } finally {
+      es.shutdown();
+    }
+  }
+
   /*
    * Inspired by org.apache.solr.util.DefaultSolrThreadFactory
    */