Till Westmann has uploaded a new change for review.

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

Change subject: WIP - result distribution
......................................................................

WIP - result distribution

Change-Id: I0260723652b817bfe43f8f1542676ff6b4a758f1
---
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
M asterixdb/asterix-app/src/main/resources/asterix-build-configuration.xml
M asterixdb/asterix-app/src/test/resources/runtimets/only_sqlpp.xml
M 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-failed/async-failed.2.pollget.uri
M 
hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceInterfaceRemoteProxy.java
M 
hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/BaseCCApplication.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
A 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/utils/LoggingUtils.java
10 files changed, 223 insertions(+), 22 deletions(-)


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

diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
index ba98f73..937e5f2 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
@@ -46,6 +46,7 @@
 import org.apache.hyracks.control.common.controllers.CCConfig;
 import org.apache.hyracks.control.common.controllers.ControllerConfig;
 import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.hyracks.control.common.utils.LoggingUtils;
 import org.apache.hyracks.control.nc.NodeControllerService;
 import org.kohsuke.args4j.CmdLineException;
 
@@ -91,6 +92,9 @@
         } ;
 
         cc.start();
+
+        
LoggingUtils.updateHandlerLevels(Logger.getLogger("org.apache.hyracks"));
+        
LoggingUtils.updateHandlerLevels(Logger.getLogger("org.apache.asterix"));
 
         // Starts ncs.
         nodeNames = ccConfig.getConfigManager().getNodeNames();
@@ -164,7 +168,9 @@
         if (nodeStores == null) {
             throw new IllegalStateException("Couldn't find stores for NC: " + 
ncConfig.getNodeId());
         }
