Commit 92425513 authored by unknown's avatar unknown

InnoDB: Remove log debug code when UNIV_LOG_DEBUG is not defined


innobase/include/log0log.h:
  Remove debug variables unless #ifdef UNIV_LOG_DEBUG
innobase/include/log0log.ic:
  Remove log_check_log_recs() unless #ifdef UNIV_LOG_DEBUG
innobase/log/log0log.c:
  Remove log_debug_writes unless #ifdef UNIV_LOG_DEBUG
  log_io_complete_checkpoint(): Remove parameter; move debug output to log_io_complete(), the only caller
  Test log_debug_writes only #ifdef UNIV_LOG_DEBUG
innobase/log/log0recv.c:
  Test log_debug_writes only #ifdef UNIV_LOG_DEBUG
parent e9eb0239
...@@ -18,7 +18,9 @@ typedef struct log_struct log_t; ...@@ -18,7 +18,9 @@ typedef struct log_struct log_t;
typedef struct log_group_struct log_group_t; typedef struct log_group_struct log_group_t;
extern ibool log_do_write; extern ibool log_do_write;
#ifdef UNIV_LOG_DEBUG
extern ibool log_debug_writes; extern ibool log_debug_writes;
#endif /* UNIV_LOG_DEBUG */
/* Wait modes for log_write_up_to */ /* Wait modes for log_write_up_to */
#define LOG_NO_WAIT 91 #define LOG_NO_WAIT 91
...@@ -713,11 +715,13 @@ struct log_struct{ ...@@ -713,11 +715,13 @@ struct log_struct{
ulint max_buf_free; /* recommended maximum value of ulint max_buf_free; /* recommended maximum value of
buf_free, after which the buffer is buf_free, after which the buffer is
flushed */ flushed */
#ifdef UNIV_LOG_DEBUG
ulint old_buf_free; /* value of buf free when log was ulint old_buf_free; /* value of buf free when log was
last time opened; only in the debug last time opened; only in the debug
version */ version */
dulint old_lsn; /* value of lsn when log was last time dulint old_lsn; /* value of lsn when log was last time
opened; only in the debug version */ opened; only in the debug version */
#endif /* UNIV_LOG_DEBUG */
ibool check_flush_or_checkpoint; ibool check_flush_or_checkpoint;
/* this is set to TRUE when there may /* this is set to TRUE when there may
be need to flush the log buffer, or be need to flush the log buffer, or
......
...@@ -10,6 +10,7 @@ Created 12/9/1995 Heikki Tuuri ...@@ -10,6 +10,7 @@ Created 12/9/1995 Heikki Tuuri
#include "mach0data.h" #include "mach0data.h"
#include "mtr0mtr.h" #include "mtr0mtr.h"
#ifdef UNIV_LOG_DEBUG
/********************************************************** /**********************************************************
Checks by parsing that the catenated log segment for a single mtr is Checks by parsing that the catenated log segment for a single mtr is
consistent. */ consistent. */
...@@ -21,6 +22,7 @@ log_check_log_recs( ...@@ -21,6 +22,7 @@ log_check_log_recs(
in the log_sys->buf log buffer */ in the log_sys->buf log buffer */
ulint len, /* in: segment length in bytes */ ulint len, /* in: segment length in bytes */
dulint buf_start_lsn); /* in: buffer start lsn */ dulint buf_start_lsn); /* in: buffer start lsn */
#endif /* UNIV_LOG_DEBUG */
/**************************************************************** /****************************************************************
Gets a log block flush bit. */ Gets a log block flush bit. */
......
...@@ -31,7 +31,9 @@ ulint log_fsp_current_free_limit = 0; ...@@ -31,7 +31,9 @@ ulint log_fsp_current_free_limit = 0;
log_t* log_sys = NULL; log_t* log_sys = NULL;
ibool log_do_write = TRUE; ibool log_do_write = TRUE;
#ifdef UNIV_LOG_DEBUG
ibool log_debug_writes = FALSE; ibool log_debug_writes = FALSE;
#endif /* UNIV_LOG_DEBUG */
/* These control how often we print warnings if the last checkpoint is too /* These control how often we print warnings if the last checkpoint is too
old */ old */
...@@ -85,9 +87,8 @@ the previous */ ...@@ -85,9 +87,8 @@ the previous */
Completes a checkpoint write i/o to a log file. */ Completes a checkpoint write i/o to a log file. */
static static
void void
log_io_complete_checkpoint( log_io_complete_checkpoint(void);
/*=======================*/ /*============================*/
log_group_t* group); /* in: log group */
/********************************************************** /**********************************************************
Completes an archiving i/o. */ Completes an archiving i/o. */
static static
...@@ -931,10 +932,11 @@ log_group_check_flush_completion( ...@@ -931,10 +932,11 @@ log_group_check_flush_completion(
#endif /* UNIV_SYNC_DEBUG */ #endif /* UNIV_SYNC_DEBUG */
if (!log_sys->one_flushed && group->n_pending_writes == 0) { if (!log_sys->one_flushed && group->n_pending_writes == 0) {
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf("Log flushed first to group %lu\n", group->id); printf("Log flushed first to group %lu\n", group->id);
} }
#endif /* UNIV_LOG_DEBUG */
log_sys->written_to_some_lsn = log_sys->write_lsn; log_sys->written_to_some_lsn = log_sys->write_lsn;
log_sys->one_flushed = TRUE; log_sys->one_flushed = TRUE;
...@@ -942,10 +944,12 @@ log_group_check_flush_completion( ...@@ -942,10 +944,12 @@ log_group_check_flush_completion(
return(LOG_UNLOCK_NONE_FLUSHED_LOCK); return(LOG_UNLOCK_NONE_FLUSHED_LOCK);
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes && (group->n_pending_writes == 0)) { if (log_debug_writes && (group->n_pending_writes == 0)) {
printf("Log flushed to group %lu\n", group->id); printf("Log flushed to group %lu\n", group->id);
} }
#endif /* UNIV_LOG_DEBUG */
return(0); return(0);
} }
...@@ -1021,7 +1025,15 @@ log_io_complete( ...@@ -1021,7 +1025,15 @@ log_io_complete(
fil_flush(group->space_id); fil_flush(group->space_id);
} }
log_io_complete_checkpoint(group); #ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"Checkpoint info written to group %lu\n",
group->id);
}
#endif /* UNIV_LOG_DEBUG */
log_io_complete_checkpoint();
return; return;
} }
...@@ -1086,11 +1098,13 @@ log_group_file_header_flush( ...@@ -1086,11 +1098,13 @@ log_group_file_header_flush(
dest_offset = nth_file * group->file_size; dest_offset = nth_file * group->file_size;
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf( printf(
"Writing log file header to group %lu file %lu\n", group->id, "Writing log file header to group %lu file %lu\n", group->id,
nth_file); nth_file);
} }
#endif /* UNIV_LOG_DEBUG */
if (log_do_write) { if (log_do_write) {
log_sys->n_log_ios++; log_sys->n_log_ios++;
...@@ -1174,6 +1188,7 @@ log_group_write_buf( ...@@ -1174,6 +1188,7 @@ log_group_write_buf(
write_len = len; write_len = len;
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf( printf(
...@@ -1197,6 +1212,7 @@ log_group_write_buf( ...@@ -1197,6 +1212,7 @@ log_group_write_buf(
+ i * OS_FILE_LOG_BLOCK_SIZE)); + i * OS_FILE_LOG_BLOCK_SIZE));
} }
} }
#endif /* UNIV_LOG_DEBUG */
/* Calculate the checksums for each log block and write them to /* Calculate the checksums for each log block and write them to
the trailer fields of the log blocks */ the trailer fields of the log blocks */
...@@ -1324,6 +1340,7 @@ log_write_up_to( ...@@ -1324,6 +1340,7 @@ log_write_up_to(
return; return;
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf("Writing log from %lu %lu up to lsn %lu %lu\n", printf("Writing log from %lu %lu up to lsn %lu %lu\n",
ut_dulint_get_high(log_sys->written_to_all_lsn), ut_dulint_get_high(log_sys->written_to_all_lsn),
...@@ -1331,6 +1348,7 @@ log_write_up_to( ...@@ -1331,6 +1348,7 @@ log_write_up_to(
ut_dulint_get_high(log_sys->lsn), ut_dulint_get_high(log_sys->lsn),
ut_dulint_get_low(log_sys->lsn)); ut_dulint_get_low(log_sys->lsn));
} }
#endif /* UNIV_LOG_DEBUG */
log_sys->n_pending_writes++; log_sys->n_pending_writes++;
...@@ -1556,9 +1574,8 @@ log_complete_checkpoint(void) ...@@ -1556,9 +1574,8 @@ log_complete_checkpoint(void)
Completes an asynchronous checkpoint info write i/o to a log file. */ Completes an asynchronous checkpoint info write i/o to a log file. */
static static
void void
log_io_complete_checkpoint( log_io_complete_checkpoint(void)
/*=======================*/ /*============================*/
log_group_t* group) /* in: log group */
{ {
mutex_enter(&(log_sys->mutex)); mutex_enter(&(log_sys->mutex));
...@@ -1566,10 +1583,6 @@ log_io_complete_checkpoint( ...@@ -1566,10 +1583,6 @@ log_io_complete_checkpoint(
log_sys->n_pending_checkpoint_writes--; log_sys->n_pending_checkpoint_writes--;
if (log_debug_writes) {
printf("Checkpoint info written to group %lu\n", group->id);
}
if (log_sys->n_pending_checkpoint_writes == 0) { if (log_sys->n_pending_checkpoint_writes == 0) {
log_complete_checkpoint(); log_complete_checkpoint();
} }
...@@ -1894,12 +1907,14 @@ log_checkpoint( ...@@ -1894,12 +1907,14 @@ log_checkpoint(
log_sys->next_checkpoint_lsn = oldest_lsn; log_sys->next_checkpoint_lsn = oldest_lsn;
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf("Making checkpoint no %lu at lsn %lu %lu\n", printf("Making checkpoint no %lu at lsn %lu %lu\n",
ut_dulint_get_low(log_sys->next_checkpoint_no), ut_dulint_get_low(log_sys->next_checkpoint_no),
ut_dulint_get_high(oldest_lsn), ut_dulint_get_high(oldest_lsn),
ut_dulint_get_low(oldest_lsn)); ut_dulint_get_low(oldest_lsn));
} }
#endif /* UNIV_LOG_DEBUG */
log_groups_write_checkpoint_info(); log_groups_write_checkpoint_info();
...@@ -2279,9 +2294,11 @@ log_group_archive( ...@@ -2279,9 +2294,11 @@ log_group_archive(
exit(1); exit(1);
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf("Created archive file %s\n", name); printf("Created archive file %s\n", name);
} }
#endif /* UNIV_LOG_DEBUG */
ret = os_file_close(file_handle); ret = os_file_close(file_handle);
...@@ -2310,6 +2327,7 @@ log_group_archive( ...@@ -2310,6 +2327,7 @@ log_group_archive(
len = group->file_size - (next_offset % group->file_size); len = group->file_size - (next_offset % group->file_size);
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf( printf(
"Archiving starting at lsn %lu %lu, len %lu to group %lu\n", "Archiving starting at lsn %lu %lu, len %lu to group %lu\n",
...@@ -2317,6 +2335,7 @@ log_group_archive( ...@@ -2317,6 +2335,7 @@ log_group_archive(
ut_dulint_get_low(start_lsn), ut_dulint_get_low(start_lsn),
len, group->id); len, group->id);
} }
#endif /* UNIV_LOG_DEBUG */
log_sys->n_pending_archive_ios++; log_sys->n_pending_archive_ios++;
...@@ -2407,10 +2426,12 @@ log_archive_write_complete_groups(void) ...@@ -2407,10 +2426,12 @@ log_archive_write_complete_groups(void)
trunc_files = n_files - 1; trunc_files = n_files - 1;
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes && trunc_files) { if (log_debug_writes && trunc_files) {
printf("Complete file(s) archived to group %lu\n", printf("Complete file(s) archived to group %lu\n",
group->id); group->id);
} }
#endif /* UNIV_LOG_DEBUG */
/* Calculate the archive file space start lsn */ /* Calculate the archive file space start lsn */
start_lsn = ut_dulint_subtract(log_sys->next_archived_lsn, start_lsn = ut_dulint_subtract(log_sys->next_archived_lsn,
...@@ -2433,9 +2454,11 @@ log_archive_write_complete_groups(void) ...@@ -2433,9 +2454,11 @@ log_archive_write_complete_groups(void)
fil_space_truncate_start(group->archive_space_id, fil_space_truncate_start(group->archive_space_id,
trunc_files * group->file_size); trunc_files * group->file_size);
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf("Archiving writes completed\n"); printf("Archiving writes completed\n");
} }
#endif /* UNIV_LOG_DEBUG */
} }
/********************************************************** /**********************************************************
...@@ -2452,9 +2475,11 @@ log_archive_check_completion_low(void) ...@@ -2452,9 +2475,11 @@ log_archive_check_completion_low(void)
if (log_sys->n_pending_archive_ios == 0 if (log_sys->n_pending_archive_ios == 0
&& log_sys->archiving_phase == LOG_ARCHIVE_READ) { && log_sys->archiving_phase == LOG_ARCHIVE_READ) {
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf("Archiving read completed\n"); printf("Archiving read completed\n");
} }
#endif /* UNIV_LOG_DEBUG */
/* Archive buffer has now been read in: start archive writes */ /* Archive buffer has now been read in: start archive writes */
...@@ -2598,6 +2623,7 @@ log_archive_do( ...@@ -2598,6 +2623,7 @@ log_archive_do(
log_sys->next_archived_lsn = limit_lsn; log_sys->next_archived_lsn = limit_lsn;
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf("Archiving from lsn %lu %lu to lsn %lu %lu\n", printf("Archiving from lsn %lu %lu to lsn %lu %lu\n",
ut_dulint_get_high(log_sys->archived_lsn), ut_dulint_get_high(log_sys->archived_lsn),
...@@ -2605,6 +2631,7 @@ log_archive_do( ...@@ -2605,6 +2631,7 @@ log_archive_do(
ut_dulint_get_high(limit_lsn), ut_dulint_get_high(limit_lsn),
ut_dulint_get_low(limit_lsn)); ut_dulint_get_low(limit_lsn));
} }
#endif /* UNIV_LOG_DEBUG */
/* Read the log segment to the archive buffer */ /* Read the log segment to the archive buffer */
...@@ -2703,11 +2730,13 @@ log_archive_close_groups( ...@@ -2703,11 +2730,13 @@ log_archive_close_groups(
group->archived_file_no += 2; group->archived_file_no += 2;
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
printf( printf(
"Incrementing arch file no to %lu in log group %lu\n", "Incrementing arch file no to %lu in log group %lu\n",
group->archived_file_no + 2, group->id); group->archived_file_no + 2, group->id);
} }
#endif /* UNIV_LOG_DEBUG */
} }
} }
...@@ -3155,6 +3184,7 @@ logs_empty_and_mark_files_at_shutdown(void) ...@@ -3155,6 +3184,7 @@ logs_empty_and_mark_files_at_shutdown(void)
ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn)); ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn));
} }
#ifdef UNIV_LOG_DEBUG
/********************************************************** /**********************************************************
Checks by parsing that the catenated log segment for a single mtr is Checks by parsing that the catenated log segment for a single mtr is
consistent. */ consistent. */
...@@ -3207,6 +3237,7 @@ log_check_log_recs( ...@@ -3207,6 +3237,7 @@ log_check_log_recs(
return(TRUE); return(TRUE);
} }
#endif /* UNIV_LOG_DEBUG */
/********************************************************** /**********************************************************
Peeks the current lsn. */ Peeks the current lsn. */
......
...@@ -471,6 +471,7 @@ recv_find_max_checkpoint( ...@@ -471,6 +471,7 @@ recv_find_max_checkpoint(
log_group_read_checkpoint_info(group, field); log_group_read_checkpoint_info(group, field);
if (!recv_check_cp_is_consistent(buf)) { if (!recv_check_cp_is_consistent(buf)) {
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Checkpoint in group %lu at %lu invalid, %lu\n", "InnoDB: Checkpoint in group %lu at %lu invalid, %lu\n",
...@@ -479,6 +480,7 @@ recv_find_max_checkpoint( ...@@ -479,6 +480,7 @@ recv_find_max_checkpoint(
+ LOG_CHECKPOINT_CHECKSUM_1)); + LOG_CHECKPOINT_CHECKSUM_1));
} }
#endif /* UNIV_LOG_DEBUG */
goto not_consistent; goto not_consistent;
} }
...@@ -492,11 +494,13 @@ recv_find_max_checkpoint( ...@@ -492,11 +494,13 @@ recv_find_max_checkpoint(
checkpoint_no = checkpoint_no =
mach_read_from_8(buf + LOG_CHECKPOINT_NO); mach_read_from_8(buf + LOG_CHECKPOINT_NO);
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Checkpoint number %lu found in group %lu\n", "InnoDB: Checkpoint number %lu found in group %lu\n",
ut_dulint_get_low(checkpoint_no), group->id); ut_dulint_get_low(checkpoint_no), group->id);
} }
#endif /* UNIV_LOG_DEBUG */
if (ut_dulint_cmp(checkpoint_no, max_no) >= 0) { if (ut_dulint_cmp(checkpoint_no, max_no) >= 0) {
*max_group = group; *max_group = group;
...@@ -1113,13 +1117,15 @@ recv_recover_page( ...@@ -1113,13 +1117,15 @@ recv_recover_page(
start_lsn = recv->start_lsn; start_lsn = recv->start_lsn;
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Applying log rec type %lu len %lu to space %lu page no %lu\n", "InnoDB: Applying log rec type %lu len %lu to space %lu page no %lu\n",
(ulint)recv->type, recv->len, recv_addr->space, (ulint)recv->type, recv->len, recv_addr->space,
recv_addr->page_no); recv_addr->page_no);
} }
#endif /* UNIV_LOG_DEBUG */
recv_parse_or_apply_log_rec_body(recv->type, buf, recv_parse_or_apply_log_rec_body(recv->type, buf,
buf + recv->len, page, &mtr); buf + recv->len, page, &mtr);
mach_write_to_8(page + UNIV_PAGE_SIZE mach_write_to_8(page + UNIV_PAGE_SIZE
...@@ -1944,11 +1950,13 @@ recv_parse_log_recs( ...@@ -1944,11 +1950,13 @@ recv_parse_log_recs(
recv_sys->recovered_offset += len; recv_sys->recovered_offset += len;
recv_sys->recovered_lsn = new_recovered_lsn; recv_sys->recovered_lsn = new_recovered_lsn;
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Parsed a single log rec type %lu len %lu space %lu page no %lu\n", "InnoDB: Parsed a single log rec type %lu len %lu space %lu page no %lu\n",
(ulint)type, len, space, page_no); (ulint)type, len, space, page_no);
} }
#endif /* UNIV_LOG_DEBUG */
if (type == MLOG_DUMMY_RECORD) { if (type == MLOG_DUMMY_RECORD) {
/* Do nothing */ /* Do nothing */
...@@ -2007,12 +2015,14 @@ recv_parse_log_recs( ...@@ -2007,12 +2015,14 @@ recv_parse_log_recs(
*/ */
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Parsed a multi log rec type %lu len %lu space %lu page no %lu\n", "InnoDB: Parsed a multi log rec type %lu len %lu space %lu page no %lu\n",
(ulint)type, len, space, page_no); (ulint)type, len, space, page_no);
} }
#endif /* UNIV_LOG_DEBUG */
total_len += len; total_len += len;
n_recs++; n_recs++;
...@@ -2415,6 +2425,7 @@ recv_group_scan_log_recs( ...@@ -2415,6 +2425,7 @@ recv_group_scan_log_recs(
start_lsn = end_lsn; start_lsn = end_lsn;
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Scanned group %lu up to log sequence number %lu %lu\n", "InnoDB: Scanned group %lu up to log sequence number %lu %lu\n",
...@@ -2422,6 +2433,7 @@ recv_group_scan_log_recs( ...@@ -2422,6 +2433,7 @@ recv_group_scan_log_recs(
ut_dulint_get_high(*group_scanned_lsn), ut_dulint_get_high(*group_scanned_lsn),
ut_dulint_get_low(*group_scanned_lsn)); ut_dulint_get_low(*group_scanned_lsn));
} }
#endif /* UNIV_LOG_DEBUG */
} }
/************************************************************ /************************************************************
...@@ -2745,10 +2757,12 @@ recv_recovery_from_checkpoint_finish(void) ...@@ -2745,10 +2757,12 @@ recv_recovery_from_checkpoint_finish(void)
recv_apply_hashed_log_recs(TRUE); recv_apply_hashed_log_recs(TRUE);
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Log records applied to the database\n"); "InnoDB: Log records applied to the database\n");
} }
#endif /* UNIV_LOG_DEBUG */
if (recv_needed_recovery) { if (recv_needed_recovery) {
trx_sys_print_mysql_master_log_pos(); trx_sys_print_mysql_master_log_pos();
...@@ -3060,6 +3074,7 @@ log_group_recover_from_archive_file( ...@@ -3060,6 +3074,7 @@ log_group_recover_from_archive_file(
break; break;
} }
#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) { if (log_debug_writes) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Archive read starting at lsn %lu %lu, len %lu from file %s\n", "InnoDB: Archive read starting at lsn %lu %lu, len %lu from file %s\n",
...@@ -3067,6 +3082,7 @@ log_group_recover_from_archive_file( ...@@ -3067,6 +3082,7 @@ log_group_recover_from_archive_file(
ut_dulint_get_low(start_lsn), ut_dulint_get_low(start_lsn),
len, name); len, name);
} }
#endif /* UNIV_LOG_DEBUG */
fil_io(OS_FILE_READ | OS_FILE_LOG, TRUE, fil_io(OS_FILE_READ | OS_FILE_LOG, TRUE,
group->archive_space_id, read_offset / UNIV_PAGE_SIZE, group->archive_space_id, read_offset / UNIV_PAGE_SIZE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment