<matrixBuild _class='hudson.matrix.MatrixBuild'><action _class='hudson.model.CauseAction'><cause _class='org.jenkinsci.plugins.ghprb.GhprbCause'><shortDescription>GitHub pull request #2989 of commit d7c82aed9f048ec69c4eae6459b9411819a25339, no merge conflicts.</shortDescription></cause></action><action _class='org.jenkinsci.plugins.ghprb.GhprbParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>sha1</name><value>origin/pr/2989/merge</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbActualCommit</name><value>d7c82aed9f048ec69c4eae6459b9411819a25339</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbActualCommitAuthor</name><value></value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbActualCommitAuthorEmail</name><value></value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbAuthorRepoGitUrl</name><value>https://github.com/willfindlay/bcc.git</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTriggerAuthor</name><value></value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTriggerAuthorEmail</name><value></value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTriggerAuthorLogin</name><value>yonghong-song</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTriggerAuthorLoginMention</name><value>@yonghong-song</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullId</name><value>2989</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbTargetBranch</name><value>master</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbSourceBranch</name><value>ringbuf_helpers</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>GIT_BRANCH</name><value>ringbuf_helpers</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullAuthorEmail</name><value>william@williamfindlay.com</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullAuthorLogin</name><value>willfindlay</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullAuthorLoginMention</name><value>@willfindlay</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullDescription</name><value>GitHub pull request #2989 of commit d7c82aed9f048ec69c4eae6459b9411819a25339, no merge conflicts.</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullTitle</name><value>Ringbuf Support for Python API</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullLink</name><value>https://github.com/iovisor/bcc/pull/2989</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbPullLongDescription</name><value>This pull request contains an implementation for ringbuf support in bcc's Python API. \r\n\r\nFixes #2985.\r\n\r\n## Summary of Changes\r\n\r\n- Added ringbuf helpers from libbpf API to libbcc\r\n- Added a new `RingBuf` class to represent the ringbuf map\r\n- Added a new `EventArrayBase` class to reduce code duplication between PerfEventArray and RingBuf\r\n- Added `BPF_RINGBUF_OUTPUT` macro for BPF programs\r\n- Added documentation\r\n\r\n## Examples\r\n\r\nThe following example programs describe how the API works.\r\n\r\nOn the BPF side, we have two choices for submitting events. `map.ringbuf_output` works like `map.perf_submit` for perf buffers,\r\nwhile `map.ringbuf_reserve`/`map.ringbuf_discard`/`map.ringbuf_submit` present an alternative approach that allows for finer control.\r\n\r\n`map.ringbuf_output` works like:\r\n```c\r\nBPF_RINGBUF_OUTPUT(events);\r\n\r\nstruct data_t data {\r\n    u32 pid;\r\n};\r\n\r\nTRACEPOINT_PROBE(raw_syscalls, sys_enter) {\r\n    u32 pid = bpf_get_current_pid_tgid();\r\n\r\n    struct data_t data = { .pid = pid };\r\n\r\n    events.ringbuf_output(&amp;data, sizeof(data), 0 /* flags */);\r\n    \r\n    return 0;\r\n}\r\n```\r\n\r\n`map.ringbuf_reserve`/`map.ringbuf_discard`/`map.ringbuf_submit` work like:\r\n```c\r\nBPF_RINGBUF_OUTPUT(events);\r\n\r\nstruct data_t data {\r\n    u32 pid;\r\n};\r\n\r\nTRACEPOINT_PROBE(raw_syscalls, sys_enter) {\r\n    u32 pid = bpf_get_current_pid_tgid();\r\n\r\n    struct data_t *data = events.ringbuf_reserve(sizeof(struct data_t));\r\n    if (!data)\r\n        return 1;\r\n\r\n    data-&gt;pid = pid;\r\n\r\n    events.ringbuf_submit(data, 0 /* flags */);\r\n    // or, to discard the data...\r\n    events.ringbuf_discard(data, 0 /* flags */);\r\n\r\n    return 0;\r\n}\r\n```\r\n\r\nOn the Python side, the user calls `open_ring_buffer` to associate a callback with the buffer. There are two options for reading data from kernelspace: `ring_buffer_poll` which works like `perf_buffer_poll` and `ring_buffer_consume` which reads data without polling first.\r\n```python\r\nimport time\r\n\r\nfrom bcc import BPF\r\n\r\nb = BPF(src_file=b'source.c')\r\n\r\ndef callback(ctx, data, size):\r\n    event = b['events'].event(data)\r\n    print(event.pid)\r\n\r\nb['events'].open_ring_buffer(callback)\r\n\r\nwhile True:\r\n    # Option 1...\r\n    b.ring_buffer_poll(30)\r\n    # Option 2...\r\n    b.ring_buffer_consume()\r\n    time.sleep(0.5)\r\n```\r\n\r\nUnlike perf buffer callbacks, ringbuf supports return values from the callback, which can be used to indicate error conditions to stop polling early. If a callback does not return an integer, we fall back to returning 0, which approximates perf buffer behavior.</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbCommentBody</name><value>[buildbot, test this please]</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbGhRepository</name><value>iovisor/bcc</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>ghprbCredentialsId</name><value>6d3daf13-69b8-48b1-9c8f-ec5353264113</value></parameter></action><action _class='hudson.plugins.git.GitTagAction'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><description>&lt;a title="Ringbuf Support for Python API" href="https://github.com/iovisor/bcc/pull/2989"&gt;PR #2989&lt;/a&gt;: Ringbuf Support for Python API</description><displayName>#576</displayName><duration>1283963</duration><estimatedDuration>7460664</estimatedDuration><fullDisplayName>bcc-pr #576</fullDisplayName><id>576</id><keepLog>false</keepLog><number>576</number><queueId>4616</queueId><result>SUCCESS</result><timestamp>1593116308002</timestamp><url>https://buildbot.iovisor.org/jenkins/user/a.s.protopopov/my-views/view/all/job/bcc-pr/576/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><kind>git</kind></changeSet><run><number>576</number><url>https://buildbot.iovisor.org/jenkins/user/a.s.protopopov/my-views/view/all/job/bcc-pr/label=fc25/576/</url></run><run><number>576</number><url>https://buildbot.iovisor.org/jenkins/user/a.s.protopopov/my-views/view/all/job/bcc-pr/label=fc26/576/</url></run><run><number>576</number><url>https://buildbot.iovisor.org/jenkins/user/a.s.protopopov/my-views/view/all/job/bcc-pr/label=fc27/576/</url></run><run><number>576</number><url>https://buildbot.iovisor.org/jenkins/user/a.s.protopopov/my-views/view/all/job/bcc-pr/label=fc28/576/</url></run><run><number>576</number><url>https://buildbot.iovisor.org/jenkins/user/a.s.protopopov/my-views/view/all/job/bcc-pr/label=ubuntu1604/576/</url></run><run><number>576</number><url>https://buildbot.iovisor.org/jenkins/user/a.s.protopopov/my-views/view/all/job/bcc-pr/label=ubuntu1710/576/</url></run><run><number>576</number><url>https://buildbot.iovisor.org/jenkins/user/a.s.protopopov/my-views/view/all/job/bcc-pr/label=ubuntu1804/576/</url></run></matrixBuild>