From f3e2f354eba21cb2d2f0c079212fcfd4100dd3d6 Mon Sep 17 00:00:00 2001 From: Bernd Hufmann Date: Tue, 23 Apr 2013 15:10:20 -0400 Subject: [PATCH] lttng: add support for kernel-only in tracer control (bug406120) This commit allows the user to connect to a remote LTTng node where UST is disabled and only the kernel tracer is available. For LTTng tools 2.0.x, the command lttng list -u causes a segmentation fault on the remote side. This segmentation fault makes it impossible to use the kernel-only mode. This bug is fixed in later versions of LTTng tools starting from 2.1.0. Change-Id: I2862ccce68c575706722eea89fdd4b450797d5d6 Signed-off-by: Bernd Hufmann Reviewed-on: https://git.eclipse.org/r/12139 Reviewed-by: Patrick Tasse IP-Clean: Patrick Tasse Tested-by: Hudson CI Reviewed-by: Alexandre Montplaisir --- .../service/LTTngControlServiceTest.java | 91 +++++++++++++++++++ .../testfiles/LTTngServiceTest.cfg | 76 ++++++++++++++++ .../control/service/LTTngControlService.java | 33 ++++++- .../service/LTTngControlServiceConstants.java | 5 +- 4 files changed, 201 insertions(+), 4 deletions(-) diff --git a/org.eclipse.linuxtools.lttng2.ui.tests/src/org/eclipse/linuxtools/lttng2/ui/tests/control/service/LTTngControlServiceTest.java b/org.eclipse.linuxtools.lttng2.ui.tests/src/org/eclipse/linuxtools/lttng2/ui/tests/control/service/LTTngControlServiceTest.java index 4419dea1ab..dd4881bf2b 100644 --- a/org.eclipse.linuxtools.lttng2.ui.tests/src/org/eclipse/linuxtools/lttng2/ui/tests/control/service/LTTngControlServiceTest.java +++ b/org.eclipse.linuxtools.lttng2.ui.tests/src/org/eclipse/linuxtools/lttng2/ui/tests/control/service/LTTngControlServiceTest.java @@ -83,6 +83,10 @@ public class LTTngControlServiceTest { private static final String SCEN_GET_UST_PROVIDER1 = "GetUstProvider1"; private static final String SCEN_GET_UST_PROVIDER2 = "GetUstProvider2"; private static final String SCEN_GET_UST_PROVIDER3 = "GetUstProvider3"; + private static final String SCEN_LIST_WITH_NO_UST1 = "ListWithNoUst1"; + private static final String SCEN_LIST_WITH_NO_UST2 = "ListWithNoUst2"; + private static final String SCEN_LIST_WITH_NO_UST3 = "ListWithNoUst3"; + private static final String SCEN_LIST_WITH_NO_UST_VERBOSE = "ListWithNoUstVerbose"; private static final String SCEN_CREATE_SESSION1 = "CreateSession1"; private static final String SCEN_CREATE_SESSION_WITH_PROMPT = "CreateSessionWithPrompt"; private static final String SCEN_CREATE_SESSION_VARIANTS = "CreateSessionVariants"; @@ -610,6 +614,93 @@ public class LTTngControlServiceTest { } } + + @Test + public void testGetKernelProviderNoUst1() { + try { + fShell.setScenario(SCEN_LIST_WITH_NO_UST1); + List providerList = fService.getUstProvider(new NullProgressMonitor()); + + // Verify Provider info + assertNotNull(providerList); + assertEquals(0, providerList.size()); + + } catch (ExecutionException e) { + fail(e.toString()); + } + } + + + @Test + public void testGetKernelProviderNoUst2() { + try { + // Set version + ((LTTngControlService)fService).setVersion("2.1.0"); + + fShell.setScenario(SCEN_LIST_WITH_NO_UST2); + List providerList = fService.getUstProvider(new NullProgressMonitor()); + + // Verify Provider info + assertNotNull(providerList); + assertEquals(0, providerList.size()); + + // Reset version + ((LTTngControlService)fService).setVersion("2.0.0"); + + } catch (ExecutionException e) { + fail(e.toString()); + } + } + + @Test + public void testGetKernelProviderNoUst3() { + try { + + // Set version + ((LTTngControlService)fService).setVersion("2.1.0"); + + fShell.setScenario(SCEN_LIST_WITH_NO_UST3); + List providerList = fService.getUstProvider(new NullProgressMonitor()); + + // Verify provider info + assertNotNull(providerList); + assertEquals(0, providerList.size()); + + // Reset version + ((LTTngControlService)fService).setVersion("2.0.0"); + + } catch (ExecutionException e) { + fail(e.toString()); + } + } + + @Test + public void testGetKernelProviderNoUstVerbose() { + try { + enableVerbose(); + + // Set version + ((LTTngControlService)fService).setVersion("2.1.0"); + + fShell.setScenario(SCEN_LIST_WITH_NO_UST_VERBOSE); + List providerList = fService.getUstProvider(new NullProgressMonitor()); + + // Verify provider info + assertNotNull(providerList); + assertEquals(0, providerList.size()); + + // Reset version + ((LTTngControlService)fService).setVersion("2.0.0"); + + } catch (ExecutionException e) { + fail(e.toString()); + } finally { + disableVerbose(); + } + } + + + @Test public void testCreateSession() { try { diff --git a/org.eclipse.linuxtools.lttng2.ui.tests/testfiles/LTTngServiceTest.cfg b/org.eclipse.linuxtools.lttng2.ui.tests/testfiles/LTTngServiceTest.cfg index e9341e54d5..d9b9e823ba 100644 --- a/org.eclipse.linuxtools.lttng2.ui.tests/testfiles/LTTngServiceTest.cfg +++ b/org.eclipse.linuxtools.lttng2.ui.tests/testfiles/LTTngServiceTest.cfg @@ -403,6 +403,82 @@ None +#################################################################### +# Scenario: Test "lttng list -u" with no UST available (LTTng 2.0.x) +#################################################################### + +ListWithNoUst1 + +lttng list -u + + +1 + + +UST events: +------------- +None +Segmentation Fault + + + +#################################################################### +# Scenario: Test "lttng list -u" with no UST available and no session daemon +#################################################################### + +ListWithNoUst2 + +lttng list -u -f + + +1 + + +Spawning a session daemon +Error: Unable to list UST events: Listing UST events failed +Error: Command Error + + + +#################################################################### +# Scenario: Test "lttng list -k" with no kernel and with session daemon +#################################################################### + +ListWithNoUst3 + +lttng list -u -f + + +1 + + +Error: Unable to list UST events: Listing UST events failed +Error: Command Error + + + +#################################################################### +# Scenario: Test "lttng list -u" with no kernel, with session daemon and verbose +#################################################################### + +ListWithNoUstVerbose + +lttng -vvv list -u -f + + +1 + + +DEBUG2: Session name: (null) [in cmd_list() at commands/list.c:618] +DEBUG1: Getting kernel tracing events [in list_kernel_events() at commands/list.c:309] +Spawning a session daemon +Error: Unable to list UST events: Listing UST events failed +Error: Command Error +DEBUG1: Clean exit [in clean_exit() at lttng.c:165] + + + + #################################################################### # Scenario: Test "lttng list -u -f" with sample output (version 2.1.0) #################################################################### diff --git a/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlService.java b/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlService.java index 294124e9ca..476f1532f3 100644 --- a/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlService.java +++ b/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlService.java @@ -314,7 +314,36 @@ public class LTTngControlService implements ILttngControlService { command.append(LTTngControlServiceConstants.OPTION_FIELDS); } - ICommandResult result = executeCommand(command.toString(), monitor); + ICommandResult result = executeCommand(command.toString(), monitor, false); + List allProviders = new ArrayList(); + + // Workaround for versions 2.0.x which causes a segmentation fault for this command + // if LTTng Tools is compiled without UST support. + if (!isVersionSupported("2.1.0") && (result.getResult() != 0)) { //$NON-NLS-1$ + return allProviders; + } + + if (result.getOutput() != null) { + // Ignore the following 2 cases: + // Spawning a session daemon + // Error: Unable to list UST events: Listing UST events failed + // or: + // Error: Unable to list UST events: Listing UST events failed + // + int index = 0; + while (index < result.getOutput().length) { + String line = result.getOutput()[index]; + Matcher matcher = LTTngControlServiceConstants.LIST_UST_NO_UST_PROVIDER_PATTERN.matcher(line); + if (matcher.matches()) { + return allProviders; + } + index++; + } + } + + if (isError(result)) { + throw new ExecutionException(Messages.TraceControl_CommandError + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$ + } // Note that field print-outs exists for version >= 2.1.0 // @@ -339,7 +368,6 @@ public class LTTngControlService implements ILttngControlService { // field: floatfield (float) // field: stringfield (string) - List allProviders = new ArrayList(); IUstProviderInfo provider = null; int index = 0; @@ -356,7 +384,6 @@ public class LTTngControlService implements ILttngControlService { } else { index++; } - } return allProviders; } diff --git a/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlServiceConstants.java b/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlServiceConstants.java index 76528af0b5..1f0eade689 100644 --- a/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlServiceConstants.java +++ b/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlServiceConstants.java @@ -363,5 +363,8 @@ public class LTTngControlServiceConstants { * Pattern to match error line if no kernel tracer is available or installed. */ public final static Pattern LIST_KERNEL_NO_KERNEL_PROVIDER_PATTERN = Pattern.compile("\\s*Error:\\s+Unable\\s+to\\s+list\\s+kernel\\s+events.*"); //$NON-NLS-1$; - + /** + * Pattern to match error line if no ust tracer is available or installed. + */ + public final static Pattern LIST_UST_NO_UST_PROVIDER_PATTERN = Pattern.compile(".*Unable\\s*to\\s*list\\s*UST\\s*event.*"); //$NON-NLS-1$; } -- 2.34.1