This is an automated email from the ASF dual-hosted git repository.

qianzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git


The following commit(s) were added to refs/heads/master by this push:
     new 7841fcc  Fixed parsing of `perf` output on some locales.
7841fcc is described below

commit 7841fcc848ebaac5de43cd4cccf1c243a3cdff56
Author: Charles-Francois Natali <cf.nat...@gmail.com>
AuthorDate: Fri Jun 4 22:17:52 2021 +0800

    Fixed parsing of `perf` output on some locales.
    
    If the locale is such that `LC_NUMERIC` uses the comma ',' as decimal
    separator, parsing won't work - because of unexpected number of fields
    and floating points format - so make sure it's set to `C`.
    
    Example:
    ```
    [ RUN      ]
    CgroupsAnyHierarchyWithPerfEventTest.ROOT_CGROUPS_PERF_PerfTest
    ../../src/tests/containerizer/cgroups_tests.cpp:1024: Failure
    (statistics).failure(): Failed to parse perf sample: Failed to parse
    perf sample line
    '6376827291,,cycles,mesos_test,2011741096,100,00,3,GHz': Unexpected
    number of fields (9)
    [  FAILED  ]
    CgroupsAnyHierarchyWithPerfEventTest.ROOT_CGROUPS_PERF_PerfTest (2157
    ms)
    ```
    
    Standalone reproducer, using '/' as separator for readability:
    ```
    root@thinkpad:~# LC_NUMERIC=fr_FR.UTF-8 perf stat --field-separator "/"
    -- true
    0,31/msec/task-clock/306721/100,00/0/CPUs utilized
    0//context-switches/306721/100,00/0/K/sec
    0//cpu-migrations/306721/100,00/0/K/sec
    44//page-faults/306721/100,00/0/M/sec
    788234//cycles/311478/100,00/2/GHz
    538077//instructions/311478/100,00/0/insn per cycle
    106749//branches/311478/100,00/348/M/sec
    4556//branch-misses/311478/100,00/4/of all branches
    ```
    
    This closes #391
---
 src/linux/perf.cpp | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/linux/perf.cpp b/src/linux/perf.cpp
index dfc4670..a6ead07 100644
--- a/src/linux/perf.cpp
+++ b/src/linux/perf.cpp
@@ -125,6 +125,12 @@ protected:
 private:
   void execute()
   {
+    // If the locale is such that `LC_NUMERIC` uses the comma ',' as decimal
+    // separator, parsing won't work - because of unexpected number of fields
+    // and floating points format - so make sure it's set to `C`.
+    std::map<string, string> env = os::environment();
+    env["LC_ALL"] = "C";
+
     // NOTE: The supervisor childhook places perf in its own process group
     // and will kill the perf process when the parent dies.
     Try<Subprocess> _perf = subprocess(
@@ -134,7 +140,7 @@ private:
         Subprocess::PIPE(),
         Subprocess::PIPE(),
         nullptr,
-        None(),
+        env,
         None(),
         {},
         {Subprocess::ChildHook::SUPERVISOR()});

Reply via email to