[ 
https://issues.apache.org/jira/browse/DRILL-5122?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul Rogers updated DRILL-5122:
-------------------------------
    Assignee:     (was: Paul Rogers)

> DrillBuf performs very expensive logging if JVM -ea option is set
> -----------------------------------------------------------------
>
>                 Key: DRILL-5122
>                 URL: https://issues.apache.org/jira/browse/DRILL-5122
>             Project: Apache Drill
>          Issue Type: Improvement
>          Components:  Server
>    Affects Versions: 1.8.0
>            Reporter: Paul Rogers
>            Priority: Minor
>
> The {{DrillBuf}} class is the foundation of Drill's direct memory model. It 
> has a very sophisticated allocator mechanism behind it. {{DrillBuf}} provides 
> logging to help track down memory leaks and other issues. Unfortunately, the 
> trigger to turn on this option is based on detecting if assertions are 
> enabled in the JVM.
> Assertions are very handy tools: they are debug-only assertions not executed 
> at run time. They are turned on with the "-ea" option to the JVM. But, in 
> production, the assertions don't execute, avoiding production-time costs.
> In Drill, once assertions are enabled, the dominant cost of a query becomes 
> {{DrillBuf}} logging. One example showed that {{DrillBuf}} logging increases 
> query cost by 10x.
> Debugging of {{DrillBuf}} is handy for those few engineers who need to do so. 
> Over time, {{DrillBuf}} has become quite stable so that, now, most 
> developers, most of the time, do not work on {{DrillBuf}}.
> One wonders: Drill uses Guava preconditions extensively. Is this perhaps due 
> to the high cost of enabling assertions? Since assertions were unavailable, 
> production-time checking via Guava may have become preferred. Assertions are, 
> in fact, better because they incur no overhead in production, while Guava 
> preconditions always execute, even in production. (Here we assume that the 
> code errors that both check will find errors during development so that such 
> errors do not sneak through into production.)
> The code does have a way to turn off debugging, but only if a system property 
> is set on every run. Since Drill has hundreds of unit tests that people might 
> run, this requires creating custom run configurations for each.
> This enhancement proposes to modify {{DrillBuf}} to enable logging only when 
> a) assertions are enabled (so we know it is a debug environment) and b) when 
> a boot-time configuration property is set (so that logging can be turned off 
> for most developers most of the time.) Optionally, b) can be a system 
> property that _enables_ (not disables) {{DrillBuf}} logging.
> The code in question:
> {code}
> class BaseAllocator ... {
>   public static final boolean DEBUG = AssertionUtil.isAssertionsEnabled()
>       || Boolean.parseBoolean(System.getProperty(DEBUG_ALLOCATOR, "false"));
> ...
> class DrillBuf ... {
>   public boolean release(int decrement) {
>     ...
>     if (BaseAllocator.DEBUG) {
>       historicalLog.recordEvent("release(%d). original value: %d", decrement, 
> refCnt + decrement);
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to