summaryrefslogtreecommitdiff
path: root/server-tools/instance-manager/instance_map.h
blob: 69d225c89f73b6d8285b82c7ee37417fbf9545db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#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();
  };
  friend class Iterator;
public:
  /*
    Return a pointer to the instance or NULL, if there is no such instance.
    MT-NOTE: must be called under acquired lock.
  */
  Instance *find(const LEX_STRING *name);

  /* Clear the configuration cache and reload the configuration file. */
  int flush_instances();

  /* The operation is used to check if there is an active instance or not. */
  bool is_there_active_instance();

  void lock();
  void unlock();

  bool init();

  /*
    Process a given option and assign it to appropricate instance. This is
    required for the option handler, passed to my_search_option_files().
  */
  int process_one_option(const LEX_STRING *group, const char *option);

  /*
    Add an instance into the internal hash.

    MT-NOTE: the operation must be called under acquired lock.
  */
  int add_instance(Instance *instance);

  /*
    Remove instance from the internal hash.

    MT-NOTE: the operation must be called under acquired lock.
  */
  int remove_instance(Instance *instance);

  /*
    Create a new instance and register it in the internal hash.

    MT-NOTE: the operation must be called under acquired lock.
  */
  int create_instance(const LEX_STRING *instance_name,
                      const Named_value_arr *options);

  Instance_map();
  ~Instance_map();

  /*
    Retrieve client state name of the given instance.

    MT-NOTE: the options must be called under acquired locks of the following
    objects:
      - Instance_map;
      - Guardian;
  */
  const char *get_instance_state_name(Instance *instance);

public:
  const char *mysqld_path;
  Guardian *guardian;

private:
  /* loads options from config files */
  int load();
  /* inits instances argv's after all options have been loaded */
  bool complete_initialization();
private:
  enum { START_HASH_SIZE = 16 };
  pthread_mutex_t LOCK_instance_map;
  HASH hash;
};

#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_INSTANCE_MAP_H */