pfs_user-oom-t.cc 4.43 KB
Newer Older
Oleksandr Byelkin's avatar
Oleksandr Byelkin committed
1
/* Copyright (c) 2011, 2022, Oracle and/or its affiliates.
2 3

  This program is free software; you can redistribute it and/or modify
Sergei Golubchik's avatar
Sergei Golubchik committed
4 5 6 7 8 9 10 11 12
  it under the terms of the GNU General Public License, version 2.0,
  as published by the Free Software Foundation.

  This program is also distributed with certain software (including
  but not limited to OpenSSL) that is licensed under separate terms,
  as designated in a particular file or component or in included license
  documentation.  The authors of MySQL hereby grant you an additional
  permission to link the program and your derivative works with the
  separately licensed software that they have included with MySQL.
13 14 15 16

  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
Sergei Golubchik's avatar
Sergei Golubchik committed
17
  GNU General Public License, version 2.0, for more details.
18 19 20 21 22 23

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software Foundation,
  51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */

#include <my_global.h>
Sergei Golubchik's avatar
Sergei Golubchik committed
24
#include <my_thread.h>
25 26 27 28
#include <pfs_instr.h>
#include <pfs_stat.h>
#include <pfs_global.h>
#include <pfs_user.h>
Sergei Golubchik's avatar
Sergei Golubchik committed
29
#include <pfs_buffer_container.h>
30 31 32
#include <tap.h>

#include "stub_pfs_global.h"
Sergei Golubchik's avatar
Sergei Golubchik committed
33
#include "stub_global_status_var.h"
34 35 36 37 38

#include <string.h> /* memset */

void test_oom()
{
Sergei Golubchik's avatar
Sergei Golubchik committed
39
  PSI *psi;
40
  PFS_global_param param;
Sergei Golubchik's avatar
Sergei Golubchik committed
41
  PSI_bootstrap *boot;
42 43 44 45 46 47 48 49 50

  memset(& param, 0xFF, sizeof(param));
  param.m_enabled= true;
  param.m_mutex_class_sizing= 0;
  param.m_rwlock_class_sizing= 0;
  param.m_cond_class_sizing= 0;
  param.m_thread_class_sizing= 10;
  param.m_table_share_sizing= 0;
  param.m_file_class_sizing= 0;
Sergei Golubchik's avatar
Sergei Golubchik committed
51
  param.m_socket_class_sizing= 0;
52 53 54 55 56 57 58
  param.m_mutex_sizing= 0;
  param.m_rwlock_sizing= 0;
  param.m_cond_sizing= 0;
  param.m_thread_sizing= 1000;
  param.m_table_sizing= 0;
  param.m_file_sizing= 0;
  param.m_file_handle_sizing= 0;
Sergei Golubchik's avatar
Sergei Golubchik committed
59
  param.m_socket_sizing= 0;
60 61 62 63 64 65 66 67 68 69 70 71 72
  param.m_events_waits_history_sizing= 10;
  param.m_events_waits_history_long_sizing= 0;
  param.m_setup_actor_sizing= 0;
  param.m_setup_object_sizing= 0;
  param.m_host_sizing= 0;
  param.m_user_sizing= 1000;
  param.m_account_sizing= 0;
  param.m_stage_class_sizing= 50;
  param.m_events_stages_history_sizing= 0;
  param.m_events_stages_history_long_sizing= 0;
  param.m_statement_class_sizing= 50;
  param.m_events_statements_history_sizing= 0;
  param.m_events_statements_history_long_sizing= 0;
Sergei Golubchik's avatar
Sergei Golubchik committed
73 74 75 76 77 78 79 80 81 82
  param.m_events_transactions_history_sizing= 0;
  param.m_events_transactions_history_long_sizing= 0;
  param.m_digest_sizing= 0;
  param.m_session_connect_attrs_sizing= 0;
  param.m_program_sizing= 0;
  param.m_statement_stack_sizing= 0;
  param.m_memory_class_sizing= 10;
  param.m_metadata_lock_sizing= 0;
  param.m_max_digest_length= 0;
  param.m_max_sql_text_length= 0;
83 84 85 86 87 88

  /* Setup */

  stub_alloc_always_fails= false;
  stub_alloc_fails_after_count= 1000;

Sergei Golubchik's avatar
Sergei Golubchik committed
89 90 91 92 93 94 95 96 97 98 99 100 101
  pre_initialize_performance_schema();
  boot= initialize_performance_schema(&param);
  psi= (PSI *)boot->get_interface(PSI_VERSION_1);

  PSI_thread_key thread_key_1;
  PSI_thread_info all_thread[]=
  {
    {&thread_key_1, "T-1", 0}
  };
  psi->register_thread("test", all_thread, 1);

  PSI_thread *thread_1= psi->new_thread(thread_key_1, NULL, 0);
  psi->set_thread(thread_1);
102 103 104

  /* Tests */

Sergei Golubchik's avatar
Sergei Golubchik committed
105 106 107 108 109 110 111 112
  int first_fail= 1;
  stub_alloc_fails_after_count= first_fail;
  psi->set_thread_account("user1", 5, "", 0);
  ok(global_user_container.m_lost == 1, "oom (user)");

  stub_alloc_fails_after_count= first_fail + 1;
  psi->set_thread_account("user2", 5, "", 0);
  ok(global_user_container.m_lost == 2, "oom (user waits)");
113

Sergei Golubchik's avatar
Sergei Golubchik committed
114 115 116
  stub_alloc_fails_after_count= first_fail + 2;
  psi->set_thread_account("user3", 5, "", 0);
  ok(global_user_container.m_lost == 3, "oom (user stages)");
117

Sergei Golubchik's avatar
Sergei Golubchik committed
118 119 120
  stub_alloc_fails_after_count= first_fail + 3;
  psi->set_thread_account("user4", 5, "", 0);
  ok(global_user_container.m_lost == 4, "oom (user statements)");
121

Sergei Golubchik's avatar
Sergei Golubchik committed
122 123 124
  stub_alloc_fails_after_count= first_fail + 4;
  psi->set_thread_account("user5", 5, "", 0);
  ok(global_user_container.m_lost == 5, "oom (user transactions)");
125

Sergei Golubchik's avatar
Sergei Golubchik committed
126 127 128 129 130
  stub_alloc_fails_after_count= first_fail + 5;
  psi->set_thread_account("user6", 5, "", 0);
  ok(global_user_container.m_lost == 6, "oom (user memory)");

  shutdown_performance_schema();
131 132 133 134 135 136 137 138 139 140 141 142
}

void do_all_tests()
{
  test_oom();
}

int main(int, char **)
{
  plan(6);
  MY_INIT("pfs_user-oom-t");
  do_all_tests();
Sergei Golubchik's avatar
Sergei Golubchik committed
143
  return (exit_status());
144 145
}