1. 01 Jun, 2020 3 commits
  2. 31 May, 2020 1 commit
  3. 29 May, 2020 11 commits
    • Sergey Vojtovich's avatar
      Attempt fixing mroonga gcc 8 build failure · 49854811
      Sergey Vojtovich authored
      Part of MDEV-19061 - table_share used for reading statistical tables is
                           not protected
      49854811
    • Sergey Vojtovich's avatar
      Thread safe histograms loading · c2798784
      Sergey Vojtovich authored
      Previously multiple threads were allowed to load histograms concurrently.
      There were no known problems caused by this. But given amount of data
      races in this code, it'd happen sooner or later.
      
      To avoid scalability bottleneck, histograms loading is protected by
      per-TABLE_SHARE atomic variable.
      
      Whenever histograms were loaded by preceding statement (hot-path), a
      scalable load-acquire check is performed.
      
      Whenever histograms have to be loaded anew, mutual exclusion for loaders
      is established by atomic variable. If histograms are being loaded
      concurrently, statement waits until load is completed.
      
      - Table_statistics::total_hist_size moved to TABLE_STATISTICS_CB: only
        meaningful within TABLE_SHARE (not used for collected stats).
      - TABLE_STATISTICS_CB::histograms_can_be_read and
        TABLE_STATISTICS_CB::histograms_are_read are replaced with a tri state
        atomic variable.
      - Simplified away alloc_histograms_for_table_share().
      
      Note: there's still likely a data race if a thread attempts accessing
      histograms data after it failed to load it (because of concurrent load).
      It was there previously and goes out of the scope of this effort. One way
      of fixing it could be reviving TABLE::histograms_are_read and adding
      appropriate checks whenever it is needed.
      
      Part of MDEV-19061 - table_share used for reading statistical tables is
                           not protected
      c2798784
    • Sergey Vojtovich's avatar
      Thread safe statistics loading · 609a0d3d
      Sergey Vojtovich authored
      Previously multiple threads were allowed to load statistics concurrently.
      There were no known problems caused by this. But given amount of data
      races in this code, it'd happen sooner or later.
      
      To avoid scalability bottleneck, statistics loading is protected by
      per-TABLE_SHARE atomic variable.
      
      Whenever statistics were loaded by preceding statement (hot-path), a
      scalable load-acquire check is performed.
      
      Whenever statistics have to be loaded anew, mutual exclusion for loaders
      is established by atomic variable. If statistics are being loaded
      concurrently, statement waits until load is completed.
      
      TABLE_STATISTICS_CB::stats_can_be_read and
      TABLE_STATISTICS_CB::stats_is_read are replaced with a tri state atomic
      variable.
      
      Part of MDEV-19061 - table_share used for reading statistical tables is
                           not protected
      609a0d3d
    • Sergey Vojtovich's avatar
      Simplified away statistics_for_tables_is_needed() · 1055a7f4
      Sergey Vojtovich authored
      Removed redundant loops, integrated logics into the caller instead.
      Unified condition in read_statistics_for_tables(), less
      "table_share != NULL" checks, no more potential "table_share == NULL"
      dereferencing.
      
      Part of MDEV-19061 - table_share used for reading statistical tables is
                           not protected
      1055a7f4
    • Kentoku SHIBA's avatar
    • Kentoku SHIBA's avatar
    • Alexander Barkov's avatar
      MDEV-22744 *SAN: sql/item_xmlfunc.cc:791:43: runtime error: downcast of... · a2932e86
      Alexander Barkov authored
      MDEV-22744 *SAN: sql/item_xmlfunc.cc:791:43: runtime error: downcast of address ... which does not point to an object of type 'Item_func' note: object is of type 'Item_bool' (on optimized builds)
      
      In Item_nodeset_func_predicate::val_nodeset, args[1] is not necessarily
      an Item_func descendant. It can be Item_bool.
      
      Removing a wrong cast. It was not really needed anyway.
      a2932e86
    • Vladislav Vaintroub's avatar
    • Vladislav Vaintroub's avatar
      MDEV-22743 Windows 10 MSI installer : port in use is not determined · b00cd3e4
      Vladislav Vaintroub authored
      when checking for free port, use the same logic (IPv6 socket address
      / dual socket), like the server would.
      
      Previous solution for testing whether port is free was trying to bind
      IPv4 socket on INADDR_ANY.
      
      This not work now on some reason, that attempt succeeds, even if there is
      an existing IPv6-dual socket listening on 0.0.0.0:3306
      b00cd3e4
    • Vladislav Vaintroub's avatar
      MSI installer : Use CAQuietExec64 on Win64 , not CAQuietExec · ff72f369
      Vladislav Vaintroub authored
      It works, but irritates people who look into the log and see
      traces of 32bit custom action server.
      ff72f369
    • Vladislav Vaintroub's avatar
      Remove unused WiX source file · e2d7da49
      Vladislav Vaintroub authored
      e2d7da49
  4. 28 May, 2020 2 commits
    • Anel Husakovic's avatar
      fix pre-definition for embedded server for find_user_or_anon() · a1b3bebe
      Anel Husakovic authored
      Pre-definitions are allowed for non-embedded.
      Failur catched with:
      ```
      cmake ../../10.1 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=g++-9
      -DCMAKE_C_COMPILER=gcc-9 -DWITH_EMBEDDED_SERVER=ON -DCMAKE_BUILD_TYPE=Debug
      -DPLUGIN_{ARCHIVE,TOKUDB,MROONGA,OQGRAPH,ROCKSDB,PERFSCHEMA,SPIDER,SPHINX}=N
      -DMYSQL_MAINTAINER_MODE=ON -DNOT_FOR_DISTRIBUTION=ON
      ```
      Alternative fix would be
      ```
      --- a/sql/sql_acl.cc
      +++ b/sql/sql_acl.cc
      @@ -201,8 +201,10 @@ LEX_STRING current_user= { C_STRING_WITH_LEN("*current_user") };
       LEX_STRING current_role= { C_STRING_WITH_LEN("*current_role") };
       LEX_STRING current_user_and_current_role= { C_STRING_WITH_LEN("*current_user_and_current_role") };
      
      +#ifndef EMBEDDED_LIBRARY
       class ACL_USER;
       static ACL_USER *find_user_or_anon(const char *host, const char *user, const char *ip);
      +#endif
      ```
      a1b3bebe
    • Anel Husakovic's avatar
      MDEV-22312: Bad error message for SET DEFAULT ROLE when user account is not granted the role · 957cb7b7
      Anel Husakovic authored
      - `SET DEFAULT ROLE xxx [FOR yyy]` should say:
        "User yyy has not been granted a role xxx" if:
          - The current user (not the user `yyy` in the FOR clause) can see the
          role xxx. It can see the role if:
            * role exists in `mysql.roles_mappings` (traverse the graph),
            * If the current user has read access on `mysql.user` table - in
          that case, it can see all roles, granted or not.
          - Otherwise it should be "Invalid role specification".
      
      In other words, it should not be possible to use `SET DEFAULT ROLE` to discover whether a specific role exist or not.
      957cb7b7
  5. 27 May, 2020 17 commits
  6. 26 May, 2020 6 commits
    • Eugene Kosov's avatar
      intrusive::list fixes · 18d8f06f
      Eugene Kosov authored
      namespace intrusive: removed
      
      split class into two: ilist<T> and sized_ilist<T> which has a size field.
      
      ilist<T> no more NULLify pointers to bring a slignly better performance.
      As a consequence, fil_space_t::is_in_unflushed_spaces and
      fil_space_t::is_in_rotation_list boolean members are needed now.
      18d8f06f
    • Monty's avatar
      Fixed crash in aria recovery when using bulk insert · 403dacf6
      Monty authored
      MDEV-20578 Got error 126 when executing undo undo_key_delete
      upon Aria crash recovery
      
      The crash happens in this scenario:
      - Table with unique keys and non unique keys
      - Batch insert (LOAD DATA or INSERT ... SELECT) with REPLACE
      - Some insert succeeds followed by duplicate key error
      
      In the above scenario the table gets corrupted.
      
      The bug was that we don't generate any undo entry for the
      failed insert as the whole insert can be ignored by undo.
      The code did however not take into account that when bulk
      insert is used, we would write cached keys to the file on
      failure and undo would wrongly ignore these.
      
      Fixed by moving the writing of the cache keys after we write
      the aborted-insert event to the log.
      403dacf6
    • Andrei Elkin's avatar
      MDEV-15152 Optimistic parallel slave doesnt cope well with START SLAVE UNTIL · 0c1f97b3
      Andrei Elkin authored
      The immediate bug was caused by a failure to recognize a correct
      position to stop the slave applier run in optimistic parallel mode.
      There were the following set of issues that the analysis unveil.
      1 incorrect estimate for the event binlog position passed to
        is_until_satisfied
      2 wait for workers to complete by the driver thread did not account non-group events
        that could be left unprocessed and thus to mix up the last executed
        binlog group's file and position:
        the file remained old and the position related to the new rotated file
      3 incorrect 'slave reached file:pos' by the parallel slave report in the error log
      4 relay log UNTIL missed out the parallel slave branch in
        is_until_satisfied.
      
      The patch addresses all of them to simplify logics of log change
      notification in either the master and relay-log until case.
      P.1 is addressed with passing the event into is_until_satisfied()
      for proper analisis by the function.
      P.2 is fixed by changes in handle_queued_pos_update().
      P.4 required removing relay-log change notification by workers.
      Instead the driver thread updates the notion of the current relay-log
      fully itself with aid of introduced
      bool Relay_log_info::until_relay_log_names_defer.
      
      An extra print out of the requested until file:pos is arranged
      with --log-warning=3.
      0c1f97b3
    • Andrei Elkin's avatar
    • Andrei Elkin's avatar
      MDEV-15152 Optimistic parallel slave doesnt cope well with START SLAVE UNTIL · dbe447a7
      Andrei Elkin authored
      The immediate bug was caused by a failure to recognize a correct
      position to stop the slave applier run in optimistic parallel mode.
      There were the following set of issues that the analysis unveil.
      1 incorrect estimate for the event binlog position passed to
        is_until_satisfied
      2 wait for workers to complete by the driver thread did not account non-group events
        that could be left unprocessed and thus to mix up the last executed
        binlog group's file and position:
        the file remained old and the position related to the new rotated file
      3 incorrect 'slave reached file:pos' by the parallel slave report in the error log
      4 relay log UNTIL missed out the parallel slave branch in
        is_until_satisfied.
      
      The patch addresses all of them to simplify logics of log change
      notification in either the master and relay-log until case.
      P.1 is addressed with passing the event into is_until_satisfied()
      for proper analisis by the function.
      P.2 is fixed by changes in handle_queued_pos_update().
      P.4 required removing relay-log change notification by workers.
      Instead the driver thread updates the notion of the current relay-log
      fully itself with aid of introduced
      bool Relay_log_info::until_relay_log_names_defer.
      
      An extra print out of the requested until file:pos is arranged
      with --log-warning=3.
      dbe447a7
    • Aleksey Midenkov's avatar
      MDEV-20015 Assertion `!in_use->is_error()' failed in TABLE::update_virtual_field · f1f14c20
      Aleksey Midenkov authored
      update_virtual_field() is called as part of index rebuild in
      ha_myisam::repair() (MDEV-5800) which is done on bulk INSERT finish.
      
      Assertion in update_virtual_field() was put as part of MDEV-16222
      because update_virtual_field() returns in_use->is_error(). The idea:
      wrongly mixed semantics of error status before update_virtual_field()
      and the status returned by update_virtual_field(). The former can
      falsely influence the latter.
      f1f14c20