summaryrefslogtreecommitdiffstats
path: root/debian/patches
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/patches/0025-Change-the-default-optimization-from-O3-to-O2-in-mys.patch54
-rw-r--r--debian/patches/2129-new-script-wsrep-sst-backup-fixes.patch51
-rw-r--r--debian/patches/2541-fix-stack-overflow-in-pinbox-allocator.patch283
-rw-r--r--debian/patches/env-perl-usr-bin-perl.patch99
-rw-r--r--debian/patches/fix-reproducible-builds-rocksdb.patch26
-rw-r--r--debian/patches/fix-spelling-rocksdb.patch38
-rw-r--r--debian/patches/mroonga-mrn-lib-dirs-path-reproducible-build.patch39
-rw-r--r--debian/patches/rocksdb-kfreebsd.patch150
-rw-r--r--debian/patches/series8
9 files changed, 748 insertions, 0 deletions
diff --git a/debian/patches/0025-Change-the-default-optimization-from-O3-to-O2-in-mys.patch b/debian/patches/0025-Change-the-default-optimization-from-O3-to-O2-in-mys.patch
new file mode 100644
index 00000000..77ced337
--- /dev/null
+++ b/debian/patches/0025-Change-the-default-optimization-from-O3-to-O2-in-mys.patch
@@ -0,0 +1,54 @@
+From: Ondrej Sury <ondrej@debian.org>
+Date: Wed, 22 Nov 2017 20:32:51 +0000
+Subject: Change the default optimization from -O3 to -O2 in
+ mysql_release.cmake BUILD_CONFIG profile
+Forwarded: https://jira.mariadb.org/browse/MDEV-19734?focusedCommentId=156606&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-156606
+
+---
+ cmake/build_configurations/mysql_release.cmake | 12 ++++++------
+ .../PerconaFT/cmake_modules/TokuSetupCompiler.cmake | 16 ++++++++--------
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+--- a/cmake/build_configurations/mysql_release.cmake
++++ b/cmake/build_configurations/mysql_release.cmake
+@@ -174,12 +174,12 @@ IF(UNIX)
+ IF(CMAKE_COMPILER_IS_GNUCC)
+ SET(COMMON_C_FLAGS "-g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -Wno-uninitialized")
+ SET(CMAKE_C_FLAGS_DEBUG "-O ${COMMON_C_FLAGS}")
+- SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_C_FLAGS}")
++ SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 ${COMMON_C_FLAGS}")
+ ENDIF()
+ IF(CMAKE_COMPILER_IS_GNUCXX)
+ SET(COMMON_CXX_FLAGS "-g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -Wno-uninitialized")
+ SET(CMAKE_CXX_FLAGS_DEBUG "-O ${COMMON_CXX_FLAGS}")
+- SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_CXX_FLAGS}")
++ SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 ${COMMON_CXX_FLAGS}")
+ ENDIF()
+
+ # IBM Z flags
+@@ -228,8 +228,8 @@ IF(UNIX)
+ ENDIF()
+ SET(CMAKE_C_FLAGS_DEBUG "${COMMON_C_FLAGS}")
+ SET(CMAKE_CXX_FLAGS_DEBUG "${COMMON_CXX_FLAGS}")
+- SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -unroll2 -ip ${COMMON_C_FLAGS}")
+- SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -unroll2 -ip ${COMMON_CXX_FLAGS}")
++ SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -unroll2 -ip ${COMMON_C_FLAGS}")
++ SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -unroll2 -ip ${COMMON_CXX_FLAGS}")
+ SET(WITH_SSL no)
+ ENDIF()
+ ENDIF()
+@@ -238,12 +238,12 @@ IF(UNIX)
+ IF(CMAKE_C_COMPILER_ID MATCHES "Clang")
+ SET(COMMON_C_FLAGS "-g -fno-omit-frame-pointer -fno-strict-aliasing -Wno-parentheses-equality -Wno-string-plus-int")
+ SET(CMAKE_C_FLAGS_DEBUG "${COMMON_C_FLAGS}")
+- SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_C_FLAGS}")
++ SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 ${COMMON_C_FLAGS}")
+ ENDIF()
+ IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ SET(COMMON_CXX_FLAGS "-g -fno-omit-frame-pointer -fno-strict-aliasing -Wno-parentheses-equality -Wno-string-plus-int")
+ SET(CMAKE_CXX_FLAGS_DEBUG "${COMMON_CXX_FLAGS}")
+- SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_CXX_FLAGS}")
++ SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 ${COMMON_CXX_FLAGS}")
+ ENDIF()
+
+ # Solaris flags
diff --git a/debian/patches/2129-new-script-wsrep-sst-backup-fixes.patch b/debian/patches/2129-new-script-wsrep-sst-backup-fixes.patch
new file mode 100644
index 00000000..4e26364a
--- /dev/null
+++ b/debian/patches/2129-new-script-wsrep-sst-backup-fixes.patch
@@ -0,0 +1,51 @@
+Forwarded: https://github.com/MariaDB/server/pull/2129
+Origin: https://patch-diff.githubusercontent.com/raw/MariaDB/server/pull/2129.patch
+From: Otto Kekäläinen <otto@kekalainen.net>
+Date: Sun, 22 May 2022 10:13:33 -0700
+Subject: [PATCH] Properly introduce wsrep_sst_backup script in project
+ packaging
+
+The script wsrep_sst_backup was introduced on MariaDB 10.3 in commit
+9b2fa2a. The new script was automatically included in RPM packages but not
+in Debian packages (which started to fail on waring about stray file).
+
+Include wsrep_sst_backup in the mariadb-server-10.{3..8} package, and
+also include a stub man page so that packaging of a new script is complete.
+
+---
+ debian/mariadb-server-10.6.install | 2 ++
+ man/CMakeLists.txt | 2 +-
+ man/wsrep_sst_backup.1 | 16 ++++++++++++++++
+ 3 files changed, 19 insertions(+), 1 deletion(-)
+ create mode 100644 man/wsrep_sst_backup.1
+
+--- a/man/CMakeLists.txt
++++ b/man/CMakeLists.txt
+@@ -13,7 +13,7 @@
+ # along with this program; if not, write to the Free Software
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
+
+-SET(MAN1_WSREP wsrep_sst_rsync.1 wsrep_sst_common.1 wsrep_sst_mariabackup.1
++SET(MAN1_WSREP wsrep_sst_rsync.1 wsrep_sst_common.1 wsrep_sst_mariabackup.1 wsrep_sst_backup.1
+ wsrep_sst_mysqldump.1 wsrep_sst_rsync_wan.1 galera_recovery.1 galera_new_cluster.1)
+ SET(MAN1_SERVER innochecksum.1 myisam_ftdump.1 myisamchk.1
+ aria_chk.1 aria_dump_log.1 aria_ftdump.1 aria_pack.1 aria_read_log.1
+--- /dev/null
++++ b/man/wsrep_sst_backup.1
+@@ -0,0 +1,16 @@
++'\" t
++.\"
++.TH "\FBWSREP_SST_BACKUP\FR" "1" "22 May 2022" "MariaDB 10\&.3" "MariaDB Database System"
++.\" -----------------------------------------------------------------
++.\" * set default formatting
++.\" -----------------------------------------------------------------
++.\" disable hyphenation
++.nh
++.\" disable justification (adjust text to left margin only)
++.ad l
++.SH NAME
++wsrep_sst_backup \- backup helper script for the MariaDB Galera Cluster
++.SH DESCRIPTION
++Use: See source code of script\.
++.PP
++For more information, please refer to the MariaDB Knowledge Base, available online at https://mariadb.com/kb/
diff --git a/debian/patches/2541-fix-stack-overflow-in-pinbox-allocator.patch b/debian/patches/2541-fix-stack-overflow-in-pinbox-allocator.patch
new file mode 100644
index 00000000..82f3b5b1
--- /dev/null
+++ b/debian/patches/2541-fix-stack-overflow-in-pinbox-allocator.patch
@@ -0,0 +1,283 @@
+Forwarded: https://github.com/MariaDB/server/pull/2541
+Origin: https://patch-diff.githubusercontent.com/raw/MariaDB/server/pull/2541.patch
+From: Hugo Wen <wenhug@amazon.com>
+Date: Sat, 11 Mar 2023 00:27:42 +0000
+Subject: [PATCH] Fix a stack overflow in pinbox allocator
+
+MariaDB supports a "wait-free concurrent allocator based on pinning addresses".
+In `lf_pinbox_real_free()` it tries to sort the pinned addresses for better
+performance to use binary search during "real free". `alloca()` was used to
+allocate stack memory and copy addresses.
+
+To prevent a stack overflow when allocating the stack memory the function checks
+if there's enough stack space. However, the available stack size was calculated
+inaccurately which eventually caused database crash due to stack overflow.
+
+The crash was seen on MariaDB 10.6.11 but the same code defect exists on all
+MariaDB versions.
+
+A similar issue happened previously and the fix in fc2c1e43 was to add a
+`ALLOCA_SAFETY_MARGIN` which is 8192 bytes. However, that safety margin is not
+enough during high connection workloads.
+
+MySQL also had a similar issue and the fix
+https://github.com/mysql/mysql-server/commit/b086fda was to remove the use of
+`alloca` and replace qsort approach by a linear scan through all pointers (pins)
+owned by each thread.
+
+This commit is mostly the same as it is the only way to solve this issue as:
+1. Frame sizes in different architecture can be different.
+2. Number of active (non-null) pinned addresses varies, so the frame
+ size for the recursive sorting function `msort_with_tmp` is also hard
+ to predict.
+3. Allocating big memory blocks in stack doesn't seem to be a very good
+ practice.
+
+For further details see the mentioned commit in MySQL and the inline comments.
+
+All new code of the whole pull request, including one or several files
+that are either new files or modified ones, are contributed under the
+BSD-new license. I am contributing on behalf of my employer Amazon Web
+Services, Inc.
+---
+ mysys/lf_alloc-pin.c | 180 ++++++++++++++-----------------------------
+ 1 file changed, 59 insertions(+), 121 deletions(-)
+
+--- a/mysys/lf_alloc-pin.c
++++ b/mysys/lf_alloc-pin.c
+@@ -103,12 +103,6 @@
+ #include <lf.h>
+ #include "my_cpu.h"
+
+-/*
+- when using alloca() leave at least that many bytes of the stack -
+- for functions we might be calling from within this stack frame
+-*/
+-#define ALLOCA_SAFETY_MARGIN 8192
+-
+ #define LF_PINBOX_MAX_PINS 65536
+
+ static void lf_pinbox_real_free(LF_PINS *pins);
+@@ -239,24 +233,21 @@ void lf_pinbox_put_pins(LF_PINS *pins)
+ } while (!my_atomic_cas32((int32 volatile*) &pinbox->pinstack_top_ver,
+ (int32*) &top_ver,
+ top_ver-pins->link+nr+LF_PINBOX_MAX_PINS));
+- return;
+ }
+
+-static int ptr_cmp(void **a, void **b)
++/*
++ Get the next pointer in the purgatory list.
++ Note that next_node is not used to avoid the extra volatile.
++*/
++#define pnext_node(P, X) (*((void **)(((char *)(X)) + (P)->free_ptr_offset)))
++
++static inline void add_to_purgatory(LF_PINS *pins, void *addr)
+ {
+- return *a < *b ? -1 : *a == *b ? 0 : 1;
++ pnext_node(pins->pinbox, addr)= pins->purgatory;
++ pins->purgatory= addr;
++ pins->purgatory_count++;
+ }
+
+-#define add_to_purgatory(PINS, ADDR) \
+- do \
+- { \
+- my_atomic_storeptr_explicit( \
+- (void **)((char *)(ADDR)+(PINS)->pinbox->free_ptr_offset), \
+- (PINS)->purgatory, MY_MEMORY_ORDER_RELEASE); \
+- (PINS)->purgatory= (ADDR); \
+- (PINS)->purgatory_count++; \
+- } while (0)
+-
+ /*
+ Free an object allocated via pinbox allocator
+
+@@ -274,138 +265,85 @@ void lf_pinbox_free(LF_PINS *pins, void
+ lf_pinbox_real_free(pins););
+ }
+
+-struct st_harvester {
+- void **granary;
+- int npins;
++struct st_match_and_save_arg {
++ LF_PINS *pins;
++ LF_PINBOX *pinbox;
++ void *old_purgatory;
+ };
+
+ /*
+- callback forlf_dynarray_iterate:
+- scan all pins of all threads and accumulate all pins
++ Callback for lf_dynarray_iterate:
++ Scan all pins of all threads, for each active (non-null) pin,
++ scan the current thread's purgatory. If present there, move it
++ to a new purgatory. At the end, the old purgatory will contain
++ pointers not pinned by any thread.
+ */
+-static int harvest_pins(LF_PINS *el, struct st_harvester *hv)
++static int match_and_save(LF_PINS *el, struct st_match_and_save_arg *arg)
+ {
+ int i;
+- LF_PINS *el_end= el+MY_MIN(hv->npins, LF_DYNARRAY_LEVEL_LENGTH);
++ LF_PINS *el_end= el + LF_DYNARRAY_LEVEL_LENGTH;
+ for (; el < el_end; el++)
+ {
+ for (i= 0; i < LF_PINBOX_PINS; i++)
+ {
+ void *p= el->pin[i];
+ if (p)
+- *hv->granary++= p;
++ {
++ void *cur= arg->old_purgatory;
++ void **list_prev= &arg->old_purgatory;
++ while (cur)
++ {
++ void *next= pnext_node(arg->pinbox, cur);
++
++ if (p == cur)
++ {
++ /* pinned - keeping */
++ add_to_purgatory(arg->pins, cur);
++ /* unlink from old purgatory */
++ *list_prev= next;
++ }
++ else
++ list_prev= (void **)((char *)cur+arg->pinbox->free_ptr_offset);
++ cur= next;
++ }
++ if (!arg->old_purgatory)
++ return 1;
++ }
+ }
+ }
+- /*
+- hv->npins may become negative below, but it means that
+- we're on the last dynarray page and harvest_pins() won't be
+- called again. We don't bother to make hv->npins() correct
+- (that is 0) in this case.
+- */
+- hv->npins-= LF_DYNARRAY_LEVEL_LENGTH;
+ return 0;
+ }
+
+ /*
+- callback forlf_dynarray_iterate:
+- scan all pins of all threads and see if addr is present there
+-*/
+-static int match_pins(LF_PINS *el, void *addr)
+-{
+- int i;
+- LF_PINS *el_end= el+LF_DYNARRAY_LEVEL_LENGTH;
+- for (; el < el_end; el++)
+- for (i= 0; i < LF_PINBOX_PINS; i++)
+- if (el->pin[i] == addr)
+- return 1;
+- return 0;
+-}
+-
+-#define next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset)))
+-#define anext_node(X) next_node(&allocator->pinbox, (X))
+-
+-/*
+ Scan the purgatory and free everything that can be freed
+ */
+ static void lf_pinbox_real_free(LF_PINS *pins)
+ {
+- int npins;
+- void *list;
+- void **addr= NULL;
+- void *first= NULL, *last= NULL;
+- struct st_my_thread_var *var= my_thread_var;
+- void *stack_ends_here= var ? var->stack_ends_here : NULL;
+ LF_PINBOX *pinbox= pins->pinbox;
+
+- npins= pinbox->pins_in_array+1;
++ /* Store info about current purgatory. */
++ struct st_match_and_save_arg arg = {pins, pinbox, pins->purgatory};
++ /* Reset purgatory. */
++ pins->purgatory= NULL;
++ pins->purgatory_count= 0;
+
+-#ifdef HAVE_ALLOCA
+- if (stack_ends_here != NULL)
+- {
+- int alloca_size= sizeof(void *)*LF_PINBOX_PINS*npins;
+- /* create a sorted list of pinned addresses, to speed up searches */
+- if (available_stack_size(&pinbox, stack_ends_here) >
+- alloca_size + ALLOCA_SAFETY_MARGIN)
+- {
+- struct st_harvester hv;
+- addr= (void **) alloca(alloca_size);
+- hv.granary= addr;
+- hv.npins= npins;
+- /* scan the dynarray and accumulate all pinned addresses */
+- lf_dynarray_iterate(&pinbox->pinarray,
+- (lf_dynarray_func)harvest_pins, &hv);
+-
+- npins= (int)(hv.granary-addr);
+- /* and sort them */
+- if (npins)
+- qsort(addr, npins, sizeof(void *), (qsort_cmp)ptr_cmp);
+- }
+- }
+-#endif
+
+- list= pins->purgatory;
+- pins->purgatory= 0;
+- pins->purgatory_count= 0;
+- while (list)
++ lf_dynarray_iterate(&pinbox->pinarray,
++ (lf_dynarray_func)match_and_save, &arg);
++
++ if (arg.old_purgatory)
+ {
+- void *cur= list;
+- list= *(void **)((char *)cur+pinbox->free_ptr_offset);
+- if (npins)
+- {
+- if (addr) /* use binary search */
+- {
+- void **a, **b, **c;
+- for (a= addr, b= addr+npins-1, c= a+(b-a)/2; (b-a) > 1; c= a+(b-a)/2)
+- if (cur == *c)
+- a= b= c;
+- else if (cur > *c)
+- a= c;
+- else
+- b= c;
+- if (cur == *a || cur == *b)
+- goto found;
+- }
+- else /* no alloca - no cookie. linear search here */
+- {
+- if (lf_dynarray_iterate(&pinbox->pinarray,
+- (lf_dynarray_func)match_pins, cur))
+- goto found;
+- }
+- }
+- /* not pinned - freeing */
+- if (last)
+- last= next_node(pinbox, last)= (uchar *)cur;
+- else
+- first= last= (uchar *)cur;
+- continue;
+-found:
+- /* pinned - keeping */
+- add_to_purgatory(pins, cur);
++ /* Some objects in the old purgatory were not pinned, free them. */
++ void *last= arg.old_purgatory;
++ while (pnext_node(pinbox, last))
++ last= pnext_node(pinbox, last);
++ pinbox->free_func(arg.old_purgatory, last, pinbox->free_func_arg);
+ }
+- if (last)
+- pinbox->free_func(first, last, pinbox->free_func_arg);
+ }
+
++#define next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset)))
++#define anext_node(X) next_node(&allocator->pinbox, (X))
++
+ /* lock-free memory allocator for fixed-size objects */
+
+ /*
diff --git a/debian/patches/env-perl-usr-bin-perl.patch b/debian/patches/env-perl-usr-bin-perl.patch
new file mode 100644
index 00000000..559e7f2e
--- /dev/null
+++ b/debian/patches/env-perl-usr-bin-perl.patch
@@ -0,0 +1,99 @@
+Forwarded: https://github.com/MariaDB/server/pull/1718
+Origin: https://patch-diff.githubusercontent.com/raw/MariaDB/server/pull/1718.patch
+From: Otto Kekäläinen <otto@debian.org>
+Date: Sun, 20 Dec 2020 20:58:42 +0200
+Subject: Fix perl path in scripts
+ Fix Lintian issue
+ https://lintian.debian.org/tags/incorrect-path-for-interpreter.html
+ .
+ Upstream will never accept this patch, see
+ https://github.com/MariaDB/server/pull/1718
+
+--- a/mysql-test/lib/process-purecov-annotations.pl
++++ b/mysql-test/lib/process-purecov-annotations.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+ # -*- cperl -*-
+
+ # This script processes a .gcov coverage report to honor purecov
+--- a/mysql-test/lib/v1/mysql-test-run.pl
++++ b/mysql-test/lib/v1/mysql-test-run.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+ # -*- cperl -*-
+
+ # Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+--- a/mysql-test/mariadb-stress-test.pl
++++ b/mysql-test/mariadb-stress-test.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+
+ # Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ #
+--- a/mysql-test/mariadb-test-run.pl
++++ b/mysql-test/mariadb-test-run.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+ # -*- cperl -*-
+
+ # Copyright (c) 2004, 2014, Oracle and/or its affiliates.
+--- a/mysql-test/std_data/checkDBI_DBD-MariaDB.pl
++++ b/mysql-test/std_data/checkDBI_DBD-MariaDB.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+
+ # Copyright (c) 2011, Oracle and/or its affiliates
+ #
+--- a/mysql-test/suite/engines/rr_trx/run_stress_tx_rr.pl
++++ b/mysql-test/suite/engines/rr_trx/run_stress_tx_rr.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+ ################################################################################
+ #
+ # This script runs the transactional stress test "stress_tx_rr" against the
+--- a/mysql-test/suite/funcs_1/lib/DataGen_local.pl
++++ b/mysql-test/suite/funcs_1/lib/DataGen_local.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+
+
+ if ( (scalar(@ARGV) != 1 ) || ($ARGV[0] =~ /[^0-9]/i ) )
+--- a/mysql-test/suite/funcs_1/lib/DataGen_modify.pl
++++ b/mysql-test/suite/funcs_1/lib/DataGen_modify.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+
+
+ if ( (scalar(@ARGV) != 2 ) || ($ARGV[0] =~ /[^0-9]/i ) )
+--- a/mysql-test/suite/funcs_2/lib/gen_charset_utf8.pl
++++ b/mysql-test/suite/funcs_2/lib/gen_charset_utf8.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+
+ #################################################################################
+ # Author: Serge Kozlov #
+--- a/mysql-test/suite/rpl/extension/checksum.pl
++++ b/mysql-test/suite/rpl/extension/checksum.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+
+ # Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ #
+--- a/scripts/mytop.sh
++++ b/scripts/mytop.sh
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+ #
+ # $Id: mytop,v 1.99-maria6 2019/10/22 14:53:51 jweisbuch Exp $
+
diff --git a/debian/patches/fix-reproducible-builds-rocksdb.patch b/debian/patches/fix-reproducible-builds-rocksdb.patch
new file mode 100644
index 00000000..1bc01252
--- /dev/null
+++ b/debian/patches/fix-reproducible-builds-rocksdb.patch
@@ -0,0 +1,26 @@
+Origin: https://github.com/facebook/rocksdb/commit/0a9a05ae12943b1529ef1eabbca5ce5a71c986bf
+# Merged in RocksDB 6.19.3, but not updated into MariaDB yet
+Bug: https://github.com/facebook/rocksdb/issues/7035
+Author: Otto Kekäläinen <otto@kekalainen.net>
+Subject: Make RocksDB build reproducible
+
+The RocksDB binary included a string with the build timestamp:
+> rocksdb_build_git_date:@2021-05-23·16:04:38@
+
+As this changes from build to build, it makes the builds unreproducible.
+Simply removing it solves the issue.
+
+This temporary fix can be removed when a proper fix already done in upstream
+lands in MariaDB when the RocksDB submodule is updated to a newer release.
+
+--- a/storage/rocksdb/rocksdb/util/build_version.cc.in
++++ b/storage/rocksdb/rocksdb/util/build_version.cc.in
+@@ -1,5 +1,5 @@
+ // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
+ #include "build_version.h"
+-const char* rocksdb_build_git_sha = "rocksdb_build_git_sha:@@GIT_SHA@@";
+-const char* rocksdb_build_git_date = "rocksdb_build_git_date:@@GIT_DATE_TIME@@";
+-const char* rocksdb_build_compile_date = __DATE__;
++const char* rocksdb_build_git_sha = "rocksdb_build_git_sha:REDACTED";
++const char* rocksdb_build_git_date = "rocksdb_build_git_date:REDACTED";
++const char* rocksdb_build_compile_date = "REDACTED";
diff --git a/debian/patches/fix-spelling-rocksdb.patch b/debian/patches/fix-spelling-rocksdb.patch
new file mode 100644
index 00000000..d9007c3a
--- /dev/null
+++ b/debian/patches/fix-spelling-rocksdb.patch
@@ -0,0 +1,38 @@
+Forwarded: https://github.com/facebook/rocksdb/pull/9653
+Origin: https://patch-diff.githubusercontent.com/raw/facebook/rocksdb/pull/9653.patch
+From: Otto Kekäläinen <otto@debian.org>
+Date: Wed, 2 Mar 2022 18:13:18 -0800
+Subject: Fix various spelling errors still found in code
+ Two upstream PRs remain that have been merged, but not imported on MariaDB yet.
+
+--- a/storage/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc
++++ b/storage/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc
+@@ -46,7 +46,7 @@ Status ExternalSstFileIngestionJob::Prep
+ TablePropertiesCollectorFactory::Context::kUnknownColumnFamily &&
+ f.cf_id != cfd_->GetID()) {
+ return Status::InvalidArgument(
+- "External file column family id dont match");
++ "External file column family id don't match");
+ }
+ }
+
+@@ -646,7 +646,7 @@ Status ExternalSstFileIngestionJob::Assi
+ return Status::InvalidArgument("Global seqno is required, but disabled");
+ } else if (file_to_ingest->global_seqno_offset == 0) {
+ return Status::InvalidArgument(
+- "Trying to set global seqno for a file that dont have a global seqno "
++ "Trying to set global seqno for a file that don't have a global seqno "
+ "field");
+ }
+
+--- a/storage/rocksdb/rocksdb/include/rocksdb/cache.h
++++ b/storage/rocksdb/rocksdb/include/rocksdb/cache.h
+@@ -60,7 +60,7 @@ struct LRUCacheOptions {
+ // If greater than zero, the LRU list will be split into a high-pri
+ // list and a low-pri list. High-pri entries will be insert to the
+ // tail of high-pri list, while low-pri entries will be first inserted to
+- // the low-pri list (the midpoint). This is refered to as
++ // the low-pri list (the midpoint). This is referred to as
+ // midpoint insertion strategy to make entries never get hit in cache
+ // age out faster.
+ //
diff --git a/debian/patches/mroonga-mrn-lib-dirs-path-reproducible-build.patch b/debian/patches/mroonga-mrn-lib-dirs-path-reproducible-build.patch
new file mode 100644
index 00000000..1034f8c6
--- /dev/null
+++ b/debian/patches/mroonga-mrn-lib-dirs-path-reproducible-build.patch
@@ -0,0 +1,39 @@
+Forwarded: not-needed
+Origin: https://github.com/mroonga/mroonga/issues/298#issuecomment-1030815927
+Bug: https://github.com/mroonga/mroonga/issues/298
+From: Sutou Kouhei <kou@clear-code.com>
+Date: Sat, 5 Feb 2022 11:05:39 +0900
+Subject: [PATCH] cmake: add support for reproducible buildS
+ .
+ We should use relative path not absolute path.
+ We can use target without breaking reproducibility.
+--- a/storage/mroonga/CMakeLists.txt
++++ b/storage/mroonga/CMakeLists.txt
+@@ -209,7 +209,7 @@ set(MYSQL_INCLUDE_DIRS
+
+ if(MRN_BUNDLED)
+ set(MYSQL_PLUGIN_DIR "${INSTALL_PLUGINDIR}")
+- set(MYSQL_SERVICES_LIB_DIR "${MYSQL_BUILD_DIR}/libservices")
++ set(MYSQL_SERVICES_LIB_DIR)
+ set(MYSQL_CFLAGS "${CMAKE_C_FLAGS}")
+ set(MYSQL_VERSION "${MYSQL_BASE_VERSION}")
+ else()
+@@ -248,15 +248,11 @@ endif()
+
+ if(MRN_GROONGA_BUNDLED)
+ set(GROONGA_INCLUDE_DIRS "${MRN_BUNDLED_GROONGA_DIR}/include")
+- set(GROONGA_LIBRARY_DIRS "${MRN_BUNDLED_GROONGA_DIR}/lib")
+- set(GROONGA_LIBRARIES "libgroonga")
++ set(GROONGA_LIBRARY "libgroonga")
+
+- set(MRN_LIBRARY_DIRS ${GROONGA_LIBRARY_DIRS})
+- set(MRN_LIBRARIES ${GROONGA_LIBRARIES})
++ set(MRN_LIBRARY_DIRS)
++ set(MRN_LIBRARIES ${GROONGA_LIBRARY})
+ if(MRN_GROONGA_NORMALIZER_MYSQL_EMBED)
+- set(MRN_LIBRARY_DIRS
+- ${MRN_LIBRARY_DIRS}
+- "${MRN_BUNDLED_GROONGA_NORMALIZER_MYSQL_DIR}/normalizers")
+ set(MRN_LIBRARIES ${MRN_LIBRARIES} mysql_normalizer)
+ endif()
+ else()
diff --git a/debian/patches/rocksdb-kfreebsd.patch b/debian/patches/rocksdb-kfreebsd.patch
new file mode 100644
index 00000000..da15484b
--- /dev/null
+++ b/debian/patches/rocksdb-kfreebsd.patch
@@ -0,0 +1,150 @@
+Forwarded: https://github.com/facebook/rocksdb/pull/6992
+From: Andrew Kryczka <andrewkr@fb.com>
+Date: Tue, 16 Jun 2020 19:34:21 -0700
+# Merged in RocksDB 6.13.fb, but not updated into MariaDB yet
+Bug: https://jira.mariadb.org/browse/MDEV-19251
+Description:
+ Upstream has merged this but we still need to wait for it to be included
+ in a RocksDB release and imported into MariaDB and then into Debian.
+--- a/storage/rocksdb/build_rocksdb.cmake
++++ b/storage/rocksdb/build_rocksdb.cmake
+@@ -90,6 +90,8 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux"
+ add_definitions(-DOS_LINUX)
+ elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS")
+ add_definitions(-DOS_SOLARIS)
++elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD")
++ add_definitions(-DOS_GNU_KFREEBSD)
+ elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
+ add_definitions(-DOS_FREEBSD)
+ elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
+--- a/storage/rocksdb/rocksdb/CMakeLists.txt
++++ b/storage/rocksdb/rocksdb/CMakeLists.txt
+@@ -91,7 +91,7 @@ if(MSVC)
+ option(WITH_XPRESS "build with windows built in compression" OFF)
+ include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc)
+ else()
+- if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
++ if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD")
+ # FreeBSD has jemalloc as default malloc
+ # but it does not have all the jemalloc files in include/...
+ set(WITH_JEMALLOC ON)
+@@ -413,6 +413,8 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux"
+ add_definitions(-DOS_LINUX)
+ elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS")
+ add_definitions(-DOS_SOLARIS)
++elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD")
++ add_definitions(-DOS_GNU_KFREEBSD)
+ elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
+ add_definitions(-DOS_FREEBSD)
+ elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
+--- a/storage/rocksdb/rocksdb/build_tools/build_detect_platform
++++ b/storage/rocksdb/rocksdb/build_tools/build_detect_platform
+@@ -190,6 +190,17 @@ EOF
+ PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread"
+ # PORT_FILES=port/freebsd/freebsd_specific.cc
+ ;;
++ GNU/kFreeBSD)
++ PLATFORM=OS_GNU_KFREEBSD
++ COMMON_FLAGS="$COMMON_FLAGS -DOS_GNU_KFREEBSD"
++ if [ -z "$USE_CLANG" ]; then
++ COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp"
++ else
++ PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -latomic"
++ fi
++ PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread -lrt"
++ # PORT_FILES=port/gnu_kfreebsd/gnu_kfreebsd_specific.cc
++ ;;
+ NetBSD)
+ PLATFORM=OS_NETBSD
+ COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_NETBSD"
+--- a/storage/rocksdb/rocksdb/env/env_posix.cc
++++ b/storage/rocksdb/rocksdb/env/env_posix.cc
+@@ -41,7 +41,7 @@
+ #include <time.h>
+ #include <algorithm>
+ // Get nano time includes
+-#if defined(OS_LINUX) || defined(OS_FREEBSD)
++#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_GNU_KFREEBSD)
+ #elif defined(__MACH__)
+ #include <Availability.h>
+ #include <mach/clock.h>
+@@ -287,7 +287,8 @@ class PosixEnv : public CompositeEnvWrap
+ }
+
+ uint64_t NowNanos() override {
+-#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_AIX)
++#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_GNU_KFREEBSD) || \
++ defined(OS_AIX)
+ struct timespec ts;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return static_cast<uint64_t>(ts.tv_sec) * 1000000000 + ts.tv_nsec;
+@@ -307,8 +308,8 @@ class PosixEnv : public CompositeEnvWrap
+ }
+
+ uint64_t NowCPUNanos() override {
+-#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_AIX) || \
+- (defined(__MACH__) && defined(__MAC_10_12))
++#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_GNU_KFREEBSD) || \
++ defined(OS_AIX) || (defined(__MACH__) && defined(__MAC_10_12))
+ struct timespec ts;
+ clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
+ return static_cast<uint64_t>(ts.tv_sec) * 1000000000 + ts.tv_nsec;
+--- a/storage/rocksdb/rocksdb/port/stack_trace.cc
++++ b/storage/rocksdb/rocksdb/port/stack_trace.cc
+@@ -32,7 +32,7 @@ namespace port {
+
+ namespace {
+
+-#if defined(OS_LINUX) || defined(OS_FREEBSD)
++#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_GNU_KFREEBSD)
+ const char* GetExecutableName() {
+ static char name[1024];
+
+--- a/storage/rocksdb/rdb_io_watchdog.h
++++ b/storage/rocksdb/rdb_io_watchdog.h
+@@ -56,19 +56,19 @@ class Rdb_io_watchdog {
+ int stop_timers() {
+ int ret = 0;
+
+- if (m_io_check_watchdog_timer) {
++ if (m_io_check_watchdog_timer != reinterpret_cast<timer_t>(-1)) {
+ ret = timer_delete(m_io_check_watchdog_timer);
+
+ if (!ret) {
+- m_io_check_watchdog_timer = nullptr;
++ m_io_check_watchdog_timer = reinterpret_cast<timer_t>(-1);
+ }
+ }
+
+- if (m_io_check_timer && !ret) {
++ if (m_io_check_timer != reinterpret_cast<timer_t>(-1) && !ret) {
+ ret = timer_delete(m_io_check_timer);
+
+ if (!ret) {
+- m_io_check_timer = nullptr;
++ m_io_check_timer = reinterpret_cast<timer_t>(-1);
+ }
+ }
+
+@@ -93,8 +93,8 @@ class Rdb_io_watchdog {
+
+ public:
+ explicit Rdb_io_watchdog(std::vector<std::string> &&directories)
+- : m_io_check_timer(nullptr),
+- m_io_check_watchdog_timer(nullptr),
++ : m_io_check_timer(reinterpret_cast<timer_t>(-1)),
++ m_io_check_watchdog_timer(reinterpret_cast<timer_t>(-1)),
+ m_io_in_progress(false),
+ m_dirs_to_check(std::move(directories)),
+ m_buf(nullptr) {
+--- a/storage/rocksdb/rdb_io_watchdog.cc
++++ b/storage/rocksdb/rdb_io_watchdog.cc
+@@ -111,7 +111,7 @@ void Rdb_io_watchdog::io_check_callback(
+ sql_print_warning("Deleting the watchdog I/O timer failed with %d.", errno);
+ }
+
+- m_io_check_watchdog_timer = nullptr;
++ m_io_check_watchdog_timer = reinterpret_cast<timer_t>(-1);
+
+ RDB_MUTEX_UNLOCK_CHECK(m_reset_mutex);
+ }
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 00000000..fd212bbf
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,8 @@
+0025-Change-the-default-optimization-from-O3-to-O2-in-mys.patch
+rocksdb-kfreebsd.patch
+env-perl-usr-bin-perl.patch
+fix-spelling-rocksdb.patch
+fix-reproducible-builds-rocksdb.patch
+mroonga-mrn-lib-dirs-path-reproducible-build.patch
+2129-new-script-wsrep-sst-backup-fixes.patch
+2541-fix-stack-overflow-in-pinbox-allocator.patch