-        LOGGER.info("Using the path: " + getDefaultStoragePath());
+        String tempDirPath = getDefaultStoragePath();
+        LOGGER.log(Level.INFO, () -> String.format("using the temp path: %s 
for iodevices for node %s", tempDirPath,
+                ncConfig.getNodeId()));
         for (int i = 0; i < nodeStores.length; i++) {
             // create IO devices based on stores
             nodeStores[i] = joinPath(getDefaultStoragePath(), 
ncConfig.getNodeId(), nodeStores[i]);
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
index 21afdf1..18daefe 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
@@ -88,6 +88,7 @@
 import org.apache.hyracks.control.cc.BaseCCApplication;
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.common.controllers.CCConfig;
+import org.apache.hyracks.control.common.utils.LoggingUtils;
 import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.http.server.HttpServer;
 import org.apache.hyracks.http.server.WebManager;
@@ -161,7 +162,9 @@
     protected void configureLoggingLevel(Level level) {
         super.configureLoggingLevel(level);
         LOGGER.info("Setting Asterix log level to " + level);
-        Logger.getLogger("org.apache.asterix").setLevel(level);
+        final Logger logger = Logger.getLogger("org.apache.asterix");
+        logger.setLevel(level);
+        LoggingUtils.checkHandlerLevels(logger);
     }
 
     protected List<AsterixExtension> getExtensions() {
diff --git 
a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration.xml 
b/asterixdb/asterix-app/src/main/resources/asterix-build-configuration.xml
index ce7eb3d..90f6dc2 100644
--- a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration.xml
+++ b/asterixdb/asterix-app/src/main/resources/asterix-build-configuration.xml
@@ -106,7 +106,7 @@
   </property>
   <property>
     <name>log.level</name>
-    <value>INFO</value>
+    <value>FINE</value>
     <description>foo</description>
   </property>
 </asterixConfiguration>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/only_sqlpp.xml 
b/asterixdb/asterix-app/src/test/resources/runtimets/only_sqlpp.xml
index 876a10b..b0f7480 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/only_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/only_sqlpp.xml
@@ -17,7 +17,32 @@
  ! specific language governing permissions and limitations
  ! under the License.
  !-->
+<!DOCTYPE test-suite [
+        <!ENTITY RecordsQueries SYSTEM 
"queries_sqlpp/objects/ObjectsQueries.xml">
+        ]>
 <test-suite xmlns="urn:xml.testframework.asterix.apache.org" 
ResultOffsetPath="results" QueryOffsetPath="queries_sqlpp">
   <test-group name="failed">
   </test-group>
+  <test-group name="async-deferred">
+    <test-case FilePath="async-deferred">
+      <compilation-unit name="async-failed">
+        <output-dir compare="Text">async-failed</output-dir>
+        <expected-error>Injected failure in 
asterix:inject-failure</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="async-deferred">
+      <compilation-unit name="async-compilation-failed">
+        <output-dir compare="Text">async-compilation-failed</output-dir>
+        <expected-error>Cannot find dataset gargel</expected-error>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+  <test-group name="aggregate">
+    <test-case FilePath="aggregate">
+      <compilation-unit name="avg_mixed">
+        <output-dir compare="Text">avg_mixed</output-dir>
+        <expected-error>Type incompatibility: function agg-avg gets 
incompatible input values: string and float</expected-error>
+      </compilation-unit>
+    </test-case>
+  </test-group>
 </test-suite>
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-failed/async-failed.2.pollget.uri
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-failed/async-failed.2.pollget.uri
index e20319a..e0989d3 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-failed/async-failed.2.pollget.uri
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-failed/async-failed.2.pollget.uri
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-#polltimeoutsecs=30
+#polltimeoutsecs=300
 #handlevariable=result
 
 $status
diff --git 
a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceInterfaceRemoteProxy.java
 
b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceInterfaceRemoteProxy.java
index 4310cd0..7eeb913 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceInterfaceRemoteProxy.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceInterfaceRemoteProxy.java
@@ -40,16 +40,16 @@
 
     @Override
     public Status getDatasetResultStatus(JobId jobId, ResultSetId rsId) throws 
Exception {
-        HyracksClientInterfaceFunctions.GetDatasetResultStatusFunction gdrlf = 
new HyracksClientInterfaceFunctions.GetDatasetResultStatusFunction(
-                jobId, rsId);
+        HyracksClientInterfaceFunctions.GetDatasetResultStatusFunction gdrlf =
+                new 
HyracksClientInterfaceFunctions.GetDatasetResultStatusFunction(jobId, rsId);
         return (Status) rpci.call(ipcHandle, gdrlf);
     }
 
     @Override
     public DatasetDirectoryRecord[] getDatasetResultLocations(JobId jobId, 
ResultSetId rsId,
             DatasetDirectoryRecord[] knownRecords) throws Exception {
-        HyracksClientInterfaceFunctions.GetDatasetResultLocationsFunction 
gdrlf = new HyracksClientInterfaceFunctions.GetDatasetResultLocationsFunction(
-                jobId, rsId, knownRecords);
+        HyracksClientInterfaceFunctions.GetDatasetResultLocationsFunction 
gdrlf =
+                new 
HyracksClientInterfaceFunctions.GetDatasetResultLocationsFunction(jobId, rsId, 
knownRecords);
         return (DatasetDirectoryRecord[]) rpci.call(ipcHandle, gdrlf);
     }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
 
b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
index fdac7f1..529ca59 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
@@ -23,6 +23,7 @@
 import java.net.SocketAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Level;
@@ -72,6 +73,15 @@
 
     private static int NUM_READ_BUFFERS = 1;
 
+    static void enter(String method, Object... objs) {
+        LOGGER.log(Level.FINE,
+                () -> String.format("*** ENTRY HyracksDatasetReader.%s %s", 
method, Arrays.toString(objs)));
+    }
+
+    static void leave(String method) {
+        LOGGER.log(Level.FINE, () -> String.format("*** EXIT 
HyracksDatasetReader.%s", method));
+    }
+
     public HyracksDatasetReader(IHyracksDatasetDirectoryServiceConnection 
datasetDirectoryServiceConnection,
             ClientNetworkManager netManager, IHyracksCommonContext 
datasetClientCtx, JobId jobId,
             ResultSetId resultSetId)
@@ -91,6 +101,7 @@
     @Override
     public Status getResultStatus() {
         try {
+            enter("getResultStatus", Thread.currentThread().getName());
             return 
datasetDirectoryServiceConnection.getDatasetResultStatus(jobId, resultSetId);
         } catch (HyracksDataException e) {
             if (e.getErrorCode() != ErrorCode.NO_RESULTSET) {
@@ -98,16 +109,23 @@
             }
         } catch (Exception e) {
             LOGGER.log(Level.WARNING, "Exception retrieving result set for job 
" + jobId, e);
+        } finally {
+            leave("getResultStatus");
         }
         return null;
     }
 
     private DatasetDirectoryRecord getRecord(int partition) throws Exception {
-        while (knownRecords == null || knownRecords[partition] == null) {
-            knownRecords = datasetDirectoryServiceConnection
-                    .getDatasetResultLocations(jobId, resultSetId, 
knownRecords);
+        enter("getRecord", partition, Thread.currentThread().getName());
+        try {
+            while (knownRecords == null || knownRecords[partition] == null) {
+                knownRecords = datasetDirectoryServiceConnection
+                        .getDatasetResultLocations(jobId, resultSetId, 
knownRecords);
+            }
+            return knownRecords[partition];
+        } finally {
+            leave("getRecord");
         }
-        return knownRecords[partition];
     }
 
     private boolean nextPartition() throws HyracksDataException {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/BaseCCApplication.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/BaseCCApplication.java
index b94cf01..06dd220 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/BaseCCApplication.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/BaseCCApplication.java
@@ -31,6 +31,7 @@
 import org.apache.hyracks.control.common.controllers.CCConfig;
 import org.apache.hyracks.control.common.controllers.ControllerConfig;
 import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.hyracks.control.common.utils.LoggingUtils;
 
 public class BaseCCApplication implements ICCApplication {
     private static final Logger LOGGER = 
Logger.getLogger(BaseCCApplication.class.getName());
@@ -76,7 +77,8 @@
 
     protected void configureLoggingLevel(Level level) {
         LOGGER.info("Setting Hyracks log level to " + level);
-        Logger.getLogger("org.apache.hyracks").setLevel(level);
+        final Logger logger = Logger.getLogger("org.apache.hyracks");
+        logger.setLevel(level);
+        LoggingUtils.checkHandlerLevels(logger);
     }
-
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
index 3cc41c5..84ea757 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
@@ -54,7 +54,18 @@
  */
 public class DatasetDirectoryService implements IDatasetDirectoryService {
 
-    private static final Logger LOGGER = 
Logger.getLogger(DatasetDirectoryService.class.getName());
+    static void enter(String method, Object... objs) {
+        LOGGER.log(Level.FINE,
+                () -> String.format("*** ENTRY DatasetDirectoryService.%s %s", 
method, Arrays.toString(objs)));
+    }
+
+    static void leave(String method) {
+        LOGGER.log(Level.FINE, () -> String.format("*** EXIT 
DatasetDirectoryService.%s", method));
+    }
+
+    int bla = 0;
+
+    static final Logger LOGGER = 
Logger.getLogger(DatasetDirectoryService.class.getName());
 
     private final long resultTTL;
 
@@ -70,6 +81,7 @@
         this.resultSweepThreshold = resultSweepThreshold;
         this.preDistributedJobStore = preDistributedJobStore;
         jobResultLocations = new LinkedHashMap<JobId, JobResultInfo>();
+        //LOGGER.setLevel(Level.FINER);
     }
 
     @Override
@@ -142,24 +154,42 @@
     @Override
     public synchronized void reportResultPartitionWriteCompletion(JobId jobId, 
ResultSetId rsId, int partition)
             throws HyracksDataException {
+        enter("reportResultPartitionWriteCompletion", jobId, rsId, partition);
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        //System.err.println("*** reportResultPartitionWriteCompletion");
         DatasetJobRecord djr = getNonNullDatasetJobRecord(jobId);
         djr.getDirectoryRecord(rsId, partition).writeEOS();
         djr.updateState(rsId);
         notifyAll();
+        leave("reportResultPartitionWriteCompletion");
     }
 
     @Override
     public synchronized void reportResultPartitionFailure(JobId jobId, 
ResultSetId rsId, int partition) {
+        enter("reportResultPartitionFailure", jobId, rsId, partition);
+        try {
+            Thread.sleep(1);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        //System.err.println("*** reportResultPartitionFailure");
         DatasetJobRecord djr = getDatasetJobRecord(jobId);
         if (djr != null) {
             djr.fail(rsId, partition);
         }
-        jobResultLocations.get(jobId).setException(new Exception());
+        jobResultLocations.get(jobId).setException(new Exception()); // 
TODO(tillw) remove
         notifyAll();
+        leave("reportResultPartitionFailure");
     }
 
     @Override
     public synchronized void reportJobFailure(JobId jobId, List<Exception> 
exceptions) {
+        enter("reportJobFailure", jobId, exceptions);
+        //System.err.println("*** reportJobFailure");
         DatasetJobRecord djr = getDatasetJobRecord(jobId);
         if (djr != null) {
             djr.fail(exceptions);
@@ -169,12 +199,18 @@
             jobResultInfo.setException(exceptions.isEmpty() ? null : 
exceptions.get(0));
         }
         notifyAll();
+        leave("reportJobFailure");
     }
 
     @Override
     public synchronized DatasetJobRecord.Status getResultStatus(JobId jobId, 
ResultSetId rsId)
             throws HyracksDataException {
-        return getNonNullDatasetJobRecord(jobId).getStatus();
+        enter("getResultStatus", jobId, rsId);
+        try {
+            return getNonNullDatasetJobRecord(jobId).getStatus();
+        } finally {
+            leave("getResultStatus");
+        }
     }
 
     @Override
@@ -184,15 +220,25 @@
 
     @Override
     public IDatasetStateRecord getState(JobId jobId) {
-        return getDatasetJobRecord(jobId);
+        enter("getState", jobId);
+        try {
+            return getDatasetJobRecord(jobId);
+        } finally {
+            leave("getState");
+        }
     }
 
     @Override
     public synchronized long getResultTimestamp(JobId jobId) {
-        if (preDistributedJobStore.jobIsPredistributed(jobId)){
-            return -1;
+        enter("getResultTimestamp", jobId);
+        try {
+            if (preDistributedJobStore.jobIsPredistributed(jobId)) {
+                return -1;
+            }
+            return getState(jobId).getTimestamp();
+        } finally {
+            leave("getResultTimestamp");
         }
-        return getState(jobId).getTimestamp();
     }
 
     @Override
@@ -204,12 +250,15 @@
     public synchronized void getResultPartitionLocations(JobId jobId, 
ResultSetId rsId,
             DatasetDirectoryRecord[] knownRecords, 
IResultCallback<DatasetDirectoryRecord[]> callback)
             throws HyracksDataException {
+        enter("getResultPartitionLocations", jobId, rsId, knownRecords, 
callback);
+        //System.err.println("*** getResultPartitionLocations");
         DatasetDirectoryRecord[] updatedRecords = updatedRecords(jobId, rsId, 
knownRecords);
         if (updatedRecords == null) {
             jobResultLocations.get(jobId).addWaiter(rsId, knownRecords, 
callback);
         } else {
             callback.setValue(updatedRecords);
         }
+        leave("getResultPartitionLocations");
     }
 
     /**
@@ -231,6 +280,11 @@
      */
     private DatasetDirectoryRecord[] updatedRecords(JobId jobId, ResultSetId 
rsId,
             DatasetDirectoryRecord[] knownRecords) throws HyracksDataException 
{
+        //        if (bla < 1) {
+        //            ++bla;
+        //            System.err.println("*** updatedRecords " + bla);
+        //            return null;
+        //        }
         DatasetJobRecord djr = getNonNullDatasetJobRecord(jobId);
 
         if (djr.getStatus().getState() == State.FAILED) {
@@ -282,14 +336,21 @@
 
     void addWaiter(ResultSetId rsId, DatasetDirectoryRecord[] knownRecords,
             IResultCallback<DatasetDirectoryRecord[]> callback) {
+        DatasetDirectoryService.enter("addWaiter", rsId, knownRecords, 
callback);
         if (waiters == null) {
             waiters = new Waiters();
         }
         waiters.put(rsId, new Waiter(knownRecords, callback));
+        DatasetDirectoryService.leave("addWaiter");
     }
 
     Waiter removeWaiter(ResultSetId rsId) {
-        return waiters.remove(rsId);
+        DatasetDirectoryService.enter("removeWaiter", rsId);
+        try {
+            return waiters.remove(rsId);
+        } finally {
+            DatasetDirectoryService.leave("removeWaiter");
+        }
     }
 
     Waiter getWaiter(ResultSetId rsId) {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/utils/LoggingUtils.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/utils/LoggingUtils.java
new file mode 100644
index 0000000..0a5749f
--- /dev/null
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/utils/LoggingUtils.java
@@ -0,0 +1,86 @@
+/*
+ * 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.control.common.utils;
+
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class LoggingUtils {
+
+    interface HandlerManipulator {
+        void doIt(Logger logger, Handler handler);
+    }
+
+    public static void checkHandlerLevels(Logger logger) {
+        manipulateHandlers(logger, LoggingUtils::warnAboutLevel);
+    }
+
+    public static void updateHandlerLevels(Logger logger) {
+        manipulateHandlers(logger, LoggingUtils::updateHandlerLevel);
+    }
+
+    private static void manipulateHandlers(Logger logger, HandlerManipulator 
manip) {
+        Logger current = logger;
+        manipulateHandlers(logger, current.getHandlers(), manip);
+        while (current != null && current.getUseParentHandlers()) {
+            current = current.getParent();
+            if (current != null) {
+                manipulateHandlers(logger, current.getHandlers(), manip);
+            }
+        }
+    }
+
+    private static void manipulateHandlers(Logger logger, Handler[] handlers, 
HandlerManipulator manip) {
+        for (Handler handler : handlers) {
+            manip.doIt(logger, handler);
+        }
+    }
+
+    private static void warnAboutLevel(Logger logger, Handler handler) {
+        final Level handlerLevel = handler.getLevel();
+        final Level loggerLevel = getLevel(logger);
+        if (handlerLevel.intValue() > loggerLevel.intValue()) {
+            logger.log(Level.WARNING,
+                    () -> String.format("Log level for handler %s of %s is %s 
(> %s)",
+                            handler.getClass().getSimpleName(), 
logger.getName(), handlerLevel.getName(),
+                            loggerLevel.getName()));
+        }
+    }
+
+    private static void updateHandlerLevel(Logger logger, Handler handler) {
+        final Level handlerLevel = handler.getLevel();
+        final Level loggerLevel = getLevel(logger);
+        if (handlerLevel.intValue() > loggerLevel.intValue()) {
+            logger.log(Level.WARNING, () -> String.format("Setting log level 
for handler %s of %s to %s",
+                    handler.getClass().getSimpleName(), logger.getName(), 
loggerLevel.getName()));
+            handler.setLevel(loggerLevel);
+        }
+    }
+
+    private static Level getLevel(Logger logger) {
+        Logger current = logger;
+        Level level = current.getLevel();
+        while (level == null) {
+            current = current.getParent();
+            level = current.getLevel();
+        }
+        return level;
+    }
+ }
\ No newline at end of file

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

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

Reply via email to