Bug #43324 Wrong table count per snapshot stored in backup image
Submitted: 3 Mar 9:45 Modified: 26 Apr 2:04
Reporter: Rafal Somla
Status: Closed
Category:Server: Backup Severity:S3 (Non-critical)
Version:6.0 OS:Any
Assigned to: Chuck Bell Target Version:6.0-beta
Triage: Triaged: D2 (Serious)

[3 Mar 9:45] Rafal Somla
Description:
Backup image stores descriptions of "table data snapshots" contained in it, and for each
snapshot the number of tables belonging to it. But this number is not correctly stored
and always equals 1.

How to repeat:
Run the following test script:
---------------------------------------------------------
let $bdir=`select @@backupdir`;
CREATE DATABASE db1;
USE db1;

CREATE TABLE t1 (a int);
CREATE TABLE t2 (a int);
CREATE TABLE t3 (a int);

BACKUP DATABASE db1 TO 'db1.bkp';
--exec $MYSQL_BACKUP --snapshots $bdir/db1.bkp

DROP DATABASE db1;
---------------------------------------------------------

and wath the output of mysqlbackup utility:
---------------------------------------------------------
...
Image version:       1
Creation time:       2009-03-03 08:37:01 UTC
Server version:      6.0.11 (6.0.11-alpha)
Server byte order:   little-endian
Server charset:      'utf8'
Snapshot count:      1

Snapshots:

  Snapshot 0 type    native from 'MyISAM'  version 1.0
  Snapshot 0 version 1
  Snapshot 0 tables  1           <---- this is wrong, should be 3
  Snapshot 0 table   'db1'.'t1'
  Snapshot 0 table   'db1'.'t2'
  Snapshot 0 table   'db1'.'t3'
---------------------------------------------------------
[3 Mar 18:01] Chuck Bell
Is this a problem in the backup code or the mysqlbackup utility? Please specify and
provide any ideas/suggestions for fixes.
[4 Mar 7:36] Rafal Somla
This is not a problem in mysqlbackup utility, but the number stored in the image is
wrong.

I think the developer who gets assigned to this bug will investigate it and then can
suggest a solution. I have no ideas right now. I would start looking at methods
Logger::report_stats_{pre,post} in logger.c and how they are called from kernel.cc.
[14 Apr 23:09] Chuck Bell
The problem is here:

/** 
  Return number of entries in the dynamic array.
 
  @note Some of the entries can store NULL pointers as no mapping was
  defined for them.
 */
template<class T>
inline
ulong Map<uint,T>::count() const
{ return Base::array.elements; }

elements is always 1.
[15 Apr 0:13] Chuck Bell
Have solution. Checking with reviewer for design approval.
[15 Apr 22:25] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/72218

2797 Chuck Bell	2009-04-15
      BUG#43324 : Wrong table count per snapshot stored in backup image
      
      The wrong table count is being written to the stream.
      When the backup client reads the stream it produces the
      wrong output. The table count always returned 1.
      
      This is because the code was counting the tables in the
      add_snapshot() method which is only called once.
      
      This patch moves the table counting code to allow proper
      counting of the tables in the snapshot.
      
      As a result, the backup client test results have been
      corrected as well.
      modified:
        mysql-test/suite/backup/r/backup_client.result
        mysql-test/suite/backup/r/backup_client_binlog.result
        sql/backup/image_info.cc
[16 Apr 7:14] Rafal Somla
Good to push.
[16 Apr 21:01] Ingo Strüwing
Approved. No comments.
[23 Apr 9:18] Bugs System
Pushed into 6.0.11-alpha (revid:alik@sun.com-20090423070920-e5lq3vrrqi016z2c) (version
source revid:alik@sun.com-20090423070920-e5lq3vrrqi016z2c) (merge vers: 6.0.11-alpha)
(pib:6)
[26 Apr 2:04] Paul DuBois
Noted in 6.0.11 changelog.

BACKUP DATABASE stored incorrect table counts in the backup image.