# With the addition of WL#14793, this test is mostly of historical interest. # It could eventually be removed. # When loadable logging-components were first introduced, their configuration # was persisted in an InnoDB-table. This meant that we could only load those # components once InnoDB was available. All error-events up to that point # where saved in memory, and flushed to the loadable components once those # components were available. At the same time, if start-up took a long time # (e.g. due to a data dictionary upgrade, binlog replay, etc.), we would # flush status to the built-in logger even before InnoDB became available, # so the user would not consider the server frozen. # # The original version of this test primarily demonstrated some of the # "long start-up" features (as introduced by WL#11875). # # WL#14793 re-organizes the loading of logging components so they are # available very early during start-up. Because of this, most of the # "intermediate updates" logic could be removed. Consequently, it also # removed much of this test. --source include/big_test.inc --source include/not_windows.inc --source include/not_asan.inc --source include/not_parallel.inc --let $MYSQLD_DATADIR=`SELECT @@datadir` # Restart with both trad and JSON logs and verify that both logs show # the same events. --let LOG_FILE_TRAD=$MYSQL_TMP_DIR/buffered1.err --let LOG_FILE_JSON=$MYSQL_TMP_DIR/buffered1.err.00.json --let LOG_FILE_JSON_TO_TRAD=$MYSQL_TMP_DIR/buffered1.converted.err # To test filtering on buffered messages --let SUPPRESSED_ERRCODE1=convert_error(ER_BASEDIR_SET_TO) # To test filtering on non-buffered messages --let SUPPRESSED_ERRCODE2=convert_error(ER_DD_INIT_FAILED) # restart the server so it will write both trad and JSON error logs, # with some messages suppressed: SET PERSIST log_error_services="log_filter_internal,log_sink_internal,log_sink_json"; SET PERSIST log_error_suppression_list="ER_BASEDIR_SET_TO,ER_DD_INIT_FAILED"; --let LOG_FILE1= $MYSQLTEST_VARDIR/tmp/test1.err --let restart_parameters="restart: --log-error=$LOG_FILE_TRAD --log-error-verbosity=3" --replace_result $LOG_FILE_TRAD LOG_FILE_TRAD --source include/restart_mysqld.inc SELECT "[ PASS ] Server has restarted."; # Now convert the JSON log to trad format, so we can more easily compare # the contents of the two: --perl use strict; use JSON; my $file_trad= $ENV{'LOG_FILE_TRAD'}; my $file_json= $ENV{'LOG_FILE_JSON'}; my $file_conv= $ENV{'LOG_FILE_JSON_TO_TRAD'}; # Read entire trad log so far (i.e. start-up log). open(FILET,"$file_trad") or die("Unable to open $file_trad $!\n"); my @log_lines_trad=; close(FILET); print "[ PASS ] Successfully read traditional log file.\n"; # s/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\.[0-9][0-9][0-9][0-9][0-9][0-9][-+Z][0-9:]* *[0-9]* *(\[.*)$/$1/ for @log_lines_trad; # Read entire JSON log so far (i.e. start-up log). open(FILEJ,"$file_json") or die("Unable to open $file_json $!\n"); my @log_lines_json=; close(FILEJ); print "[ PASS ] Successfully read JSON log file.\n"; # Write trad log output generated from JSON input # (so that we may use diff to show that trad log and the JSON log # contain the same events). open(my $outfh,">",$file_conv) or die("Unable to open file '$file_conv' for writing $!\n"); # Test for validity of the JSON docs in error log. # JSON-log is in JSON-lines format. Convert it to plain JSON. my $string = "[\n".join("", @log_lines_json)."\n]"; $string =~ s/\}\n\{/\},\n\{/g ; # Attempt to decode the JSON document we built: my $success=1; my $parsed_json = decode_json $string; unless ( $parsed_json ) { print "[ FAIL ] Error while parsing the error log as a JSON document:". "\n$@\n"; $success=0; } if($success) { print "[ PASS ] Error log successfully parsed as a JSON document.\n"; my $line_count=0; for my $item( sort { $a->{time} cmp $b->{time} } @$parsed_json ) { my $errcode_formatted= sprintf("%06d", $item->{'err_code'}); # Verify that the --log-error-suppression-list works for # buffered messages flushed after timeout as well as for # non-buffered messages. if ($errcode_formatted =~ $ENV{'SUPPRESSED_ERRCODE1'} or $errcode_formatted =~ $ENV{'SUPPRESSED_ERRCODE2'}) { print "[ FAIL ] Error message with error code suppressed using ". "--log-error-suppression-list is seen in the error log"; } my $thread_id= defined $item->{'thread'} ? $item->{'thread'} : 0; my $label= ($item->{'label'} =~ "Error") ? uc $item->{'label'} : $item->{'label'}; my $msg= $item->{'msg'}; # log_sink_trad does '\n' -> ' ', so we need to emulate that. $msg =~ s/\n/ /g; print $outfh $item->{'time'}." ".$thread_id." "."[".$label."] [MY-". $errcode_formatted."] [".$item->{'subsystem'}."] ".$msg . "\n"; $line_count++; } if ($line_count == 0) { print "[ FAIL ] No lines were converted from JSON to trad.\n"; } else { print "[ PASS ] Lines were converted from JSON to trad.\n"; } } else { print "[ FAIL ] Error log could not be parsed as a JSON document.\n"; } close($outfh); EOF # Now, compare the two logs ("native" trad log, and JSON-converted-to-trad): --perl use strict; use File::Compare; my $file_trad= $ENV{'LOG_FILE_TRAD'}; my $file_conv= $ENV{'LOG_FILE_JSON_TO_TRAD'}; my $compare = compare($file_conv, $file_trad); if ($compare == 0) { print "[ PASS ] Traditional log and JSON-converted-to-trad log are the same.\n"; } else { print "[ FAIL ] Traditional log and JSON-converted-to-trad log are NOT the same.\n"; $/ = undef; my $contents; print "\n--- Contents of converted file, ".$file_conv." ---\n"; open my $fh, '<', $file_conv or die("Unable to open $file_conv $!\n"); $contents = <$fh>; close $fh; print $contents; print "\n--- Contents of native trad file, ".$file_trad." ---\n"; open my $fh, '<', $file_trad or die("Unable to open $file_trad $!\n"); $contents = <$fh>; close $fh; print $contents; print "--- end of inserted log ---\n\n"; } EOF # Cleanup RESET PERSIST log_error_services; RESET PERSIST log_error_suppression_list; SET GLOBAL log_error_services=DEFAULT; SET GLOBAL log_error_suppression_list=DEFAULT; --remove_files_wildcard $MYSQL_TMP_DIR buffered1*