[Commits] 7dce9f7: MDEV-7867: Add binlog header to GRA_.log file

Nirbhay Choubey nirbhay at mariadb.com
Sun Mar 29 00:55:02 EET 2015


revision-id: 7dce9f708e97a2b370875e2d75519488795d21f5
parent(s): 324cd36bd2950b88bc4ef84c436ca3aa5428be72
committer: Nirbhay Choubey
branch nick: 10.1_gra_log
timestamp: 2015-03-28 18:54:58 -0400
message:

MDEV-7867: Add binlog header to GRA_.log file

---
 sql/wsrep_applier.cc | 10 ++++-----
 sql/wsrep_applier.h  |  3 +++
 sql/wsrep_binlog.cc  | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 sql/wsrep_binlog.h   |  7 +++---
 sql/wsrep_mysqld.cc  | 10 +++++++++
 sql/wsrep_mysqld.h   |  2 ++
 6 files changed, 84 insertions(+), 10 deletions(-)

diff --git a/sql/wsrep_applier.cc b/sql/wsrep_applier.cc
index 23687e9..93ecf91 100644
--- a/sql/wsrep_applier.cc
+++ b/sql/wsrep_applier.cc
@@ -14,7 +14,7 @@
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
 
 #include "wsrep_priv.h"
-#include "wsrep_binlog.h" // wsrep_dump_rbr_buf()
+#include "wsrep_binlog.h"
 
 #include "log_event.h" // EVENT_LEN_OFFSET, etc.
 #include "wsrep_applier.h"
