Commit ccd534c3 authored by Kristofer Pettersson's avatar Kristofer Pettersson
Browse files

Bug#21226 FLUSH PRIVILEGES does not provided feedback when it fails.

  
If during a FLUSH PRIVILEGES the server fails to load the new privilege
tables, the error message is lost. This patch is a back port from 5.1 which
adresses this issue by setting the server in an error state if a failure
occurrs.
  
This patch also corrects an incorrect variable assignment which might
cause an error state to be reverted by coincidence.
parent 889a669f
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -7054,11 +7054,23 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
      thd->thread_stack= (char*) &tmp_thd;
      thd->store_globals();
    }
    
    if (thd)
    {
      (void)acl_reload(thd);
      (void)grant_reload(thd);
      bool reload_acl_failed= acl_reload(thd);
      bool reload_grants_failed= grant_reload(thd);

      if (reload_acl_failed || reload_grants_failed)
      {
        result= 1;
        /*
          When an error is returned, my_message may have not been called and
          the client will hang waiting for a response.
        */
        my_error(ER_UNKNOWN_ERROR, MYF(0), "FLUSH PRIVILEGES failed");
      }
    }

    if (tmp_thd)
    {
      delete tmp_thd;
@@ -7144,8 +7156,10 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
      tmp_write_to_binlog= 0;
      if (lock_global_read_lock(thd))
	return 1;                               // Killed
      result=close_cached_tables(thd,(options & REFRESH_FAST) ? 0 : 1,
                                 tables);
      if (close_cached_tables(thd,(options & REFRESH_FAST) ? 0 : 1,
                                 tables))
          result= 1;
      
      if (make_global_read_lock_block_commit(thd)) // Killed
      {
        /* Don't leave things in a half-locked state */
@@ -7154,7 +7168,10 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
      }
    }
    else
      result=close_cached_tables(thd,(options & REFRESH_FAST) ? 0 : 1, tables);
    {
      if (close_cached_tables(thd,(options & REFRESH_FAST) ? 0 : 1, tables))
        result= 1;
    }
    my_dbopt_cleanup();
  }
  if (options & REFRESH_HOSTS)
@@ -7178,8 +7195,8 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
#ifdef OPENSSL
   if (options & REFRESH_DES_KEY_FILE)
   {
     if (des_key_file)
       result=load_des_key_file(des_key_file);
     if (des_key_file && load_des_key_file(des_key_file))
         result= 1;
   }
#endif
#ifdef HAVE_REPLICATION