diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc
index e39ee976eb1..f3f20f6b103 100644
--- a/storage/archive/ha_archive.cc
+++ b/storage/archive/ha_archive.cc
@@ -1239,7 +1239,7 @@ int ha_archive::repair(THD* thd, HA_CHECK_OPT* check_opt)
 int ha_archive::optimize(THD* thd, HA_CHECK_OPT* check_opt)
 {
   DBUG_ENTER("ha_archive::optimize");
-  int rc;
+  int rc= 0;
   azio_stream writer;
   char writer_filename[FN_REFLEN];
 
@@ -1342,7 +1342,20 @@ int ha_archive::optimize(THD* thd, HA_CHECK_OPT* check_opt)
   azclose(&writer);
   share->dirty= FALSE;
   share->forced_flushes= 0;
+  
+  // now we close both our writer and our reader for the rename
   azclose(&(share->archive_write));
+  azclose(&archive);
+
+  // make the file we just wrote be our data file
+  rc = my_rename(writer_filename,share->data_file_name,MYF(0));
+
+  /*
+    now open the shared writer back up
+    we don't check rc here because we want to open the file back up even
+    if the optimize failed but we will return rc below so that we will
+    know it failed.
+  */
   DBUG_PRINT("info", ("Reopening archive data file"));
   if (!(azopen(&(share->archive_write), share->data_file_name, 
                O_WRONLY|O_APPEND|O_BINARY)))
@@ -1352,21 +1365,15 @@ int ha_archive::optimize(THD* thd, HA_CHECK_OPT* check_opt)
     goto error;
   }
 
-  my_rename(writer_filename,share->data_file_name,MYF(0));
-
   /*
     Now we need to reopen our read descriptor since it has changed.
   */
-  azclose(&archive);
   if (!(azopen(&archive, share->data_file_name, O_RDONLY|O_BINARY)))
   {
     rc= HA_ERR_CRASHED_ON_USAGE;
     goto error;
   }
 
-
-  DBUG_RETURN(0); 
-
 error:
   azclose(&writer);