From aaef396b5aee34caa28498b9c50b13815bdb2257 Mon Sep 17 00:00:00 2001
From: unknown <brian@piggy.tangent.org>
Date: Mon, 26 Mar 2007 16:45:17 -0700
Subject: [PATCH] Adjusting locks for concurrency issue (not found, but
 suspect).

storage/archive/ha_archive.cc:
  Adjusted lock positions to handle possible concurrency condition
---
 storage/archive/ha_archive.cc | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc
index 72647b58f54..aaafcc86168 100644
--- a/storage/archive/ha_archive.cc
+++ b/storage/archive/ha_archive.cc
@@ -1003,7 +1003,6 @@ int ha_archive::rnd_init(bool scan)
   /* We rewind the file so that we can read from the beginning if scan */
   if (scan)
   {
-    scan_rows= share->rows_recorded;
     DBUG_PRINT("info", ("archive will retrieve %llu rows", 
                         (unsigned long long) scan_rows));
     stats.records= 0;
@@ -1012,17 +1011,18 @@ int ha_archive::rnd_init(bool scan)
       If dirty, we lock, and then reset/flush the data.
       I found that just calling azflush() doesn't always work.
     */
+    pthread_mutex_lock(&share->mutex);
+    scan_rows= share->rows_recorded;
     if (share->dirty == TRUE)
     {
-      pthread_mutex_lock(&share->mutex);
       if (share->dirty == TRUE)
       {
         DBUG_PRINT("ha_archive", ("archive flushing out rows for scan"));
         azflush(&(share->archive_write), Z_SYNC_FLUSH);
         share->dirty= FALSE;
       }
-      pthread_mutex_unlock(&share->mutex);
     }
+    pthread_mutex_unlock(&share->mutex);
 
     if (read_data_header(&archive))
       DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);