[ https://issues.apache.org/jira/browse/DRILL-5052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15732508#comment-15732508 ]
ASF GitHub Bot commented on DRILL-5052: --------------------------------------- Github user arina-ielchiieva commented on a diff in the pull request: https://github.com/apache/drill/pull/660#discussion_r91531999 --- Diff: exec/java-exec/src/main/java/org/apache/drill/exec/compile/CodeCompiler.java --- @@ -33,36 +32,71 @@ import com.google.common.cache.LoadingCache; import com.google.common.collect.Lists; +/** + * Global code compiler mechanism shared by all threads and operators. + * Holds a single cache of generated code (keyed by code source) to + * prevent compiling identical code multiple times. Supports both + * the byte-code merging and plain-old Java methods of code + * generation and compilation. + */ + public class CodeCompiler { -// private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CodeCompiler.class); + + public static final String COMPILE_BASE = "drill.exec.compile"; + String MAX_LOADING_CACHE_SIZE_CONFIG = COMPILE_BASE + ".cache_max_size"; private final ClassTransformer transformer; + private final ClassBuilder classBuilder; + + /** + * Google Guava loading cache that defers creating a cache + * entry until first needed. Creation is done in a thread-safe + * way: if two threads try to create the same class at the same + * time, the first does the work, the second waits for the first + * to complete, then grabs the new entry. + */ + private final LoadingCache<CodeGenerator<?>, GeneratedClassEntry> cache; - private final DrillConfig config; - private final OptionManager optionManager; public CodeCompiler(final DrillConfig config, final OptionManager optionManager) { - transformer = new ClassTransformer(optionManager); - final int cacheMaxSize = config.getInt(ExecConstants.MAX_LOADING_CACHE_SIZE_CONFIG); + transformer = new ClassTransformer(config, optionManager); + classBuilder = new ClassBuilder(config, optionManager); + final int cacheMaxSize = config.getInt(MAX_LOADING_CACHE_SIZE_CONFIG); cache = CacheBuilder.newBuilder() .maximumSize(cacheMaxSize) .build(new Loader()); - this.optionManager = optionManager; - this.config = config; } + /** + * Create a single instance of the generated class. + * + * @param cg + * @return + * @throws ClassTransformationException + * @throws IOException + */ @SuppressWarnings("unchecked") - public <T> T getImplementationClass(final CodeGenerator<?> cg) throws ClassTransformationException, IOException { - return (T) getImplementationClass(cg, 1).get(0); + public <T> T createInstance(final CodeGenerator<?> cg) throws ClassTransformationException, IOException { + return (T) createInstances(cg, 1).get(0); } + /** + * Create multiple instances of the generated class. + * + * @param cg + * @param count + * @return + * @throws ClassTransformationException + * @throws IOException --- End diff -- Description for param, return and exceptions? > Option to debug generated Java code using an IDE > ------------------------------------------------ > > Key: DRILL-5052 > URL: https://issues.apache.org/jira/browse/DRILL-5052 > Project: Apache Drill > Issue Type: Improvement > Components: Execution - Codegen > Affects Versions: 1.8.0 > Reporter: Paul Rogers > Assignee: Paul Rogers > Priority: Minor > > Drill makes extensive use of Java code generation to implement its operators. > Drill uses sophisticated techniques to blend generated code with pre-compiled > template code. An unfortunate side-effect of this behavior is that it is very > difficult to visualize and debug the generated code. > As it turns out, Drill's code-merge facility is, in essence, a do-it-yourself > version of subclassing. The Drill "template" is the parent class, the > generated code is the subclass. But, rather than using plain-old subclassing, > Drill combines the code from the two classes into a single "artificial" > packet of byte codes for which no source exists. > Modify the code generation path to optionally allow "plain-old Java" > compilation: the generated code is a subclass of the template. Compile the > generated code as a plain-old Java class with no byte-code fix-up. Write the > code to a known location that the IDE can search when looking for source > files. > With this change, developers can turn on the above feature, set a breakpoint > in a template, then step directly into the generated Java code called from > the template. > This feature should be an option, enabled by developers when needed. The > existing byte-code technique should be used for production code generation. -- This message was sent by Atlassian JIRA (v6.3.4#6332)