#At file:///Users/malff/BZR_TREE/mysql-next-mr-wl4895/ based on revid:marc.alff@stripped
3148 Marc Alff 2010-05-17
WL#4895 PERFORMANCE SCHEMA Instrument TABLE IO
Added test cases
added:
mysql-test/suite/perfschema/r/start_server_no_table_hdl.result
mysql-test/suite/perfschema/r/start_server_no_table_inst.result
mysql-test/suite/perfschema/r/start_server_nothing.result
mysql-test/suite/perfschema/t/start_server_no_table_hdl-master.opt
mysql-test/suite/perfschema/t/start_server_no_table_hdl.test
mysql-test/suite/perfschema/t/start_server_no_table_inst-master.opt
mysql-test/suite/perfschema/t/start_server_no_table_inst.test
mysql-test/suite/perfschema/t/start_server_nothing-master.opt
mysql-test/suite/perfschema/t/start_server_nothing.test
=== added file 'mysql-test/suite/perfschema/r/start_server_no_table_hdl.result'
--- a/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result 2010-05-17 10:05:47 +0000
@@ -0,0 +1,79 @@
+show databases;
+Database
+information_schema
+mtr
+mysql
+performance_schema
+test
+select count(*) from performance_schema.PERFORMANCE_TIMERS;
+count(*)
+5
+select count(*) from performance_schema.SETUP_CONSUMERS;
+count(*)
+8
+select count(*) > 1 from performance_schema.SETUP_INSTRUMENTS;
+count(*) > 1
+1
+select count(*) from performance_schema.SETUP_TIMERS;
+count(*)
+1
+select * from performance_schema.COND_INSTANCES;
+select * from performance_schema.EVENTS_WAITS_CURRENT;
+select * from performance_schema.EVENTS_WAITS_HISTORY;
+select * from performance_schema.EVENTS_WAITS_HISTORY_LONG;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME;
+select * from performance_schema.FILE_INSTANCES;
+select * from performance_schema.FILE_SUMMARY_BY_EVENT_NAME;
+select * from performance_schema.FILE_SUMMARY_BY_INSTANCE;
+select * from performance_schema.MUTEX_INSTANCES;
+select * from performance_schema.PERFORMANCE_TIMERS;
+select * from performance_schema.PROCESSLIST;
+select * from performance_schema.RWLOCK_INSTANCES;
+select * from performance_schema.SETUP_CONSUMERS;
+select * from performance_schema.SETUP_INSTRUMENTS;
+select * from performance_schema.SETUP_OBJECTS;
+select * from performance_schema.SETUP_TIMERS;
+show variables like "performance_schema%";
+Variable_name Value
+performance_schema ON
+performance_schema_events_waits_history_long_size 10000
+performance_schema_events_waits_history_size 10
+performance_schema_max_cond_classes 80
+performance_schema_max_cond_instances 1000
+performance_schema_max_file_classes 50
+performance_schema_max_file_handles 32768
+performance_schema_max_file_instances 10000
+performance_schema_max_mutex_classes 200
+performance_schema_max_mutex_instances 1000
+performance_schema_max_rwlock_classes 20
+performance_schema_max_rwlock_instances 1000
+performance_schema_max_table_handles 0
+performance_schema_max_table_instances 1000
+performance_schema_max_thread_classes 50
+performance_schema_max_thread_instances 1000
+show engine PERFORMANCE_SCHEMA status;
+show status like "performance_schema%";
+show variables like "performance_schema_max_table_instances";
+Variable_name Value
+performance_schema_max_table_instances 1000
+show variables like "performance_schema_max_table_handles";
+Variable_name Value
+performance_schema_max_table_handles 0
+drop table if exists test.instrument_me;
+create table test.instrument_me(a int);
+insert into test.instrument_me values (1), (2), (3);
+select * from test.instrument_me;
+a
+1
+2
+3
+drop table test.instrument_me;
+show variables like "performance_schema_max_table_instances";
+Variable_name Value
+performance_schema_max_table_instances 1000
+select variable_value > 0 from information_schema.global_status
+where variable_name like 'PERFORMANCE_SCHEMA_TABLE_HANDLES_LOST';
+variable_value > 0
+1
=== added file 'mysql-test/suite/perfschema/r/start_server_no_table_inst.result'
--- a/mysql-test/suite/perfschema/r/start_server_no_table_inst.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/r/start_server_no_table_inst.result 2010-05-17 10:05:47 +0000
@@ -0,0 +1,79 @@
+show databases;
+Database
+information_schema
+mtr
+mysql
+performance_schema
+test
+select count(*) from performance_schema.PERFORMANCE_TIMERS;
+count(*)
+5
+select count(*) from performance_schema.SETUP_CONSUMERS;
+count(*)
+8
+select count(*) > 1 from performance_schema.SETUP_INSTRUMENTS;
+count(*) > 1
+1
+select count(*) from performance_schema.SETUP_TIMERS;
+count(*)
+1
+select * from performance_schema.COND_INSTANCES;
+select * from performance_schema.EVENTS_WAITS_CURRENT;
+select * from performance_schema.EVENTS_WAITS_HISTORY;
+select * from performance_schema.EVENTS_WAITS_HISTORY_LONG;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME;
+select * from performance_schema.FILE_INSTANCES;
+select * from performance_schema.FILE_SUMMARY_BY_EVENT_NAME;
+select * from performance_schema.FILE_SUMMARY_BY_INSTANCE;
+select * from performance_schema.MUTEX_INSTANCES;
+select * from performance_schema.PERFORMANCE_TIMERS;
+select * from performance_schema.PROCESSLIST;
+select * from performance_schema.RWLOCK_INSTANCES;
+select * from performance_schema.SETUP_CONSUMERS;
+select * from performance_schema.SETUP_INSTRUMENTS;
+select * from performance_schema.SETUP_OBJECTS;
+select * from performance_schema.SETUP_TIMERS;
+show variables like "performance_schema%";
+Variable_name Value
+performance_schema ON
+performance_schema_events_waits_history_long_size 10000
+performance_schema_events_waits_history_size 10
+performance_schema_max_cond_classes 80
+performance_schema_max_cond_instances 1000
+performance_schema_max_file_classes 50
+performance_schema_max_file_handles 32768
+performance_schema_max_file_instances 10000
+performance_schema_max_mutex_classes 200
+performance_schema_max_mutex_instances 1000
+performance_schema_max_rwlock_classes 20
+performance_schema_max_rwlock_instances 1000
+performance_schema_max_table_handles 10000
+performance_schema_max_table_instances 0
+performance_schema_max_thread_classes 50
+performance_schema_max_thread_instances 1000
+show engine PERFORMANCE_SCHEMA status;
+show status like "performance_schema%";
+show variables like "performance_schema_max_table_instances";
+Variable_name Value
+performance_schema_max_table_instances 0
+show variables like "performance_schema_max_table_handles";
+Variable_name Value
+performance_schema_max_table_handles 10000
+drop table if exists test.instrument_me;
+create table test.instrument_me(a int);
+insert into test.instrument_me values (1), (2), (3);
+select * from test.instrument_me;
+a
+1
+2
+3
+drop table test.instrument_me;
+select variable_value > 0 from information_schema.global_status
+where variable_name like 'PERFORMANCE_SCHEMA_TABLE_INSTANCES_LOST';
+variable_value > 0
+1
+show status like "performance_schema_table_handles_lost";
+Variable_name Value
+Performance_schema_table_handles_lost 0
=== added file 'mysql-test/suite/perfschema/r/start_server_nothing.result'
--- a/mysql-test/suite/perfschema/r/start_server_nothing.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/r/start_server_nothing.result 2010-05-17 10:05:47 +0000
@@ -0,0 +1,124 @@
+show databases;
+Database
+information_schema
+mtr
+mysql
+performance_schema
+test
+select count(*) from performance_schema.PERFORMANCE_TIMERS;
+count(*)
+5
+select count(*) from performance_schema.SETUP_CONSUMERS;
+count(*)
+8
+select count(*) > 1 from performance_schema.SETUP_INSTRUMENTS;
+count(*) > 1
+0
+select count(*) from performance_schema.SETUP_TIMERS;
+count(*)
+1
+select * from performance_schema.COND_INSTANCES;
+select * from performance_schema.EVENTS_WAITS_CURRENT;
+select * from performance_schema.EVENTS_WAITS_HISTORY;
+select * from performance_schema.EVENTS_WAITS_HISTORY_LONG;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME;
+select * from performance_schema.FILE_INSTANCES;
+select * from performance_schema.FILE_SUMMARY_BY_EVENT_NAME;
+select * from performance_schema.FILE_SUMMARY_BY_INSTANCE;
+select * from performance_schema.MUTEX_INSTANCES;
+select * from performance_schema.PERFORMANCE_TIMERS;
+select * from performance_schema.PROCESSLIST;
+select * from performance_schema.RWLOCK_INSTANCES;
+select * from performance_schema.SETUP_CONSUMERS;
+select * from performance_schema.SETUP_INSTRUMENTS;
+select * from performance_schema.SETUP_OBJECTS;
+select * from performance_schema.SETUP_TIMERS;
+show variables like "performance_schema%";
+Variable_name Value
+performance_schema ON
+performance_schema_events_waits_history_long_size 0
+performance_schema_events_waits_history_size 0
+performance_schema_max_cond_classes 0
+performance_schema_max_cond_instances 0
+performance_schema_max_file_classes 0
+performance_schema_max_file_handles 0
+performance_schema_max_file_instances 0
+performance_schema_max_mutex_classes 0
+performance_schema_max_mutex_instances 0
+performance_schema_max_rwlock_classes 0
+performance_schema_max_rwlock_instances 0
+performance_schema_max_table_handles 0
+performance_schema_max_table_instances 0
+performance_schema_max_thread_classes 0
+performance_schema_max_thread_instances 0
+show engine PERFORMANCE_SCHEMA status;
+show status like "performance_schema%";
+show variables like "performance_schema%";
+Variable_name Value
+performance_schema ON
+performance_schema_events_waits_history_long_size 0
+performance_schema_events_waits_history_size 0
+performance_schema_max_cond_classes 0
+performance_schema_max_cond_instances 0
+performance_schema_max_file_classes 0
+performance_schema_max_file_handles 0
+performance_schema_max_file_instances 0
+performance_schema_max_mutex_classes 0
+performance_schema_max_mutex_instances 0
+performance_schema_max_rwlock_classes 0
+performance_schema_max_rwlock_instances 0
+performance_schema_max_table_handles 0
+performance_schema_max_table_instances 0
+performance_schema_max_thread_classes 0
+performance_schema_max_thread_instances 0
+select * from performance_schema.SETUP_INSTRUMENTS;
+NAME ENABLED TIMED
+wait/io/table/sql/handler YES YES
+select TIMER_NAME from performance_schema.PERFORMANCE_TIMERS;
+TIMER_NAME
+CYCLE
+NANOSECOND
+MICROSECOND
+MILLISECOND
+TICK
+select * from performance_schema.SETUP_CONSUMERS;
+NAME ENABLED
+events_waits_current YES
+events_waits_history YES
+events_waits_history_long YES
+events_waits_summary_by_thread_by_event_name YES
+events_waits_summary_by_event_name YES
+events_waits_summary_by_instance YES
+file_summary_by_event_name YES
+file_summary_by_instance YES
+select * from performance_schema.SETUP_TIMERS;
+NAME TIMER_NAME
+wait CYCLE
+select * from performance_schema.COND_INSTANCES;
+NAME OBJECT_INSTANCE_BEGIN
+select * from performance_schema.EVENTS_WAITS_CURRENT;
+THREAD_ID EVENT_ID EVENT_NAME SOURCE TIMER_START TIMER_END TIMER_WAIT SPINS OBJECT_SCHEMA OBJECT_NAME OBJECT_TYPE OBJECT_INSTANCE_BEGIN NESTING_EVENT_ID OPERATION NUMBER_OF_BYTES FLAGS
+select * from performance_schema.EVENTS_WAITS_HISTORY;
+THREAD_ID EVENT_ID EVENT_NAME SOURCE TIMER_START TIMER_END TIMER_WAIT SPINS OBJECT_SCHEMA OBJECT_NAME OBJECT_TYPE OBJECT_INSTANCE_BEGIN NESTING_EVENT_ID OPERATION NUMBER_OF_BYTES FLAGS
+select * from performance_schema.EVENTS_WAITS_HISTORY_LONG;
+THREAD_ID EVENT_ID EVENT_NAME SOURCE TIMER_START TIMER_END TIMER_WAIT SPINS OBJECT_SCHEMA OBJECT_NAME OBJECT_TYPE OBJECT_INSTANCE_BEGIN NESTING_EVENT_ID OPERATION NUMBER_OF_BYTES FLAGS
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME;
+EVENT_NAME COUNT_STAR SUM_TIMER_WAIT MIN_TIMER_WAIT AVG_TIMER_WAIT MAX_TIMER_WAIT
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE;
+EVENT_NAME OBJECT_INSTANCE_BEGIN COUNT_STAR SUM_TIMER_WAIT MIN_TIMER_WAIT AVG_TIMER_WAIT MAX_TIMER_WAIT
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME;
+THREAD_ID EVENT_NAME COUNT_STAR SUM_TIMER_WAIT MIN_TIMER_WAIT AVG_TIMER_WAIT MAX_TIMER_WAIT
+select * from performance_schema.FILE_INSTANCES;
+FILE_NAME EVENT_NAME OPEN_COUNT
+select * from performance_schema.FILE_SUMMARY_BY_EVENT_NAME;
+EVENT_NAME COUNT_READ COUNT_WRITE SUM_NUMBER_OF_BYTES_READ SUM_NUMBER_OF_BYTES_WRITE
+select * from performance_schema.FILE_SUMMARY_BY_INSTANCE;
+FILE_NAME EVENT_NAME COUNT_READ COUNT_WRITE SUM_NUMBER_OF_BYTES_READ SUM_NUMBER_OF_BYTES_WRITE
+select * from performance_schema.MUTEX_INSTANCES;
+NAME OBJECT_INSTANCE_BEGIN LOCKED_BY_THREAD_ID
+select * from performance_schema.PROCESSLIST;
+THREAD_ID ID NAME
+select * from performance_schema.RWLOCK_INSTANCES;
+NAME OBJECT_INSTANCE_BEGIN WRITE_LOCKED_BY_THREAD_ID READ_LOCKED_BY_COUNT
=== added file 'mysql-test/suite/perfschema/t/start_server_no_table_hdl-master.opt'
--- a/mysql-test/suite/perfschema/t/start_server_no_table_hdl-master.opt 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/start_server_no_table_hdl-master.opt 2010-05-17 10:05:47 +0000
@@ -0,0 +1 @@
+--loose-enable-performance-schema --loose-performance_schema_max_table_handles=0
=== added file 'mysql-test/suite/perfschema/t/start_server_no_table_hdl.test'
--- a/mysql-test/suite/perfschema/t/start_server_no_table_hdl.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/start_server_no_table_hdl.test 2010-05-17 10:05:47 +0000
@@ -0,0 +1,45 @@
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# Tests for PERFORMANCE_SCHEMA
+
+--source include/not_embedded.inc
+--source include/have_perfschema.inc
+
+--source ../include/start_server_common.inc
+
+# Expect instances
+show variables like "performance_schema_max_table_instances";
+
+# Expect no handles
+show variables like "performance_schema_max_table_handles";
+
+# Create an instrumented table
+--disable_warnings
+drop table if exists test.instrument_me;
+--enable_warnings
+
+create table test.instrument_me(a int);
+insert into test.instrument_me values (1), (2), (3);
+select * from test.instrument_me;
+drop table test.instrument_me;
+
+# Expect no instances lost
+show variables like "performance_schema_max_table_instances";
+
+# We lost all the handles
+select variable_value > 0 from information_schema.global_status
+ where variable_name like 'PERFORMANCE_SCHEMA_TABLE_HANDLES_LOST';
+
=== added file 'mysql-test/suite/perfschema/t/start_server_no_table_inst-master.opt'
--- a/mysql-test/suite/perfschema/t/start_server_no_table_inst-master.opt 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/start_server_no_table_inst-master.opt 2010-05-17 10:05:47 +0000
@@ -0,0 +1 @@
+--loose-enable-performance-schema --loose-performance_schema_max_table_instances=0
=== added file 'mysql-test/suite/perfschema/t/start_server_no_table_inst.test'
--- a/mysql-test/suite/perfschema/t/start_server_no_table_inst.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/start_server_no_table_inst.test 2010-05-17 10:05:47 +0000
@@ -0,0 +1,45 @@
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# Tests for PERFORMANCE_SCHEMA
+
+--source include/not_embedded.inc
+--source include/have_perfschema.inc
+
+--source ../include/start_server_common.inc
+
+# Expect no instances
+show variables like "performance_schema_max_table_instances";
+
+# Expect handles
+show variables like "performance_schema_max_table_handles";
+
+# Create an instrumented table
+--disable_warnings
+drop table if exists test.instrument_me;
+--enable_warnings
+
+create table test.instrument_me(a int);
+insert into test.instrument_me values (1), (2), (3);
+select * from test.instrument_me;
+drop table test.instrument_me;
+
+# We lost all the instances
+select variable_value > 0 from information_schema.global_status
+ where variable_name like 'PERFORMANCE_SCHEMA_TABLE_INSTANCES_LOST';
+
+# Expect no handle lost
+show status like "performance_schema_table_handles_lost";
+
=== added file 'mysql-test/suite/perfschema/t/start_server_nothing-master.opt'
--- a/mysql-test/suite/perfschema/t/start_server_nothing-master.opt 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/start_server_nothing-master.opt 2010-05-17 10:05:47 +0000
@@ -0,0 +1,27 @@
+--loose-enable-performance-schema
+
+--loose-performance_schema_events_waits_history_long_size=0
+--loose-performance_schema_events_waits_history_size=0
+
+--loose-performance_schema_max_mutex_classes=0
+--loose-performance_schema_max_rwlock_classes=0
+--loose-performance_schema_max_cond_classes=0
+--loose-performance_schema_max_file_classes=0
+--loose-performance_schema_max_thread_classes=0
+
+--loose-performance_schema_max_mutex_instances=0
+--loose-performance_schema_max_rwlock_instances=0
+--loose-performance_schema_max_cond_instances=0
+--loose-performance_schema_max_file_instances=0
+--loose-performance_schema_max_thread_instances=0
+
+--loose-performance_schema_max_table_instances=0
+--loose-performance_schema_max_file_handles=0
+--loose-performance_schema_max_table_handles=0
+
+--loose-performance_schema_setup_actors_size=0
+--loose-performance_schema_setup_objects_size=0
+--loose-performance_schema_max_hosts=0
+--loose-performance_schema_max_users=0
+--loose-performance_schema_max_user_hosts=0
+
=== added file 'mysql-test/suite/perfschema/t/start_server_nothing.test'
--- a/mysql-test/suite/perfschema/t/start_server_nothing.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/start_server_nothing.test 2010-05-17 10:05:47 +0000
@@ -0,0 +1,45 @@
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# Tests for PERFORMANCE_SCHEMA
+
+--source include/not_embedded.inc
+--source include/have_perfschema.inc
+
+--source ../include/start_server_common.inc
+
+show variables like "performance_schema%";
+
+# Not empty
+select * from performance_schema.SETUP_INSTRUMENTS;
+select TIMER_NAME from performance_schema.PERFORMANCE_TIMERS;
+select * from performance_schema.SETUP_CONSUMERS;
+select * from performance_schema.SETUP_TIMERS;
+
+# All empty
+select * from performance_schema.COND_INSTANCES;
+select * from performance_schema.EVENTS_WAITS_CURRENT;
+select * from performance_schema.EVENTS_WAITS_HISTORY;
+select * from performance_schema.EVENTS_WAITS_HISTORY_LONG;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE;
+select * from performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME;
+select * from performance_schema.FILE_INSTANCES;
+select * from performance_schema.FILE_SUMMARY_BY_EVENT_NAME;
+select * from performance_schema.FILE_SUMMARY_BY_INSTANCE;
+select * from performance_schema.MUTEX_INSTANCES;
+select * from performance_schema.PROCESSLIST;
+select * from performance_schema.RWLOCK_INSTANCES;
+
Attachment: [text/bzr-bundle] bzr/marc.alff@oracle.com-20100517100547-10rbbdlca3y9vqrs.bundle
| Thread |
|---|
| • bzr commit into mysql-next-mr-wl4895 branch (marc.alff:3148) WL#4895 | Marc Alff | 17 May |