)]}'
{
  "log": [
    {
      "commit": "4d8d83f9686b3cf84fc7055516adb22645ab9f6a",
      "tree": "2302c1ca3372f3e94328ab084919901d535506f5",
      "parents": [
        "ef04ac6c05fa344428008ffa1eac7316c64a3467"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Apr 16 11:18:45 2019 -0700"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Apr 16 23:46:19 2019 +0000"
      },
      "message": "Add a parallel_run.py tool\n\nSometimes when investigating a flake it is useful to add logging and\nrepeatedly run a command until the issue appears with the logging.\nThis can be tedious if the flake is rare. To make it easier I added a\nsimple parallel_run.py tool that can run a command in parallel\nrepeatedly until it fails and save the stdout from the failed run.\n\nUsage:\n\n% # Write a script that exits with 0 on failure and writes all output\n% # to stdout.\n% cat tst.sh\n\\#!/bin/bash\n! (head -c32 /dev/urandom | hd | grep -E \u0027\\|.*a\u0027)\n\n% # Run the script in parallel\n% ./art/tools/parallel_run.py -j80 --out out.txt ./tst.sh\nTemporary files in /tmp/tmp5013_ey7\n1 runs\n\u003csnip\u003e\n31 runs\n\n% # Examine output\n% cat out.txt\n00000000  6d e3 ac bf 1a 21 93 17  61 00 2a e0 8b f5 41 3b  |m....!..a.*...A;|\n\nTest: ./art/tools/parallel_run.py -j70 --out out.txt ./tst.sh\nBug: 72608560\nChange-Id: I83877ae1ccde5e843da20c5bd5a4f24e2e07fb19\n"
    }
  ]
}
