mirror of
https://github.com/MariaDB/server.git
synced 2025-12-10 19:44:09 +03:00
- BUG#22306: STOP INSTANCE can not be applied for instances in Crashed,
Failed and Abandoned;
- BUG#23476: DROP INSTANCE does not work
- BUG#23215: STOP INSTANCE takes too much time
BUG#22306:
The problem was that STOP INSTANCE checked that mysqld is up and running.
If it was not so, STOP INSTANCE reported an error. Now, STOP INSTANCE
reports an error if the instance has been started (mysqld can be down).
BUG#23476:
The problem was that DROP INSTANCE tried to stop inactive instance. The fix is
trivial.
BUG#23215:
The problem was that locks were not acquired properly, so the
instance-monitoring thread could not acquire the mutex, holded by the
query-processing thread.
The fix is to simplify locking scheme by moving instance-related information to
Instance-class out of Guardian-class. This allows to get rid of storing a
separate list of Instance-information in Guardian and keeping it synchronized
with the original list in Instance_map.
server-tools/instance-manager/commands.cc:
1. Introduce Instance_cmd class -- base class for the commands
that deal with the one instance;
2. Remove Instance_map argument from command constructors;
3. Ensure, that Instance Map and Instance are locked in the proper order;
4. Polishing.
server-tools/instance-manager/commands.h:
1. Introduce Instance_cmd class -- base class for the commands
that deal with the one instance;
2. Remove Instance_map argument from command constructors;
3. Polishing.
server-tools/instance-manager/guardian.cc:
1. Move "extended" instance information to the Instance-class.
That allows to get rid of storing instance-related container and data in
Guardian class, that significantly simplifies locking schema.
2. Polishing.
server-tools/instance-manager/guardian.h:
1. Move "extended" instance information to the Instance-class.
That allows to get rid of storing instance-related container and data in
Guardian class, that significantly simplifies locking schema.
2. Polishing.
server-tools/instance-manager/instance.cc:
1. Move "extended" instance information to the Instance-class.
2. Introduce new state STOPPED to mark that guarded instance
is stopped and should not be restarted by Guardian.
3. Polishing.
server-tools/instance-manager/instance.h:
1. Move "extended" instance information to the Instance-class.
2. Introduce new state STOPPED to mark that guarded instance
is stopped and should not be restarted by Guardian.
3. Polishing.
server-tools/instance-manager/instance_map.cc:
1. Move flush_instances() from Instance_map to Manager.
2. Polishing.
server-tools/instance-manager/instance_map.h:
1. Move flush_instances() from Instance_map to Manager.
2. Polishing.
server-tools/instance-manager/instance_options.h:
Polishing.
server-tools/instance-manager/manager.cc:
1. Move flush_instances() from Instance_map to Manager.
2. Polishing.
server-tools/instance-manager/manager.h:
1. Move flush_instances() from Instance_map to Manager.
2. Polishing.
server-tools/instance-manager/user_map.cc:
Polishing.
104 lines
2.4 KiB
C++
104 lines
2.4 KiB
C++
#ifndef INCLUDES_MYSQL_INSTANCE_MANAGER_INSTANCE_MAP_H
|
|
#define INCLUDES_MYSQL_INSTANCE_MANAGER_INSTANCE_MAP_H
|
|
/* Copyright (C) 2004 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#include <my_global.h>
|
|
#include <my_sys.h>
|
|
#include <m_string.h>
|
|
#include <hash.h>
|
|
|
|
#if defined(__GNUC__) && defined(USE_PRAGMA_INTERFACE)
|
|
#pragma interface
|
|
#endif
|
|
|
|
class Guardian;
|
|
class Instance;
|
|
class Named_value_arr;
|
|
class Thread_registry;
|
|
|
|
extern int load_all_groups(char ***groups, const char *filename);
|
|
extern void free_groups(char **groups);
|
|
|
|
extern int create_instance_in_file(const LEX_STRING *instance_name,
|
|
const Named_value_arr *options);
|
|
|
|
|
|
/**
|
|
Instance_map - stores all existing instances
|
|
*/
|
|
|
|
class Instance_map
|
|
{
|
|
public:
|
|
/**
|
|
Instance_map iterator
|
|
*/
|
|
|
|
class Iterator
|
|
{
|
|
private:
|
|
uint current_instance;
|
|
Instance_map *instance_map;
|
|
public:
|
|
Iterator(Instance_map *instance_map_arg) :
|
|
current_instance(0), instance_map(instance_map_arg)
|
|
{}
|
|
|
|
void go_to_first();
|
|
Instance *next();
|
|
};
|
|
|
|
public:
|
|
Instance *find(const LEX_STRING *name);
|
|
|
|
bool is_there_active_instance();
|
|
|
|
void lock();
|
|
void unlock();
|
|
|
|
bool init();
|
|
bool reset();
|
|
|
|
int load();
|
|
|
|
int process_one_option(const LEX_STRING *group, const char *option);
|
|
|
|
int add_instance(Instance *instance);
|
|
|
|
int remove_instance(Instance *instance);
|
|
|
|
int create_instance(const LEX_STRING *instance_name,
|
|
const Named_value_arr *options);
|
|
|
|
public:
|
|
Instance_map();
|
|
~Instance_map();
|
|
|
|
private:
|
|
bool complete_initialization();
|
|
|
|
private:
|
|
enum { START_HASH_SIZE = 16 };
|
|
pthread_mutex_t LOCK_instance_map;
|
|
HASH hash;
|
|
|
|
private:
|
|
friend class Iterator;
|
|
};
|
|
|
|
#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_INSTANCE_MAP_H */
|