On 26 Jun (16:05:31), Tan Dung Le Tran wrote:
> Hi David,
> 
> Is this patch applicable for lttng-ust "origin/stable-2.4" ?

Yes, Mathieu will merge this in 2.4 today and we will do a release.

David

> 
> Thanks,
> Tan
> 
> 
> -----Original Message-----
> From: David Goulet [mailto:[email protected]] 
> Sent: June-16-14 11:31 AM
> To: [email protected]
> Subject: [lttng-dev] [PATCH lttng-ust] JUL: use root logger to capture events
> 
> The JUL agent now uses the root logger ("") to capture all events. This 
> allows us to remove the Timer thread and cleanup a huge portion of the code 
> base. It simplifies a great deal the internal structure of the agent since we 
> don't have to monitor the Logger object anymore.
> 
> Since tracepoint filtering is done in UST, we just the LTTng handler to the 
> root logger and send everything to UST except disabled events.
> 
> Signed-off-by: David Goulet <[email protected]>
> ---
>  .../org/lttng/ust/jul/LTTngLogHandler.java         | 100 ++------------
>  .../org/lttng/ust/jul/LTTngSessiondCmd2_4.java     | 145 
> ++++-----------------
>  .../org/lttng/ust/jul/LTTngTCPSessiondClient.java  | 105 +--------------
>  3 files changed, 41 insertions(+), 309 deletions(-)
> 
> diff --git a/liblttng-ust-jul/org/lttng/ust/jul/LTTngLogHandler.java 
> b/liblttng-ust-jul/org/lttng/ust/jul/LTTngLogHandler.java
> index 8c79512..00e8e3c 100644
> --- a/liblttng-ust-jul/org/lttng/ust/jul/LTTngLogHandler.java
> +++ b/liblttng-ust-jul/org/lttng/ust/jul/LTTngLogHandler.java
> @@ -29,40 +29,16 @@ import java.util.Map;
>  
>  import org.lttng.ust.jul.LTTngUst;
>  
> -class LTTngLogger {
> -     /*
> -      * The log handler is attached to the logger when the reference count is
> -      * nonzero. Each event referring to a logger holds a reference to that
> -      * logger. If down to 0, this object is removed from the handler.
> -      */
> -     public int refcount;
> -     public String name;
> -     Logger logger;
> -
> -     public LTTngLogger(String name, Logger logger) {
> -             this.name = name;
> -             this.refcount = 0;
> -             this.logger = logger;
> -     }
> -
> -     public void attach(LTTngLogHandler handler) {
> -             this.logger.addHandler(handler);
> -     }
> -
> -     public void detach(LTTngLogHandler handler) {
> -             this.logger.removeHandler(handler);
> -     }
> -}
> -
>  public class LTTngLogHandler extends Handler {
>       /* Am I a root Log Handler. */
>       public int is_root = 0;
> +     public int attached = 0;
>  
>       public LogManager logManager;
>  
>       /* Logger object attached to this handler that can trigger a 
> tracepoint. */
> -     private Map<String, LTTngLogger> loggerMap =
> -             Collections.synchronizedMap(new HashMap<String, LTTngLogger>());
> +     public Map<String, LTTngEvent> disabledEvents =
> +             Collections.synchronizedMap(new HashMap<String, LTTngEvent>());
>  
>       /* Constructor */
>       public LTTngLogHandler(LogManager logManager) { @@ -75,68 +51,10 @@ 
> public class LTTngLogHandler extends Handler {
>       }
>  
>       /*
> -      * Return true if the logger is enabled and attached. Else, if not 
> found,
> -      * return false.
> -      */
> -     public boolean exists(String name) {
> -             if (loggerMap.get(name) != null) {
> -                     return true;
> -             } else {
> -                     return false;
> -             }
> -     }
> -
> -     /*
> -      * Attach an event to this handler. If no logger object exists, one is
> -      * created else the refcount is incremented.
> -      */
> -     public void attachEvent(LTTngEvent event) {
> -             Logger logger;
> -             LTTngLogger lttngLogger;
> -
> -             /* Does the logger actually exist. */
> -             logger = this.logManager.getLogger(event.name);
> -             if (logger == null) {
> -                     /* Stop attach right now. */
> -                     return;
> -             }
> -
> -             lttngLogger = loggerMap.get(event.name);
> -             if (lttngLogger == null) {
> -                     lttngLogger = new LTTngLogger(event.name, logger);
> -
> -                     /* Attach the handler to the logger and add is to the 
> map. */
> -                     lttngLogger.attach(this);
> -                     lttngLogger.refcount = 1;
> -                     loggerMap.put(lttngLogger.name, lttngLogger);
> -             } else {
> -                     lttngLogger.refcount += 1;
> -             }
> -     }
> -
> -     /*
> -      * Dettach an event from this handler. If the refcount goes down to 0, 
> the
> -      * logger object is removed thus not attached anymore.
> -      */
> -     public void detachEvent(LTTngEvent event) {
> -             LTTngLogger logger;
> -
> -             logger = loggerMap.get(event.name);
> -             if (logger != null) {
> -                     logger.refcount -= 1;
> -                     if (logger.refcount == 0) {
> -                             /* Dettach from handler since no more event is 
> associated. */
> -                             logger.detach(this);
> -                             loggerMap.remove(logger);
> -                     }
> -             }
> -     }
> -
> -     /*
>        * Cleanup this handler state meaning put it back to a vanilla state.
>        */
>       public void clear() {
> -             this.loggerMap.clear();
> +             this.disabledEvents.clear();
>       }
>  
>       @Override
> @@ -147,10 +65,14 @@ public class LTTngLogHandler extends Handler {
>  
>       @Override
>       public void publish(LogRecord record) {
> -             LTTngLogger logger;
> +             LTTngEvent event;
>  
> -             logger = loggerMap.get(record.getLoggerName());
> -             if (logger == null) {
> +             /*
> +              * Check if the logger has been disabled and if yes don't fire 
> the
> +              * tracepoint.
> +              */
> +             event = this.disabledEvents.get(record.getLoggerName());
> +             if (event != null) {
>                       /* Ignore and don't fire TP. */
>                       return;
>               }
> diff --git a/liblttng-ust-jul/org/lttng/ust/jul/LTTngSessiondCmd2_4.java 
> b/liblttng-ust-jul/org/lttng/ust/jul/LTTngSessiondCmd2_4.java
> index 6808326..dc068f1 100644
> --- a/liblttng-ust-jul/org/lttng/ust/jul/LTTngSessiondCmd2_4.java
> +++ b/liblttng-ust-jul/org/lttng/ust/jul/LTTngSessiondCmd2_4.java
> @@ -133,7 +133,7 @@ public interface LTTngSessiondCmd2_4 {
>                       buf.order(ByteOrder.LITTLE_ENDIAN);
>                       lttngLogLevel = buf.getInt();
>                       lttngLogLevelType = buf.getInt();
> -                     name = new String(data, data_offset, data.length - 
> data_offset);
> +                     name = new String(data, data_offset, data.length - 
> +data_offset).trim();
>               }
>  
>               @Override
> @@ -152,76 +152,32 @@ public interface LTTngSessiondCmd2_4 {
>                * @return Event name as a string if the event is NOT found 
> thus was
>                * not enabled.
>                */
> -             public void execute(LTTngLogHandler handler,
> -                             Map<String, ArrayList<LTTngEvent>> eventMap, 
> Set wildCardSet) {
> -                     ArrayList<LTTngEvent> bucket;
> -                     LTTngEvent event;
> +             public void execute(LTTngLogHandler handler) {
> +                     LTTngEvent event, lookupEv;
>  
> -                     if (name == null) {
> +                     if (this.name == null) {
>                               this.code = lttng_jul_ret_code.CODE_INVALID_CMD;
>                               return;
>                       }
>  
> -                     /* Wild card to enable ALL logger. */
> -                     if (name.trim().equals("*")) {
> -                             String loggerName;
> -                             Enumeration loggers = 
> handler.logManager.getLoggerNames();
> -
> -                             /* Add event to the wildcard set. */
> -                             wildCardSet.add(new LTTngEvent(name.trim(), 
> lttngLogLevel,
> -                                                     lttngLogLevelType));
> -
> -                             /*
> -                              * Create an event for each logger found and 
> attach it to the
> -                              * handler.
> -                              */
> -                             while (loggers.hasMoreElements()) {
> -                                     loggerName = 
> loggers.nextElement().toString();
> -                                     /* Somehow there is always an empty 
> string at the end. */
> -                                     if (loggerName == "") {
> -                                             continue;
> -                                     }
> -
> -                                     event = new LTTngEvent(loggerName, 
> lttngLogLevel,
> -                                                     lttngLogLevelType);
> -                                     /* Attach event to Log handler to it 
> can be traced. */
> -                                     handler.attachEvent(event);
> -
> -                                     /*
> -                                      * The agent timer call this function 
> with eventMap set to
> -                                      * null because it already has a 
> reference to an existing
> -                                      * event so is should not try to add a 
> new one here.
> -                                      */
> -                                     if (eventMap != null) {
> -                                             bucket = 
> eventMap.get(loggerName);
> -                                             if (bucket == null) {
> -                                                     bucket = new 
> ArrayList<LTTngEvent>();
> -                                                     
> eventMap.put(loggerName, bucket);
> -                                             }
> -                                             bucket.add(event);
> -                                     }
> -                             }
> -                     } else {
> -                             event = new LTTngEvent(name.trim(), 
> lttngLogLevel,
> -                                             lttngLogLevelType);
> -                             /* Attach event to Log handler to it can be 
> traced. */
> -                             handler.attachEvent(event);
> -
> -                             /*
> -                              * The agent timer call this function with 
> eventMap set to
> -                              * null because it already has a reference to 
> an existing
> -                              * event so is should not try to add a new one 
> here.
> -                              */
> -                             if (eventMap != null) {
> -                                     bucket = eventMap.get(name.trim());
> -                                     if (bucket == null) {
> -                                             bucket = new 
> ArrayList<LTTngEvent>();
> -                                             eventMap.put(name.trim(), 
> bucket);
> -                                     }
> -                                     bucket.add(event);
> -                             }
> +                     /*
> +                      * Try to remove the logger name from the disabled 
> events set in
> +                      * the handler. The return value is of no importance, 
> we just need
> +                      * to try it.
> +                      */
> +                     handler.disabledEvents.remove(this.name);
> +
> +                     /* Handler already attached. */
> +                     if (handler.attached == 1) {
> +                             this.code = lttng_jul_ret_code.CODE_SUCCESS_CMD;
> +                             return;
>                       }
>  
> +                     /* Get the default JUL root logger and add our handler. 
> */
> +                     Logger rootLogger = handler.logManager.getLogger("");
> +                     rootLogger.addHandler(handler);
> +                     handler.attached = 1;
> +
>                       this.code = lttng_jul_ret_code.CODE_SUCCESS_CMD;
>                       return;
>               }
> @@ -238,13 +194,9 @@ public interface LTTngSessiondCmd2_4 {
>  
>               @Override
>               public void populate(byte[] data) {
> -                     int data_offset = INT_SIZE * 2;
> -
>                       ByteBuffer buf = ByteBuffer.wrap(data);
>                       buf.order(ByteOrder.LITTLE_ENDIAN);
> -                     lttngLogLevel = buf.getInt();
> -                     lttngLogLevelType = buf.getInt();
> -                     name = new String(data, data_offset, data.length - 
> data_offset);
> +                     name = new String(data).trim();
>               }
>  
>               @Override
> @@ -260,62 +212,21 @@ public interface LTTngSessiondCmd2_4 {
>                * Execute disable handler action which is to disable the given 
> handler
>                * to the received name.
>                */
> -             public void execute(LTTngLogHandler handler,
> -                             Map<String, ArrayList<LTTngEvent>> eventMap, 
> Set wildCardSet) {
> -                     ArrayList<LTTngEvent> bucket;
> +             public void execute(LTTngLogHandler handler) {
>                       LTTngEvent event;
>  
> -                     if (name == null) {
> +                     if (this.name == null) {
>                               this.code = lttng_jul_ret_code.CODE_INVALID_CMD;
>                               return;
>                       }
>  
> -                     /* Wild card to disable ALL logger. */
> -                     if (name.trim().equals("*")) {
> -                             String loggerName;
> -                             Enumeration loggers = 
> handler.logManager.getLoggerNames();
> -
> -                             /* Remove event from the wildcard set. */
> -                             wildCardSet.remove(new LTTngEvent(name.trim(), 
> lttngLogLevel,
> -                                                     lttngLogLevelType));
> -
> -                             while (loggers.hasMoreElements()) {
> -                                     loggerName = 
> loggers.nextElement().toString();
> -                                     /* Somehow there is always an empty 
> string at the end. */
> -                                     if (loggerName == "") {
> -                                             continue;
> -                                     }
> -
> -                                     event = new LTTngEvent(loggerName, 
> lttngLogLevel,
> -                                                     lttngLogLevelType);
> -
> -                                     bucket = eventMap.get(loggerName);
> -                                     if (bucket != null) {
> -                                             handler.detachEvent(event);
> -                                             bucket.remove(event);
> -                                             if (bucket.isEmpty() == true) {
> -                                                     eventMap.remove(bucket);
> -                                             }
> -                                     }
> -                             }
> -                             this.code = lttng_jul_ret_code.CODE_SUCCESS_CMD;
> -                     } else {
> -                             event = new LTTngEvent(this.name, lttngLogLevel,
> -                                             lttngLogLevelType);
> -
> -                             bucket = eventMap.get(this.name);
> -                             if (bucket != null) {
> -                                     handler.detachEvent(event);
> -                                     bucket.remove(event);
> -                                     if (bucket.isEmpty() == true) {
> -                                             eventMap.remove(bucket);
> -                                     }
> -                                     this.code = 
> lttng_jul_ret_code.CODE_SUCCESS_CMD;
> -                             } else {
> -                                     this.code = 
> lttng_jul_ret_code.CODE_UNK_LOGGER_NAME;
> -                             }
> +                     event = handler.disabledEvents.get(this.name);
> +                     if (event == null) {
> +                             handler.disabledEvents.put(this.name,
> +                                             new LTTngEvent(this.name, 0, 
> 0));
>                       }
>  
> +                     this.code = lttng_jul_ret_code.CODE_SUCCESS_CMD;
>                       return;
>               }
>       }
> diff --git a/liblttng-ust-jul/org/lttng/ust/jul/LTTngTCPSessiondClient.java 
> b/liblttng-ust-jul/org/lttng/ust/jul/LTTngTCPSessiondClient.java
> index a2d12fc..912d507 100644
> --- a/liblttng-ust-jul/org/lttng/ust/jul/LTTngTCPSessiondClient.java
> +++ b/liblttng-ust-jul/org/lttng/ust/jul/LTTngTCPSessiondClient.java
> @@ -39,8 +39,6 @@ import java.util.Iterator;  import java.util.List;  import 
> java.util.Enumeration;  import java.util.Set; -import java.util.Timer; 
> -import java.util.TimerTask;  import java.util.logging.Logger;  import 
> java.util.Collections;
>  
> @@ -64,23 +62,6 @@ public class LTTngTCPSessiondClient {
>  
>       private Semaphore registerSem;
>  
> -     private Timer eventTimer;
> -
> -     /*
> -      * Indexed by event name but can contains duplicates since multiple
> -      * sessions can enable the same event with or without different 
> loglevels.
> -      */
> -     private Map<String, ArrayList<LTTngEvent>> eventMap =
> -             Collections.synchronizedMap(
> -                             new HashMap<String, ArrayList<LTTngEvent>>());
> -
> -     private Set<LTTngEvent> wildCardSet =
> -             Collections.synchronizedSet(new HashSet<LTTngEvent>());
> -
> -     /* Timer delay at each 5 seconds. */
> -     private final static long timerDelay = 5 * 1000;
> -     private static boolean timerInitialized;
> -
>       private static final String rootPortFile = "/var/run/lttng/jul.port";
>       private static final String userPortFile = "/.lttng/jul.port";
>  
> @@ -90,83 +71,6 @@ public class LTTngTCPSessiondClient {
>       public LTTngTCPSessiondClient(String host, Semaphore sem) {
>               this.sessiondHost = host;
>               this.registerSem = sem;
> -             this.eventTimer = new Timer();
> -             this.timerInitialized = false;
> -     }
> -
> -     private void setupEventTimer() {
> -             if (this.timerInitialized) {
> -                     return;
> -             }
> -
> -             this.eventTimer.scheduleAtFixedRate(new TimerTask() {
> -                     @Override
> -                     public void run() {
> -                             LTTngSessiondCmd2_4.sessiond_enable_handler 
> enableCmd = new
> -                                     
> LTTngSessiondCmd2_4.sessiond_enable_handler();
> -
> -                             synchronized (eventMap) {
> -                                     String loggerName;
> -                                     Enumeration loggers = 
> handler.logManager.getLoggerNames();
> -
> -                                     /*
> -                                      * Create an event for each logger 
> found and attach it to the
> -                                      * handler.
> -                                      */
> -                                     while (loggers.hasMoreElements()) {
> -                                             ArrayList<LTTngEvent> bucket;
> -
> -                                             loggerName = 
> loggers.nextElement().toString();
> -
> -                                             /* Logger is already enabled or 
> end of list, skip it. */
> -                                             if (handler.exists(loggerName) 
> == true ||
> -                                                             
> loggerName.equals("")) {
> -                                                     continue;
> -                                             }
> -
> -                                             bucket = 
> eventMap.get(loggerName);
> -                                             if (bucket == null) {
> -                                                     /* No event(s) exist 
> for this logger. */
> -                                                     continue;
> -                                             }
> -
> -                                             for (LTTngEvent event : bucket) 
> {
> -                                                     enableCmd.name = 
> event.name;
> -                                                     enableCmd.lttngLogLevel 
> = event.logLevel.level;
> -                                                     
> enableCmd.lttngLogLevelType = event.logLevel.type;
> -
> -                                                     /* Event exist so pass 
> null here. */
> -                                                     
> enableCmd.execute(handler, null, wildCardSet);
> -                                             }
> -                                     }
> -                             }
> -
> -                             /* Handle wild cards. */
> -                             synchronized (wildCardSet) {
> -                                     Map<String, ArrayList<LTTngEvent>> 
> modifiedEvents =
> -                                             new HashMap<String, 
> ArrayList<LTTngEvent>>();
> -                                     Set<LTTngEvent> tmpSet = new 
> HashSet<LTTngEvent>();
> -                                     Iterator<LTTngEvent> it = 
> wildCardSet.iterator();
> -
> -                                     while (it.hasNext()) {
> -                                             LTTngEvent event = it.next();
> -
> -                                             /* Only support * for now. */
> -                                             if (event.name.equals("*")) {
> -                                                     enableCmd.name = 
> event.name;
> -                                                     enableCmd.lttngLogLevel 
> = event.logLevel.level;
> -                                                     
> enableCmd.lttngLogLevelType = event.logLevel.type;
> -
> -                                                     /* That might create a 
> new event so pass the map. */
> -                                                     
> enableCmd.execute(handler, modifiedEvents, tmpSet);
> -                                             }
> -                                     }
> -                                     eventMap.putAll(modifiedEvents);
> -                             }
> -                     }
> -             }, this.timerDelay, this.timerDelay);
> -
> -             this.timerInitialized = true;
>       }
>  
>       /*
> @@ -185,8 +89,6 @@ public class LTTngTCPSessiondClient {
>        * Cleanup Agent state.
>        */
>       private void cleanupState() {
> -             eventMap.clear();
> -             wildCardSet.clear();
>               if (this.handler != null) {
>                       this.handler.clear();
>               }
> @@ -216,8 +118,6 @@ public class LTTngTCPSessiondClient {
>                                */
>                               registerToSessiond();
>  
> -                             setupEventTimer();
> -
>                               /*
>                                * Block on socket receive and wait for command 
> from the
>                                * session daemon. This will return if and only 
> if there is a @@ -239,7 +139,6 @@ public class LTTngTCPSessiondClient {
>  
>       public void destroy() {
>               this.quit = true;
> -             this.eventTimer.cancel();
>  
>               try {
>                       if (this.sessiondSock != null) {
> @@ -331,7 +230,7 @@ public class LTTngTCPSessiondClient {
>                                               break;
>                                       }
>                                       enableCmd.populate(data);
> -                                     enableCmd.execute(this.handler, 
> this.eventMap, this.wildCardSet);
> +                                     enableCmd.execute(this.handler);
>                                       data = enableCmd.getBytes();
>                                       break;
>                               }
> @@ -344,7 +243,7 @@ public class LTTngTCPSessiondClient {
>                                               break;
>                                       }
>                                       disableCmd.populate(data);
> -                                     disableCmd.execute(this.handler, 
> this.eventMap, this.wildCardSet);
> +                                     disableCmd.execute(this.handler);
>                                       data = disableCmd.getBytes();
>                                       break;
>                               }
> --
> 2.0.0
> 
> 
> _______________________________________________
> lttng-dev mailing list
> [email protected]
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Attachment: signature.asc
Description: Digital signature

_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to