1. 01 Feb, 2020 1 commit
    • Eugene Kosov's avatar
      clean up redo log · 691c691a
      Eugene Kosov authored
      main change: rename first redo log without file close
      
      second change: use os_offset_t to represent offset in a file
      
      third change: fix log texts
      691c691a
  2. 30 Jan, 2020 1 commit
  3. 29 Jan, 2020 4 commits
    • mkaruza's avatar
      Galera GTID support · 41bc7368
      mkaruza authored
      Support for galera GTID consistency thru cluster. All nodes in cluster
      should have same GTID for replicated events which are originating from cluster.
      Cluster originating commands need to contain sequential WSREP GTID seqno
      Ignore manual setting of gtid_seq_no=X.
      
      In master-slave scenario where master is non galera node replicated GTID is
      replicated and is preserved in all nodes.
      
      To have this - domain_id, server_id and seqnos should be same on all nodes.
      Node which bootstraps the cluster, to achieve this, sends domain_id and
      server_id to other nodes and this combination is used to write GTID for events
      that are replicated inside cluster.
      
      Cluster nodes that are executing non replicated events are going to have different
      GTID than replicated ones, difference will be visible in domain part of gtid.
      
      With wsrep_gtid_domain_id you can set domain_id for WSREP cluster.
      
      Functions WSREP_LAST_WRITTEN_GTID, WSREP_LAST_SEEN_GTID and
      WSREP_SYNC_WAIT_UPTO_GTID now works with "native" GTID format.
      
      Fixed galera tests to reflect this chances.
      
      Add variable to manually update WSREP GTID seqno in cluster
      
      Add variable to manipulate and change WSREP GTID seqno. Next command
      originating from cluster and on same thread will have set seqno and
      cluster should change their internal counter to it's value.
      Behavior is same as using @@gtid_seq_no for non WSREP transaction.
      41bc7368
    • Marko Mäkelä's avatar
      Cleanup: Remove mtr_state_t and mtr_t::m_state · 5defdc38
      Marko Mäkelä authored
      mtr_t::is_active(), mtr_t::is_committed(): Make debug-only.
      5defdc38
    • Marko Mäkelä's avatar
      MDEV-21362: Do not call memcmp on null pointers · c69a8629
      Marko Mäkelä authored
      Starting with commit 37344390
      we would invoke memcmp() unconditionally, even if the length is zero.
      But, a call to memcmp() is undefined if any parameter is a null pointer,
      even if the length is zero.
      
      In the following tests, a null pointer is being passed to the comparison:
      vcol.vcol_keys_innodb gcol.gcol_keys_innodb main.func_group_innodb
      innodb.innodb_bug53592
      
      cmp_data(): Keep WITH_UBSAN happy and avoid potential future bugs
      in optimized builds, like the one addressed by
      commit fc168c3a (MDEV-15587).
      c69a8629
    • Marko Mäkelä's avatar
      MDEV-21351 Replace recv_sys.heap with list of buf_block_t · 50324ce6
      Marko Mäkelä authored
      InnoDB crash recovery used a special type of mem_heap_t that
      allocates backing store from the buffer pool. That incurred
      a significant overhead, leading to underutilization of memory,
      and limiting the maximum contiguous allocated size of a log record.
      
      recv_sys_t::blocks: A linked list of buf_block_t that are allocated
      by buf_block_alloc() for redo log records. Replaces recv_sys_t::heap.
      We repurpose buf_block_t::unzip_LRU for linking the elements.
      
      recv_sys_t::max_log_blocks: Renamed from recv_n_pool_free_frames.
      
      recv_sys_t::max_blocks(): Accessor for max_log_blocks.
      
      recv_sys_t::alloc(): Allocate memory from the current recv_sys_t::blocks
      element, or allocate another block.  In debug builds, various free()
      member functions must be invoked, because we repurpose
      buf_page_t::buf_fix_count for tracking allocations.
      
      recv_sys_t::free_corrupted_page(): Renamed from recv_recover_corrupt_page()
      
      recv_sys_t::is_memory_exhausted(): Renamed from recv_sys_heap_check()
      
      recv_sys_t::pages and its elements are allocated directly by the
      system memory allocator.
      
      recv_parse_log_recs(): Remove the parameter available_memory.
      
      We rename some variables 'store_to_hash' to 'store', because
      recv_sys.pages is not actually a hash table.
      
      This is joint work with Thirunarayanan Balathandayuthapani.
      50324ce6
  4. 28 Jan, 2020 4 commits
  5. 27 Jan, 2020 2 commits
  6. 26 Jan, 2020 2 commits
  7. 25 Jan, 2020 1 commit
  8. 24 Jan, 2020 10 commits
    • Sergei Petrunia's avatar
      MDEV-21383: Possible range plan is not used under certain conditions · 7e8a5802
      Sergei Petrunia authored
      [Variant 2 of the fix: collect the attached conditions]
      
      Problem:
      make_join_select() has a section of code which starts with
       "We plan to scan all rows. Check again if we should use an index."
      
      the code in that section will [unnecessarily] re-run the range
      optimizer using this condition:
      
        condition_attached_to_current_table AND current_table's_ON_expr
      
      Note that the original invocation of range optimizer in
      make_join_statistics was done using the whole select's WHERE condition.
      Taking the whole select's WHERE condition and using multiple-equalities
      allowed the range optimizer to infer more range restrictions.
      
      The fix:
      - Do range optimization using a condition that is an AND of this table's
      condition and all of the previous tables' conditions.
      - Also, fix the range optimizer to prefer SEL_ARGs with type=KEY_RANGE
      over SEL_ARGS with type=MAYBE_KEY, regardless of the key part.
      Computing
      key_and(
        SEL_ARG(type=MAYBE_KEY key_part=1),
        SEL_ARG(type=KEY_RANGE, key_part=2)
      )
      will now produce the SEL_ARG with type=KEY_RANGE.
      7e8a5802
    • Eugene Kosov's avatar
      cleanup redo log · b534a667
      Eugene Kosov authored
      class log_file_t: more or less sane RAII wrapper around redo log file
      descriptor and its path.
      
      This change is motivated by the need of using that log_file_t somewhere else.
      b534a667
    • Oleksandr Byelkin's avatar
      fix tests · fdb9b05c
      Oleksandr Byelkin authored
      fdb9b05c
    • Oleksandr Byelkin's avatar
      Merge branch '10.3' into 10.4 · bfc24bb2
      Oleksandr Byelkin authored
      bfc24bb2
    • Oleksandr Byelkin's avatar
    • Oleksandr Byelkin's avatar
      Merge branch '10.2' into 10.3 · ceda5f72
      Oleksandr Byelkin authored
      ceda5f72
    • Oleksandr Byelkin's avatar
      Merge branch '10.1' into 10.2 · f2ccfcac
      Oleksandr Byelkin authored
      f2ccfcac
    • Marko Mäkelä's avatar
      ac3e3e12
    • Marko Mäkelä's avatar
      MDEV-16678: Ignore #sql-ib tables in --suite=parts · 6af00b2c
      Marko Mäkelä authored
      We missed these in commit 89633995
      and commit ccd87d34.
      6af00b2c
    • Sujatha's avatar
      MDEV-21490: binlog tests fail with valgrind: Conditional jump or move depends... · 599a0609
      Sujatha authored
      MDEV-21490: binlog tests fail with valgrind: Conditional jump or move depends on uninitialised value in sql_ex_info::init
      
      Problem:
      =======
      P1) Conditional jump or move depends on uninitialised value(s)
          sql_ex_info::init(char const*, char const*, bool) (log_event.cc:3083)
      
      code: All the following variables are not initialized.
      ----
        return ((cached_new_format != -1) ? cached_new_format :
          (cached_new_format=(field_term_len > 1 || enclosed_len > 1 ||
          line_term_len > 1 || line_start_len > 1 || escaped_len > 1)));
      
      P2) Conditional jump or move depends on uninitialised value(s)
          Rows_log_event::Rows_log_event(char const*, unsigned
            int, Format_description_log_event const*) (log_event.cc:9571)
      
      Code: Uninitialized values is reported for 'var_header_len' variable.
      ----
        if (var_header_len < 2 || event_len < static_cast<unsigned
            int>(var_header_len + (post_start - buf)))
      
      P3) Conditional jump or move depends on uninitialised value(s)
          Table_map_log_event::pack_info(Protocol*) (log_event.cc:11553)
      
      code:'m_table_id' is uninitialized.
      ----
        void Table_map_log_event::pack_info(Protocol *protocol)
        ...
        size_t bytes= my_snprintf(buf, sizeof(buf), "table_id: %lu (%s.%s)",
                                    m_table_id, m_dbnam, m_tblnam);
      
      Fix:
      ===
      P1 - Fix)
      Initialize cached_new_format,field_term_len, enclosed_len, line_term_len,
      line_start_len, escaped_len members in default constructor.
      
      P2 - Fix)
      "var_header_len" is initialized by reading the event buffer. In case of an
      invalid event the buffer will contain invalid data. Hence added a check to
      validate the event data. If event_len is smaller than valid header length
      return immediately.
      
      P3 - Fix)
      'm_table_id' within Table_map_log_event is initialized by reading data from
      the event buffer. Use 'VALIDATE_BYTES_READ' macro to validate the current
      state of the buffer. If it is invalid return immediately.
      599a0609
  9. 23 Jan, 2020 9 commits
  10. 22 Jan, 2020 6 commits