Commit f48b10f3 authored by brian@zim.(none)'s avatar brian@zim.(none)
Browse files

Dean noticed that constant flush calls caused the archive stream file to flush...

Dean noticed that constant flush calls caused the archive stream file to flush empty buffers. This patch removes that behavior. 
parent 4cbad914
Loading
Loading
Loading
Loading
+32 −11
Original line number Diff line number Diff line
@@ -396,6 +396,7 @@ ARCHIVE_SHARE *ha_archive::get_share(const char *table_name,
    share->table_name_length= length;
    share->table_name= tmp_name;
    share->crashed= FALSE;
    share->archive_write_open= FALSE;
    fn_format(share->data_file_name,table_name,"",ARZ,MY_REPLACE_EXT|MY_UNPACK_FILENAME);
    fn_format(meta_file_name,table_name,"",ARM,MY_REPLACE_EXT|MY_UNPACK_FILENAME);
    strmov(share->table_name,table_name);
@@ -413,16 +414,7 @@ ARCHIVE_SHARE *ha_archive::get_share(const char *table_name,
    */
    if (read_meta_file(share->meta_file, &share->rows_recorded))
      share->crashed= TRUE;
    else
      (void)write_meta_file(share->meta_file, share->rows_recorded, TRUE);

    /* 
      It is expensive to open and close the data files and since you can't have
      a gzip file that can be both read and written we keep a writer open
      that is shared amoung all open tables.
    */
    if ((share->archive_write= gzopen(share->data_file_name, "ab")) == NULL)
      share->crashed= TRUE;
    VOID(my_hash_insert(&archive_open_tables, (byte*) share));
    thr_lock_init(&share->lock);
  }
@@ -460,6 +452,7 @@ int ha_archive::free_share(ARCHIVE_SHARE *share)
      (void)write_meta_file(share->meta_file, share->rows_recorded, TRUE);
    else
      (void)write_meta_file(share->meta_file, share->rows_recorded, FALSE);
    if (share->archive_write_open)
      if (gzclose(share->archive_write) == Z_ERRNO)
        rc= 1;
    if (my_close(share->meta_file, MYF(0)))
@@ -471,6 +464,26 @@ int ha_archive::free_share(ARCHIVE_SHARE *share)
  DBUG_RETURN(rc);
}

int ha_archive::init_archive_writer()
{
  DBUG_ENTER("ha_archive::init_archive_writer");
  (void)write_meta_file(share->meta_file, share->rows_recorded, TRUE);

  /* 
    It is expensive to open and close the data files and since you can't have
    a gzip file that can be both read and written we keep a writer open
    that is shared amoung all open tables.
  */
  if ((share->archive_write= gzopen(share->data_file_name, "ab")) == NULL)
  {
    share->crashed= TRUE;
    DBUG_RETURN(1);
  }
  share->archive_write_open= TRUE;

  DBUG_RETURN(0);
}


/*
  We just implement one additional file extension.
@@ -693,6 +706,10 @@ int ha_archive::write_row(byte *buf)
  if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT)
    table->timestamp_field->set_time();
  pthread_mutex_lock(&share->mutex);
  if (!share->archive_write_open)
    if (init_archive_writer())
      DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);

  share->rows_recorded++;
  rc= real_write_row(buf, share->archive_write);
  pthread_mutex_unlock(&share->mutex);
@@ -893,6 +910,10 @@ int ha_archive::optimize(THD* thd, HA_CHECK_OPT* check_opt)
  gzFile writer;
  char writer_filename[FN_REFLEN];

  /* Open up the writer if we haven't yet */
  if (!share->archive_write_open)
    init_archive_writer();

  /* Flush any waiting data */
  gzflush(share->archive_write, Z_SYNC_FLUSH);

+2 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ typedef struct st_archive_share {
  THR_LOCK lock;
  File meta_file;           /* Meta file we use */
  gzFile archive_write;     /* Archive file we are working with */
  bool archive_write_open;
  bool dirty;               /* Flag for if a flush should occur */
  bool crashed;             /* Meta file is crashed */
  ha_rows rows_recorded;    /* Number of rows in tables */
@@ -87,6 +88,7 @@ class ha_archive: public handler
  int write_meta_file(File meta_file, ha_rows rows, bool dirty);
  ARCHIVE_SHARE *get_share(const char *table_name, TABLE *table, int *rc);
  int free_share(ARCHIVE_SHARE *share);
  int init_archive_writer();
  bool auto_repair() const { return 1; } // For the moment we just do this
  int read_data_header(gzFile file_to_read);
  int write_data_header(gzFile file_to_write);