Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00033 #include <config.h>
00034
00035 #include "transaction_log.h"
00036 #include "transaction_log_applier.h"
00037 #include "transaction_log_index.h"
00038 #include "data_dictionary_schema.h"
00039 #include "print_transaction_message.h"
00040 #include "hexdump_transaction_message.h"
00041
00042 #include <errno.h>
00043
00044 #include <drizzled/plugin/plugin.h>
00045 #include <drizzled/session.h>
00046 #include <drizzled/gettext.h>
00047 #include <boost/program_options.hpp>
00048 #include <drizzled/module/option_map.h>
00049 #include <drizzled/plugin/function.h>
00050
00051 namespace po= boost::program_options;
00052 using namespace std;
00053 using namespace drizzled;
00054
00059 static const char DEFAULT_LOG_FILE_PATH[]= "transaction.log";
00063 static bool sysvar_transaction_log_enabled= false;
00064
00066 static string sysvar_transaction_log_file;
00067
00072 static bool sysvar_transaction_log_truncate_debug= false;
00077 static bool sysvar_transaction_log_checksum_enabled= false;
00086 typedef constrained_check<uint32_t, 2, 0> flush_constraint;
00087 static flush_constraint sysvar_transaction_log_flush_frequency;
00092 typedef constrained_check<uint32_t, 8192, 4> write_buffers_constraint;
00093 static write_buffers_constraint sysvar_transaction_log_num_write_buffers;
00098 static const char DEFAULT_USE_REPLICATOR[]= "default";
00099 static string sysvar_transaction_log_use_replicator;
00100
00102 static TransactionLogTool *transaction_log_tool;
00103 static TransactionLogEntriesTool *transaction_log_entries_tool;
00104 static TransactionLogTransactionsTool *transaction_log_transactions_tool;
00105
00107 extern TransactionLogIndex *transaction_log_index;
00109 extern TransactionLog *transaction_log;
00111 extern TransactionLogApplier *transaction_log_applier;
00112
00114 extern plugin::Create_function<PrintTransactionMessageFunction> *print_transaction_message_func_factory;
00115 extern plugin::Create_function<HexdumpTransactionMessageFunction> *hexdump_transaction_message_func_factory;
00116
00117 TransactionLog::~TransactionLog()
00118 {
00119
00120 if (log_file != -1)
00121 {
00122 (void) close(log_file);
00123 }
00124 }
00125
00126 static void set_truncate_debug(Session *, sql_var_t)
00127 {
00128 if (transaction_log)
00129 {
00130 if (sysvar_transaction_log_truncate_debug)
00131 {
00132 transaction_log->truncate();
00133 transaction_log_index->clear();
00134 sysvar_transaction_log_truncate_debug= false;
00135 }
00136 }
00137 }
00138
00139 static int init(drizzled::module::Context &context)
00140 {
00141 context.registerVariable(new sys_var_bool_ptr_readonly("enable",
00142 &sysvar_transaction_log_enabled));
00143 context.registerVariable(new sys_var_bool_ptr("truncate-debug",
00144 &sysvar_transaction_log_truncate_debug,
00145 set_truncate_debug));
00146
00147 context.registerVariable(new sys_var_const_string("file",
00148 sysvar_transaction_log_file));
00149 context.registerVariable(new sys_var_const_string("use-replicator",
00150 sysvar_transaction_log_use_replicator));
00151 context.registerVariable(new sys_var_bool_ptr_readonly("enable-checksum",
00152 &sysvar_transaction_log_checksum_enabled));
00153 context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("flush-frequency", sysvar_transaction_log_flush_frequency));
00154
00155 context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("num-write-buffers",
00156 sysvar_transaction_log_num_write_buffers));
00157
00158
00159
00160 if (sysvar_transaction_log_enabled)
00161 {
00162
00163 transaction_log= new TransactionLog(sysvar_transaction_log_file,
00164 static_cast<int>(sysvar_transaction_log_flush_frequency),
00165 sysvar_transaction_log_checksum_enabled);
00166
00167 if (transaction_log == NULL)
00168 {
00169 sql_perror(_("Failed to allocate the TransactionLog instance"), sysvar_transaction_log_file);
00170 return 1;
00171 }
00172 else
00173 {
00174
00175 if (transaction_log->hasError())
00176 {
00177 errmsg_printf(error::ERROR, _("Failed to initialize the Transaction Log. Got error: %s\n"),
00178 transaction_log->getErrorMessage().c_str());
00179 return 1;
00180 }
00181 }
00182
00183
00184 transaction_log_index= new TransactionLogIndex(*transaction_log);
00185
00186 if (transaction_log_index->hasError())
00187 {
00188 errmsg_printf(error::ERROR, _("Failed to initialize the Transaction Log Index. Got error: %s\n"),
00189 transaction_log_index->getErrorMessage().c_str());
00190 return 1;
00191 }
00192
00193
00194 transaction_log_applier= new TransactionLogApplier("transaction_log_applier",
00195 transaction_log,
00196 transaction_log_index,
00197 static_cast<uint32_t>(sysvar_transaction_log_num_write_buffers));
00198 context.add(transaction_log_applier);
00199 ReplicationServices::attachApplier(transaction_log_applier, sysvar_transaction_log_use_replicator);
00200
00201
00202
00203 transaction_log_tool= new TransactionLogTool;
00204 context.add(transaction_log_tool);
00205 transaction_log_entries_tool= new TransactionLogEntriesTool;
00206 context.add(transaction_log_entries_tool);
00207 transaction_log_transactions_tool= new TransactionLogTransactionsTool;
00208 context.add(transaction_log_transactions_tool);
00209
00210
00211 print_transaction_message_func_factory=
00212 new plugin::Create_function<PrintTransactionMessageFunction>("print_transaction_message");
00213 context.add(print_transaction_message_func_factory);
00214
00215 hexdump_transaction_message_func_factory=
00216 new plugin::Create_function<HexdumpTransactionMessageFunction>("hexdump_transaction_message");
00217 context.add(hexdump_transaction_message_func_factory);
00218 }
00219 return 0;
00220 }
00221
00222
00223 static void init_options(drizzled::module::option_context &context)
00224 {
00225 context("truncate-debug",
00226 po::value<bool>(&sysvar_transaction_log_truncate_debug)->default_value(false)->zero_tokens(),
00227 _("DEBUGGING - Truncate transaction log"));
00228 context("enable-checksum",
00229 po::value<bool>(&sysvar_transaction_log_checksum_enabled)->default_value(false)->zero_tokens(),
00230 _("Enable CRC32 Checksumming of each written transaction log entry"));
00231 context("enable",
00232 po::value<bool>(&sysvar_transaction_log_enabled)->default_value(false)->zero_tokens(),
00233 _("Enable transaction log"));
00234 context("file",
00235 po::value<string>(&sysvar_transaction_log_file)->default_value(DEFAULT_LOG_FILE_PATH),
00236 _("Path to the file to use for transaction log"));
00237 context("use-replicator",
00238 po::value<string>(&sysvar_transaction_log_use_replicator)->default_value(DEFAULT_USE_REPLICATOR),
00239 _("Name of the replicator plugin to use (default='default_replicator')"));
00240 context("flush-frequency",
00241 po::value<flush_constraint>(&sysvar_transaction_log_flush_frequency)->default_value(0),
00242 _("0 == rely on operating system to sync log file (default), 1 == sync file at each transaction write, 2 == sync log file once per second"));
00243 context("num-write-buffers",
00244 po::value<write_buffers_constraint>(&sysvar_transaction_log_num_write_buffers)->default_value(8),
00245 _("Number of slots for in-memory write buffers (default=8)."));
00246 }
00247
00248 DRIZZLE_PLUGIN(init, NULL, init_options);