Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/MariaDB/storage/maria/   (MariaDB Server Version 8.1-8.4©)  Datei vom 1.9.2026 mit Größe 4 kB image not shown  

Quelle  ma_recovery_util.c   Sprache: C

 

/* Copyright (C) 2006,2007,2008 MySQL AB

   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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */


/*
  Q: Why isn't ma_recovery_util.c simply moved to ma_recovery.c ?

  A: ma_recovery.c, because it invokes objects from ma_check.c (like
  maria_chk_init()) causes the following problem:
  if a source file a.c of a program invokes a function defined in
  ma_recovery.c, then a.o depends on ma_recovery.o which depends on
  ma_check.o: linker thus brings in ma_check.o. That brings in the
  dependencies of ma_check.o which are definitions of _ma_check_print_info()
  etc; if a.o does not define them then the ones of ha_maria.o are used
  i.e. ha_maria.o is linked into the program, and this brings in dependencies
  of ha_maria.o on mysqld.o into the program's linking which thus fails, as
  the program is not linked with mysqld.o.
  Thus, while several functions defined in ma_recovery.c could be useful to
  other files, they cannot be used by them.
  So we are going to gradually move a great share of ma_recovery.c's exported
  functions into the present file, to isolate the problematic components and
  avoid the problem.
*/


#include "maria_def.h"

HASH all_dirty_pages;
struct st_dirty_page /* used only in the REDO phase */
{
  uint64 file_and_page_id;
  LSN rec_lsn;
};
/*
  LSN after which dirty pages list does not apply. Can be slightly before
  when ma_checkpoint_execute() started.
*/

LSN checkpoint_start= LSN_IMPOSSIBLE;

/** @todo looks like duplicate of recovery_message_printed */
my_bool procent_printed;
FILE *tracef; /**< trace file for debugging */

ulong recovery_found_crashed_tables;
uint skipped_lsn_err_count;

/** @brief Prints to a trace file if it is not NULL */
void tprint(FILE *trace_file __attribute__ ((unused)),
            const char *format __attribute__ ((unused)), ...)
{
  va_list args;
#ifndef DBUG_OFF
  {
    char buff[1024];
    size_t length;
    va_start(args, format);
    length= my_vsnprintf(buff, sizeof(buff)-1, format, args);
    if (length && buff[length-1] == '\n')
      buff[length-1]= 0;                      /* Don't print end \n */
    DBUG_PRINT("info", ("%s", buff));
    va_end(args);
  }
#endif
  va_start(args, format);
  if (trace_file != NULL)
    vfprintf(trace_file, format, args);
  va_end(args);
}


void eprint(FILE *trace_file __attribute__ ((unused)),
            const char *format __attribute__ ((unused)), ...)
{
  va_list args;
  va_start(args, format);
  DBUG_PRINT("error", ("%s", format));
  if (!trace_file)
    trace_file= stderr;

  if (procent_printed && trace_file == stderr)
  {
    procent_printed= 0;
    /* In silent mode, print on another line than the 0% 10% 20% line */
    fputc('\n', stderr);
    fflush(stderr);
  }
  vfprintf(trace_file , format, args);
  fputc('\n', trace_file);
  if (trace_file != stderr)
  {
    va_start(args, format);
    my_printv_error(HA_ERR_INITIALIZATION, format, MYF(0), args);
  }
  va_end(args);
  fflush(trace_file);
}


/**
   Tells if the dirty pages list found in checkpoint record allows to ignore a
   REDO for a certain page.

   @param  shortid         short id of the table
   @param  lsn             REDO record's LSN
   @param  page            page number
   @param  index           TRUE if index page, FALSE if data page
*/


my_bool _ma_redo_not_needed_for_page(uint16 shortid, LSN lsn,
                                     pgcache_page_no_t page,
                                     my_bool index)
{
  if (cmp_translog_addr(lsn, checkpoint_start) < 0)
  {
    /*
      64-bit key is formed like this:
      Most significant byte: 0 if data page, 1 if index page
      Next 2 bytes: table's short id
      Next 5 bytes: page number
    */

    char llbuf[22];
    uint64 file_and_page_id=
      (((uint64)((index << 16) | shortid)) << 40) | page;
    struct st_dirty_page *dirty_page= (struct st_dirty_page *)
      my_hash_search(&all_dirty_pages,
                  (uchar *)&file_and_page_id, sizeof(file_and_page_id));
    DBUG_PRINT("info", ("page %lld in dirty pages list: %d",
                        (ulonglong) page,
                        dirty_page != NULL));
    if ((dirty_page == NULL) ||
        cmp_translog_addr(lsn, dirty_page->rec_lsn) < 0)
    {
      tprint(tracef, ", ignoring page %s because of dirty_pages list\n",
             llstr((ulonglong) page, llbuf));
      return TRUE;
    }
  }
  return FALSE;
}

Messung V0.5 in Prozent
C=93 H=100 G=96

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet am  2026-10-08) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.