@@ -62,8 +62,7 @@ static Log_event* wsrep_read_log_event(
 #include "rpl_rli.h"     // class Relay_log_info;
 #include "sql_base.h"    // close_temporary_table()
 
-static inline void
-wsrep_set_apply_format(THD* thd, Format_description_log_event* ev)
+void wsrep_set_apply_format(THD* thd, Format_description_log_event* ev)
 {
   if (thd->wsrep_apply_format)
   {
@@ -72,8 +71,7 @@ static Log_event* wsrep_read_log_event(
   thd->wsrep_apply_format= ev;
 }
 
-static inline Format_description_log_event*
-wsrep_get_apply_format(THD* thd)
+Format_description_log_event* wsrep_get_apply_format(THD* thd)
 {
   if (thd->wsrep_apply_format)
       return (Format_description_log_event*) thd->wsrep_apply_format;
@@ -259,7 +257,7 @@ wsrep_cb_status_t wsrep_apply_cb(void* const             ctx,
 
   if (WSREP_CB_SUCCESS != rcode)
   {
-    wsrep_dump_rbr_buf(thd, buf, buf_len);
+    wsrep_dump_rbr_buf_with_header(thd, buf, buf_len);
   }
 
   TABLE *tmp;
diff --git a/sql/wsrep_applier.h b/sql/wsrep_applier.h
index 816970d..c3892e2 100644
--- a/sql/wsrep_applier.h
+++ b/sql/wsrep_applier.h
@@ -18,6 +18,9 @@
 
 #include <sys/types.h>
 
+void wsrep_set_apply_format(THD* thd, Format_description_log_event* ev);
+Format_description_log_event* wsrep_get_apply_format(THD* thd);
+
 /* wsrep callback prototypes */
 
 wsrep_cb_status_t wsrep_apply_cb(void *ctx,
diff --git a/sql/wsrep_binlog.cc b/sql/wsrep_binlog.cc
index ee8a9cb..f37d9e0 100644
--- a/sql/wsrep_binlog.cc
+++ b/sql/wsrep_binlog.cc
@@ -16,6 +16,8 @@
 #include "wsrep_binlog.h"
 #include "wsrep_priv.h"
 #include "log.h"
+#include "log_event.h"
+#include "wsrep_applier.h"
 
 extern handlerton *binlog_hton;
 /*
@@ -212,7 +214,10 @@ static int wsrep_write_cache_once(wsrep_t*  const wsrep,
         WSREP_ERROR("failed to reinitialize io-cache");
     }
 
-    if (unlikely(WSREP_OK != err)) wsrep_dump_rbr_buf(thd, buf, used);
+    if (unlikely(WSREP_OK != err))
+    {
+      wsrep_dump_rbr_buf_with_header(thd, buf, used);
+    }
 
     my_free(heap_buf);
     return err;
@@ -352,6 +357,7 @@ int wsrep_binlog_savepoint_rollback(THD *thd, void *sv)
   return rcode;
 }
 
+#if 0
 void wsrep_dump_rbr_direct(THD* thd, IO_CACHE* cache)
 {
   char filename[PATH_MAX]= {0};
@@ -407,8 +413,62 @@ void wsrep_dump_rbr_direct(THD* thd, IO_CACHE* cache)
   // close file
   if (of) fclose(of);
 }
+#endif
 
 void thd_binlog_flush_pending_rows_event(THD *thd, bool stmt_end)
 {
   thd->binlog_flush_pending_rows_event(stmt_end);
 }
+
+/* Dump replication buffer along with header to a file. */
+void wsrep_dump_rbr_buf_with_header(THD *thd, const void *rbr_buf,
+                                    size_t buf_len)
+{
+  char filename[PATH_MAX]= {0};
+  File file;
+  IO_CACHE cache;
+  Format_description_log_event *ev= wsrep_get_apply_format(thd);
+
+  int len= my_snprintf(filename, PATH_MAX, "%s/GRA_%ld_%lld_v2.log",
+                       wsrep_data_home_dir, thd->thread_id,
+                       (long long) wsrep_thd_trx_seqno(thd));
+
+  if (len >= PATH_MAX)
+  {
+    WSREP_ERROR("RBR dump path too long: %d, skipping dump.", len);
+    return;
+  }
+
+  if ((file= mysql_file_open(key_file_wsrep_gra_log, filename,
+                             O_RDWR | O_CREAT | O_BINARY, MYF(MY_WME))) < 0)
+  {
+    WSREP_ERROR("Failed to open file '%s' : %d (%s)",
+                filename, errno, strerror(errno));
+    goto cleanup1;
+  }
+
+  if (init_io_cache(&cache, file, 0, WRITE_CACHE, 0, 0, MYF(MY_WME | MY_NABP)))
+  {
+    mysql_file_close(file, MYF(MY_WME));
+    goto cleanup2;
+  }
+
+  if (my_b_safe_write(&cache, BINLOG_MAGIC, BIN_LOG_HEADER_SIZE))
+  {
+    goto cleanup2;
+  }
+
+  if (ev->write(&cache) || my_b_write(&cache, rbr_buf, buf_len) ||
+      flush_io_cache(&cache))
+  {
+    WSREP_ERROR("Failed to write to '%s'.", filename);
+    goto cleanup2;
+  }
+
+cleanup2:
+  end_io_cache(&cache);
+
+cleanup1:
+  mysql_file_close(file, MYF(MY_WME));
+}
+
diff --git a/sql/wsrep_binlog.h b/sql/wsrep_binlog.h
index a3d8ec6..d8a2eb5 100644
--- a/sql/wsrep_binlog.h
+++ b/sql/wsrep_binlog.h
@@ -49,11 +49,12 @@ int wsrep_write_cache (wsrep_t*  wsrep,
 /* Dump replication buffer to disk without intermediate buffer */
 void wsrep_dump_rbr_direct(THD* thd, IO_CACHE* cache);
 
+/* Dump replication buffer along with header to a file */
+void wsrep_dump_rbr_buf_with_header(THD *thd, const void *rbr_buf,
+                                    size_t buf_len);
+
 int wsrep_binlog_close_connection(THD* thd);
 int wsrep_binlog_savepoint_set(THD *thd,  void *sv);
 int wsrep_binlog_savepoint_rollback(THD *thd, void *sv);
 
-/* Dump replication buffer to disk without intermediate buffer */
-void wsrep_dump_rbr_direct(THD* thd, IO_CACHE* cache);
-
 #endif /* WSREP_BINLOG_H */
diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc
index 599b9be..1430520 100644
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@ -127,6 +127,8 @@
   key_COND_wsrep_replaying, key_COND_wsrep_ready, key_COND_wsrep_sst,
   key_COND_wsrep_sst_init, key_COND_wsrep_sst_thread;
 
+PSI_file_key key_file_wsrep_gra_log;
+
 static PSI_mutex_info wsrep_mutexes[]=
 {
   { &key_LOCK_wsrep_ready, "LOCK_wsrep_ready", PSI_FLAG_GLOBAL},
@@ -151,6 +153,12 @@
   { &key_COND_wsrep_rollback, "COND_wsrep_rollback", PSI_FLAG_GLOBAL},
   { &key_COND_wsrep_replaying, "COND_wsrep_replaying", PSI_FLAG_GLOBAL}
 };
+
+static PSI_file_info wsrep_files[]=
+{
+  { &key_file_wsrep_gra_log, "wsrep_gra_log", 0}
+};
+
 #else
 #define mysql_mutex_register(X,Y,Z)
 #define mysql_cond_register(X,Y,Z)
@@ -607,6 +615,8 @@ int wsrep_init()
   mysql_mutex_init(key_LOCK_wsrep_desync, &LOCK_wsrep_desync, MY_MUTEX_INIT_FAST);
   mysql_mutex_init(key_LOCK_wsrep_config_state, &LOCK_wsrep_config_state, MY_MUTEX_INIT_FAST);
 
+  mysql_file_register("sql", wsrep_files, array_elements(wsrep_files));
+
   wsrep_ready_set(FALSE);
   assert(wsrep_provider);
 
diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h
index a643056..58c6a73 100644
--- a/sql/wsrep_mysqld.h
+++ b/sql/wsrep_mysqld.h
@@ -260,6 +260,8 @@ int  wsrep_show_status(THD *thd, SHOW_VAR *var, char *buff,
 extern PSI_cond_key  key_COND_wsrep_replaying;
 extern PSI_mutex_key key_LOCK_wsrep_slave_threads;
 extern PSI_mutex_key key_LOCK_wsrep_desync;
+
+extern PSI_file_key key_file_wsrep_gra_log;
 #endif /* HAVE_PSI_INTERFACE */
 struct TABLE_LIST;
 int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_,


More information about the commits mailing list