diff --git a/.libreport.metadata b/.libreport.metadata new file mode 100644 index 0000000..5e5ff19 --- /dev/null +++ b/.libreport.metadata @@ -0,0 +1 @@ +664ec7534bb2207e380d5b34f2260d41abb1a31b libreport-2.15.2.tar.gz diff --git a/0003-rhbz-Retry-XML-RPC-calls-when-uploading-attachments.patch b/0003-rhbz-Retry-XML-RPC-calls-when-uploading-attachments.patch new file mode 100644 index 0000000..5539c03 --- /dev/null +++ b/0003-rhbz-Retry-XML-RPC-calls-when-uploading-attachments.patch @@ -0,0 +1,113 @@ +From 28a6267c056d43cdbf8cd3e10e69d8ab113e74f8 Mon Sep 17 00:00:00 2001 +From: Michal Srb +Date: Tue, 7 Sep 2021 21:31:21 +0200 +Subject: [PATCH] [rhbz] Retry XML-RPC calls when uploading attachments + +If there is a bot that automatically modifies newly opened bugs, then +it can lead to "query serialization error" from Bugzilla. Retry should +help us here. + +Signed-off-by: Michal Srb +--- + src/lib/abrt_xmlrpc.c | 34 ++++++++++++++++++++++++++++++++++ + src/lib/abrt_xmlrpc.h | 5 +++++ + src/lib/libreport-web.sym | 1 + + src/plugins/rhbz.c | 4 +++- + 4 files changed, 43 insertions(+), 1 deletion(-) + +diff --git a/src/lib/abrt_xmlrpc.c b/src/lib/abrt_xmlrpc.c +index 7cac9253..4c3b469a 100644 +--- a/src/lib/abrt_xmlrpc.c ++++ b/src/lib/abrt_xmlrpc.c +@@ -16,6 +16,7 @@ + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ ++#include + #include "internal_libreport.h" + #include "abrt_xmlrpc.h" + #include "proxies.h" +@@ -301,3 +302,36 @@ xmlrpc_value *abrt_xmlrpc_call(struct abrt_xmlrpc *ax, + + return result; + } ++ ++/* die eventually or return expected results; retry up to 5 times if the error is known */ ++xmlrpc_value *abrt_xmlrpc_call_with_retry(const char *fault_substring, ++ struct abrt_xmlrpc *ax, ++ const char *method, ++ const char *format, ...) ++{ ++ int retry_counter = 0; ++ xmlrpc_env env; ++ ++ va_list args; ++ ++ do { ++ // sleep, if this is not the first try; ++ // sleep() can be interrupted, but that's not a big deal here ++ if (retry_counter) ++ sleep(retry_counter); ++ ++ va_start(args, format); ++ xmlrpc_value *result = abrt_xmlrpc_call_full_va(&env, ax, method, format, args); ++ va_end(args); ++ ++ if (!env.fault_occurred) ++ return result; // success! ++ ++ if (env.fault_string && !strstr(env.fault_string, fault_substring)) { ++ // unknown error, don't bother retrying... ++ abrt_xmlrpc_die(&env); ++ } ++ } while (++retry_counter <= 5); ++ ++ abrt_xmlrpc_die(&env); ++} +diff --git a/src/lib/abrt_xmlrpc.h b/src/lib/abrt_xmlrpc.h +index 31768ffc..8ddcfc54 100644 +--- a/src/lib/abrt_xmlrpc.h ++++ b/src/lib/abrt_xmlrpc.h +@@ -63,6 +63,11 @@ xmlrpc_value *abrt_xmlrpc_call_params(xmlrpc_env *env, struct abrt_xmlrpc *ax, + xmlrpc_value *abrt_xmlrpc_call_full(xmlrpc_env *enf, struct abrt_xmlrpc *ax, + const char *method, const char *format, ...); + ++xmlrpc_value *abrt_xmlrpc_call_with_retry(const char *fault_substring, ++ struct abrt_xmlrpc *ax, ++ const char *method, ++ const char *format, ...); ++ + #ifdef __cplusplus + } + #endif +diff --git a/src/lib/libreport-web.sym b/src/lib/libreport-web.sym +index 44f5244d..9ab88d3e 100644 +--- a/src/lib/libreport-web.sym ++++ b/src/lib/libreport-web.sym +@@ -51,6 +51,7 @@ global: + abrt_xmlrpc_call; + abrt_xmlrpc_call_params; + abrt_xmlrpc_call_full; ++ abrt_xmlrpc_call_with_retry; + + /* internal_libreport.h - these symbols are only to be used by libreport developers */ + libreport_trim_all_whitespace; +diff --git a/src/plugins/rhbz.c b/src/plugins/rhbz.c +index 0dae1e93..f252f914 100644 +--- a/src/plugins/rhbz.c ++++ b/src/plugins/rhbz.c +@@ -643,8 +643,10 @@ int rhbz_attach_blob(struct abrt_xmlrpc *ax, const char *bug_id, + * i -> integer, single argument (int value) + * 6 -> base64, two arguments (char* plain data which will be encoded by xmlrpc-c to base64, + * size_t number of bytes to encode) ++ * ++ * Retry if another user/bot attempted to change the same data. + */ +- result = abrt_xmlrpc_call(ax, "Bug.add_attachment", "{s:(s),s:s,s:s,s:s,s:6,s:i}", ++ result = abrt_xmlrpc_call_with_retry("query serialization error", ax, "Bug.add_attachment", "{s:(s),s:s,s:s,s:s,s:6,s:i}", + "ids", bug_id, + "summary", fn, + "file_name", filename, +-- +2.31.1 + diff --git a/libreport.spec b/libreport.spec index 5f4afb1..ed8fc17 100644 --- a/libreport.spec +++ b/libreport.spec @@ -15,12 +15,13 @@ Summary: Generic library for reporting various problems Name: libreport Version: 2.15.2 -Release: 5%{?dist} +Release: 6%{?dist} License: GPLv2+ URL: https://abrt.readthedocs.org/ Source: https://github.com/abrt/%{name}/archive/%{version}/%{name}-%{version}.tar.gz Patch1: 0001-Change-the-default-Bugzilla-group.patch Patch2: 0002-rhbz-Be-a-little-bit-more-defensive-when-working-wit.patch +Patch3: 0003-rhbz-Retry-XML-RPC-calls-when-uploading-attachments.patch BuildRequires: %{dbus_devel} BuildRequires: gtk3-devel BuildRequires: curl-devel @@ -654,9 +655,13 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %endif %changelog +* Mon Jan 17 2022 Michal Srb - 2.15.2-6 +- [reporter-bugzilla] Retry XML-RPC calls +- Resolves: rhbz#2037399 + * Mon Jan 17 2022 Michal Srb - 2.15.2-5 - [reporter-bugzilla] Fix subcomponent handling -- Related: rhbz#2037399 +- Resolves: rhbz#2037399 * Mon Jan 17 2022 Michal Srb - 2.15.2-4 - Change the default Bugzilla group