summaryrefslogtreecommitdiff
path: root/server-tools/instance-manager/instance.h
blob: aa9c923cba1d1a0bd618a7ec43911eae9f4bdd18 (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#ifndef INCLUDES_MYSQL_INSTANCE_MANAGER_INSTANCE_H
#define INCLUDES_MYSQL_INSTANCE_MANAGER_INSTANCE_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; version 2 of the License.

   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 <m_string.h>

#include "instance_options.h"
#include "priv.h"

#if defined(__GNUC__) && defined(USE_PRAGMA_INTERFACE)
#pragma interface
#endif

class Instance_map;
class Thread_registry;


/**
  Instance_name -- the class represents instance name -- a string of length
  less than MAX_INSTANCE_NAME_SIZE.

  Generally, this is just a string with self-memory-management and should be
  eliminated in the future.
*/

class Instance_name
{
public:
  Instance_name(const LEX_STRING *name);

public:
  inline const LEX_STRING *get_str() const
  {
    return &str;
  }

  inline const char *get_c_str() const
  {
    return str.str;
  }

  inline uint get_length() const
  {
    return str.length;
  }

private:
  LEX_STRING str;
  char str_buffer[MAX_INSTANCE_NAME_SIZE];
};


class Instance
{
public:
  /* States of an instance. */
  enum enum_instance_state
  {
    STOPPED,
    NOT_STARTED,
    STARTING,
    STARTED,
    JUST_CRASHED,
    CRASHED,
    CRASHED_AND_ABANDONED,
    STOPPING
  };

public:
  /**
    The constant defines name of the default mysqld-instance ("mysqld").
  */
  static const LEX_STRING DFLT_INSTANCE_NAME;

public:
  static bool is_name_valid(const LEX_STRING *name);
  static bool is_mysqld_compatible_name(const LEX_STRING *name);

public:
  Instance();
  ~Instance();

  bool init(const LEX_STRING *name_arg);
  bool complete_initialization();

public:
  bool is_active();

  bool is_mysqld_running();

  bool start_mysqld();
  bool stop_mysqld();
  bool kill_mysqld(int signo);

  void lock();
  void unlock();

  const char *get_state_name();

  void reset_stat();

public:
  /**
    The operation is intended to check if the instance is mysqld-compatible
    or not.
  */
  inline bool is_mysqld_compatible() const;

  /**
    The operation is intended to check if the instance is configured properly
    or not. Misconfigured instances are not managed.
  */
  inline bool is_configured() const;

  /**
    The operation returns TRUE if the instance is guarded and FALSE otherwise.
  */
  inline bool is_guarded() const;

  /**
    The operation returns name of the instance.
  */
  inline const LEX_STRING *get_name() const;

  /**
    The operation returns the current state of the instance.

    NOTE: At the moment should be used only for guarded instances.
  */
  inline enum_instance_state get_state() const;

  /**
    The operation changes the state of the instance.

    NOTE: At the moment should be used only for guarded instances.
    TODO: Make private.
  */
  inline void set_state(enum_instance_state new_state);

  /**
    The operation returns crashed flag.
  */
  inline bool is_crashed();

public:
  /**
    This attributes contains instance options.

    TODO: Make private.
  */
  Instance_options options;

private:
  /**
    monitoring_thread_active is TRUE if there is a thread that monitors the
    corresponding mysqld-process.
  */
  bool monitoring_thread_active;

  /**
    crashed is TRUE when corresponding mysqld-process has been died after
    start.
  */
  bool crashed;

  /**
    configured is TRUE when the instance is configured and FALSE otherwise.
    Misconfigured instances are not managed.
  */
  bool configured;

  /*
    mysqld_compatible specifies whether the instance is mysqld-compatible
    or not. Mysqld-compatible instances can contain only mysqld-specific
    options. At the moment an instance is mysqld-compatible if its name is
    "mysqld".

    The idea is that [mysqld] section should contain only mysqld-specific
    options (no Instance Manager-specific options) to be readable by mysqld
    program.
  */
  bool mysqld_compatible;

  /*
    Mutex protecting the instance.
  */
  pthread_mutex_t LOCK_instance;

private:
  /* Guarded-instance attributes. */

  /* state of an instance (i.e. STARTED, CRASHED, etc.) */
  enum_instance_state state;

public:
  /* the amount of attemts to restart instance (cleaned up at success) */
  int restart_counter;

  /* triggered at a crash */
  time_t crash_moment;

  /* General time field. Used to provide timeouts (at shutdown and restart) */
  time_t last_checked;

private:
  static const char *get_instance_state_name(enum_instance_state state);

private:
  void remove_pid();

  bool wait_for_stop();

private:
  friend class Instance_monitor;
};


inline bool Instance::is_mysqld_compatible() const
{
  return mysqld_compatible;
}


inline bool Instance::is_configured() const
{
  return configured;
}


inline bool Instance::is_guarded() const
{
  return !options.nonguarded;
}


inline const LEX_STRING *Instance::get_name() const
{
  return &options.instance_name;
}


inline Instance::enum_instance_state Instance::get_state() const
{
  return state;
}


inline void Instance::set_state(enum_instance_state new_state)
{
  state= new_state;
}


inline bool Instance::is_crashed()
{
  return crashed;
}

#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_INSTANCE_H */