82
84
* TransactionLog::FLUSH_FREQUENCY_EVERY_WRITE == 1 ... sync on every write
83
85
* TransactionLog::FLUSH_FREQUENCY_EVERY_SECOND == 2 ... sync at most once a second
85
typedef constrained_check<uint32_t, 2, 0> flush_constraint;
86
static flush_constraint sysvar_transaction_log_flush_frequency;
87
static uint32_t sysvar_transaction_log_flush_frequency= 0;
88
89
* Transaction Log plugin system variable - Number of slots to create
89
90
* for managing write buffers
91
typedef constrained_check<uint32_t, 8192, 4> write_buffers_constraint;
92
static write_buffers_constraint sysvar_transaction_log_num_write_buffers;
92
static uint32_t sysvar_transaction_log_num_write_buffers= 8;
94
94
* Transaction Log plugin system variable - The name of the replicator plugin
95
95
* to pair the transaction log's applier with. Defaults to "default"
97
97
static const char DEFAULT_USE_REPLICATOR[]= "default";
98
static string sysvar_transaction_log_use_replicator;
98
static char *sysvar_transaction_log_use_replicator= (char *)DEFAULT_USE_REPLICATOR;
100
100
/** DATA_DICTIONARY views */
101
101
static TransactionLogTool *transaction_log_tool;
121
121
(void) close(log_file);
125
static void set_truncate_debug(Session *, sql_var_t)
129
if (sysvar_transaction_log_truncate_debug)
131
transaction_log->truncate();
132
transaction_log_index->clear();
133
sysvar_transaction_log_truncate_debug= false;
124
/* These get strdup'd below */
125
free(sysvar_transaction_log_file);
126
free(sysvar_transaction_log_use_replicator);
138
129
static int init(drizzled::module::Context &context)
140
context.registerVariable(new sys_var_bool_ptr_readonly("enable",
141
&sysvar_transaction_log_enabled));
142
context.registerVariable(new sys_var_bool_ptr("truncate-debug",
143
&sysvar_transaction_log_truncate_debug,
144
set_truncate_debug));
146
context.registerVariable(new sys_var_const_string("file",
147
sysvar_transaction_log_file));
148
context.registerVariable(new sys_var_const_string("use-replicator",
149
sysvar_transaction_log_use_replicator));
150
context.registerVariable(new sys_var_bool_ptr_readonly("enable-checksum",
151
&sysvar_transaction_log_checksum_enabled));
152
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("flush-frequency", sysvar_transaction_log_flush_frequency));
154
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("num-write-buffers",
155
sysvar_transaction_log_num_write_buffers));
131
const module::option_map &vm= context.getOptions();
133
if (vm.count("flush-frequency"))
135
if (sysvar_transaction_log_flush_frequency > 2)
137
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for sync-method\n"));
142
if (vm.count("num-write-buffers"))
144
if (sysvar_transaction_log_num_write_buffers < 4 || sysvar_transaction_log_num_write_buffers > 8192)
146
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for num-write-buffers\n"));
158
152
/* Create and initialize the transaction log itself */
159
153
if (sysvar_transaction_log_enabled)
155
if (vm.count("file"))
157
sysvar_transaction_log_file= strdup(vm["file"].as<string>().c_str());
161
sysvar_transaction_log_file= strdup(DEFAULT_LOG_FILE_PATH);
162
transaction_log= new (nothrow) TransactionLog(sysvar_transaction_log_file,
163
static_cast<int>(sysvar_transaction_log_flush_frequency),
164
if (vm.count("use-replicator"))
166
sysvar_transaction_log_use_replicator= strdup(vm["use-replicator"].as<string>().c_str());
170
sysvar_transaction_log_use_replicator= strdup(DEFAULT_USE_REPLICATOR);
172
transaction_log= new (nothrow) TransactionLog(string(sysvar_transaction_log_file),
173
sysvar_transaction_log_flush_frequency,
164
174
sysvar_transaction_log_checksum_enabled);
166
176
if (transaction_log == NULL)
168
sql_perror(_("Failed to allocate the TransactionLog instance"), sysvar_transaction_log_file);
178
char errmsg[STRERROR_MAX];
179
strerror_r(errno, errmsg, sizeof(errmsg));
180
errmsg_printf(ERRMSG_LVL_ERROR, _("Failed to allocate the TransactionLog instance. Got error: %s\n"),
201
217
transaction_log_applier= new (nothrow) TransactionLogApplier("transaction_log_applier",
203
219
transaction_log_index,
204
static_cast<uint32_t>(sysvar_transaction_log_num_write_buffers));
220
sysvar_transaction_log_num_write_buffers);
205
221
if (transaction_log_applier == NULL)
207
sql_perror(_("Failed to allocate the TransactionLogApplier instance"), sysvar_transaction_log_file);
223
char errmsg[STRERROR_MAX];
224
strerror_r(errno, errmsg, sizeof(errmsg));
225
errmsg_printf(ERRMSG_LVL_ERROR, _("Failed to allocate the TransactionLogApplier instance. Got error: %s\n"),
210
229
context.add(transaction_log_applier);
211
230
ReplicationServices &replication_services= ReplicationServices::singleton();
212
replication_services.attachApplier(transaction_log_applier,
213
sysvar_transaction_log_use_replicator);
231
string replicator_name(sysvar_transaction_log_use_replicator);
232
replication_services.attachApplier(transaction_log_applier, replicator_name);
215
234
/* Setup DATA_DICTIONARY views */
229
248
hexdump_transaction_message_func_factory=
230
249
new plugin::Create_function<HexdumpTransactionMessageFunction>("hexdump_transaction_message");
231
250
context.add(hexdump_transaction_message_func_factory);
253
* Setup the background worker thread which maintains
254
* summary information about the transaction log.
256
if (initTransactionLogBackgroundWorker())
257
return 1; /* Error message output handled in function above */
263
static void set_truncate_debug(Session *,
269
* The const void * save comes directly from the check function,
270
* which should simply return the result from the set statement.
274
if (*(bool *)save != false)
276
transaction_log->truncate();
277
transaction_log_index->clear();
282
static DRIZZLE_SYSVAR_BOOL(enable,
283
sysvar_transaction_log_enabled,
284
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
285
N_("Enable transaction log"),
286
NULL, /* check func */
287
NULL, /* update func */
288
false /* default */);
290
static DRIZZLE_SYSVAR_BOOL(truncate_debug,
291
sysvar_transaction_log_truncate_debug,
293
N_("DEBUGGING - Truncate transaction log"),
294
NULL, /* check func */
295
set_truncate_debug, /* update func */
296
false /* default */);
298
static DRIZZLE_SYSVAR_STR(file,
299
sysvar_transaction_log_file,
301
N_("Path to the file to use for transaction log"),
302
NULL, /* check func */
303
NULL, /* update func*/
304
DEFAULT_LOG_FILE_PATH /* default */);
306
static DRIZZLE_SYSVAR_STR(use_replicator,
307
sysvar_transaction_log_use_replicator,
309
N_("Name of the replicator plugin to use (default='default_replicator')"),
310
NULL, /* check func */
311
NULL, /* update func*/
312
DEFAULT_USE_REPLICATOR /* default */);
314
static DRIZZLE_SYSVAR_BOOL(enable_checksum,
315
sysvar_transaction_log_checksum_enabled,
317
N_("Enable CRC32 Checksumming of each written transaction log entry"),
318
NULL, /* check func */
319
NULL, /* update func */
320
false /* default */);
322
static DRIZZLE_SYSVAR_UINT(flush_frequency,
323
sysvar_transaction_log_flush_frequency,
325
N_("0 == rely on operating system to sync log file (default), "
326
"1 == sync file at each transaction write, "
327
"2 == sync log file once per second"),
328
NULL, /* check func */
329
NULL, /* update func */
335
static DRIZZLE_SYSVAR_UINT(num_write_buffers,
336
sysvar_transaction_log_num_write_buffers,
338
N_("Number of slots for in-memory write buffers (default=8)."),
339
NULL, /* check func */
340
NULL, /* update func */
237
346
static void init_options(drizzled::module::option_context &context)
239
348
context("truncate-debug",
240
349
po::value<bool>(&sysvar_transaction_log_truncate_debug)->default_value(false)->zero_tokens(),
241
_("DEBUGGING - Truncate transaction log"));
350
N_("DEBUGGING - Truncate transaction log"));
242
351
context("enable-checksum",
243
352
po::value<bool>(&sysvar_transaction_log_checksum_enabled)->default_value(false)->zero_tokens(),
244
_("Enable CRC32 Checksumming of each written transaction log entry"));
353
N_("Enable CRC32 Checksumming of each written transaction log entry"));
245
354
context("enable",
246
355
po::value<bool>(&sysvar_transaction_log_enabled)->default_value(false)->zero_tokens(),
247
_("Enable transaction log"));
356
N_("Enable transaction log"));
249
po::value<string>(&sysvar_transaction_log_file)->default_value(DEFAULT_LOG_FILE_PATH),
250
_("Path to the file to use for transaction log"));
359
N_("Path to the file to use for transaction log"));
251
360
context("use-replicator",
252
po::value<string>(&sysvar_transaction_log_use_replicator)->default_value(DEFAULT_USE_REPLICATOR),
253
_("Name of the replicator plugin to use (default='default_replicator')"));
362
N_("Name of the replicator plugin to use (default='default_replicator')"));
254
363
context("flush-frequency",
255
po::value<flush_constraint>(&sysvar_transaction_log_flush_frequency)->default_value(0),
256
_("0 == rely on operating system to sync log file (default), 1 == sync file at each transaction write, 2 == sync log file once per second"));
364
po::value<uint32_t>(&sysvar_transaction_log_flush_frequency)->default_value(0),
365
N_("0 == rely on operating system to sync log file (default), 1 == sync file at each transaction write, 2 == sync log file once per second"));
257
366
context("num-write-buffers",
258
po::value<write_buffers_constraint>(&sysvar_transaction_log_num_write_buffers)->default_value(8),
259
_("Number of slots for in-memory write buffers (default=8)."));
367
po::value<uint32_t>(&sysvar_transaction_log_num_write_buffers)->default_value(8),
368
N_("Number of slots for in-memory write buffers (default=8)."));
262
DRIZZLE_PLUGIN(init, NULL, init_options);
371
static drizzle_sys_var* sys_variables[]= {
372
DRIZZLE_SYSVAR(enable),
373
DRIZZLE_SYSVAR(truncate_debug),
374
DRIZZLE_SYSVAR(file),
375
DRIZZLE_SYSVAR(enable_checksum),
376
DRIZZLE_SYSVAR(flush_frequency),
377
DRIZZLE_SYSVAR(num_write_buffers),
378
DRIZZLE_SYSVAR(use_replicator),
382
DRIZZLE_PLUGIN(init, sys_variables, init_options);