Skip to content

Commit c15af43

Browse files
committed
Add an example to the indylambda findAccessedFields, including trace-level log.
1 parent c1a1021 commit c15af43

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

core/src/main/scala/org/apache/spark/util/ClosureCleaner.scala

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,10 +525,60 @@ private[spark] object IndylambdaScalaClosures extends Logging {
525525
op == INVOKESPECIAL && name == "<init>" && desc.startsWith(s"(L$callerInternalName;")
526526
}
527527

528+
// scalastyle:off line.size.limit
528529
/**
529530
* Scans an indylambda Scala closure, along with its lexically nested closures, and populate
530531
* the accessed fields info on which fields on the outer object are accessed.
532+
*
533+
* Example: run the following code snippet in a Spark Shell w/ Scala 2.12+:
534+
* val topLevelValue = "someValue"; val closure = (j: Int) => {
535+
* class InnerFoo {
536+
* val innerClosure = (x: Int) => (1 to x).map { y => y + topLevelValue }
537+
* }
538+
* val innerFoo = new InnerFoo
539+
* (1 to j).flatMap(innerFoo.innerClosure)
540+
* }
541+
* sc.parallelize(0 to 2).map(closure).collect
542+
*
543+
* produces the following trace-level logs: (omitting the "ignoring ..." logs)
544+
* Cleaning indylambda closure: $anonfun$closure$1$adapted
545+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.$anonfun$closure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq;
546+
* found intra class call to $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.$anonfun$closure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw;I)Lscala/collection/immutable/IndexedSeq;
547+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.$anonfun$closure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw;I)Lscala/collection/immutable/IndexedSeq;
548+
* found inner class $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1
549+
* found call to outer $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.innerClosure()Lscala/Function1;
550+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.innerClosure()Lscala/Function1;
551+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$deserializeLambda$(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;
552+
* invokedynamic: lambdaDeserialize(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;, bsmHandle=scala/runtime/LambdaDeserialize.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite; (6), bsmArgs=WrappedArray($line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6), $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq; (6))
553+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq;
554+
* found intra class call to $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Lscala/collection/immutable/IndexedSeq;
555+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Lscala/collection/immutable/IndexedSeq;
556+
* invokedynamic: apply(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;)Lscala/Function1;, bsmHandle=java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; (6), bsmArgs=WrappedArray((Ljava/lang/Object;)Ljava/lang/Object;, $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6), (Ljava/lang/Object;)Ljava/lang/String;, 7, 1, Lscala/Serializable;, 1, (Ljava/lang/Object;)Ljava/lang/String;)
557+
* found inner closure $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6)
558+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String;
559+
* found intra class call to $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Ljava/lang/String;
560+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Ljava/lang/String;
561+
* found call to outer $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.topLevelValue()Ljava/lang/String;
562+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.topLevelValue()Ljava/lang/String;
563+
* found field access topLevelValue on $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw
564+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String;
565+
* found intra class call to $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Ljava/lang/String;
566+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.<init>(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw;)V
567+
* invokedynamic: apply(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;)Lscala/Function1;, bsmHandle=java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; (6), bsmArgs=WrappedArray((Ljava/lang/Object;)Ljava/lang/Object;, $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq; (6), (Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq;, 7, 1, Lscala/Serializable;, 1, (Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq;)
568+
* found inner closure $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq; (6)
569+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Lscala/collection/immutable/IndexedSeq;
570+
* invokedynamic: apply(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;)Lscala/Function1;, bsmHandle=java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; (6), bsmArgs=WrappedArray((Ljava/lang/Object;)Ljava/lang/Object;, $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6), (Ljava/lang/Object;)Ljava/lang/String;, 7, 1, Lscala/Serializable;, 1, (Ljava/lang/Object;)Ljava/lang/String;)
571+
* found inner closure $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6)
572+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Ljava/lang/String;
573+
* found call to outer $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.topLevelValue()Ljava/lang/String;
574+
* scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.innerClosure()Lscala/Function1;
575+
* + fields accessed by starting closure: 2 classes
576+
* (class java.lang.Object,Set())
577+
* (class $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw,Set(topLevelValue))
578+
* + cloning instance of REPL class $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw
579+
* +++ indylambda closure ($anonfun$closure$1$adapted) is now cleaned +++
531580
*/
581+
// scalastyle:on line.size.limit
532582
def findAccessedFields(
533583
lambdaProxy: SerializedLambda,
534584
lambdaClassLoader: ClassLoader,

0 commit comments

Comments
 (0)