Author: jbellis
Date: Tue Sep 29 03:33:16 2009
New Revision: 819823

URL: http://svn.apache.org/viewvc?rev=819823&view=rev
Log:
rename oldCommitLogHeader -> header. don't assume that flush happened on 
current CL segment.  patch by jbellis; reviewed by junrao for CASSANDRA-459

Modified:
    
incubator/cassandra/branches/cassandra-0.4/src/java/org/apache/cassandra/db/CommitLog.java

Modified: 
incubator/cassandra/branches/cassandra-0.4/src/java/org/apache/cassandra/db/CommitLog.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.4/src/java/org/apache/cassandra/db/CommitLog.java?rev=819823&r1=819822&r2=819823&view=diff
==============================================================================
--- 
incubator/cassandra/branches/cassandra-0.4/src/java/org/apache/cassandra/db/CommitLog.java
 (original)
+++ 
incubator/cassandra/branches/cassandra-0.4/src/java/org/apache/cassandra/db/CommitLog.java
 Tue Sep 29 03:33:16 2009
@@ -465,13 +465,11 @@
         if (logger_.isDebugEnabled())
             logger_.debug("discard completed log segments for " + cLogCtx + ", 
column family " + id + ". CFIDs are " + 
Table.TableMetadata.getColumnFamilyIDString());
         /* retrieve the commit log header associated with the file in the 
context */
-        CommitLogHeader commitLogHeader = clHeaders_.get(cLogCtx.file);
-        if (commitLogHeader == null)
+        if (clHeaders_.get(cLogCtx.file) == null)
         {
             if (logFile_.equals(cLogCtx.file))
             {
                 /* this means we are dealing with the current commit log. */
-                commitLogHeader = clHeader_;
                 clHeaders_.put(cLogCtx.file, clHeader_);
             }
             else
@@ -486,7 +484,7 @@
          * flush position, so verify that this flush happens after the last.
          * (Currently Memtables are flushed on a single thread so this should 
be fine.)
         */
-        assert cLogCtx.position >= commitLogHeader.getPosition(id);
+        assert cLogCtx.position >= 
clHeaders_.get(cLogCtx.file).getPosition(id);
 
         /* Sort the commit logs based on creation time */
         List<String> oldFiles = new ArrayList<String>(clHeaders_.keySet());
@@ -500,6 +498,7 @@
         */
         for (String oldFile : oldFiles)
         {
+            CommitLogHeader header = clHeaders_.get(oldFile);
             if (oldFile.equals(cLogCtx.file))
             {
                 // we can't just mark the segment where the flush happened 
clean,
@@ -507,15 +506,21 @@
                 // started and when it finished. so mark the flush position as
                 // the replay point for this CF, instead.
                 if (logger_.isDebugEnabled())
-                    logger_.debug("Marking replay position on current commit 
log " + oldFile);
-                commitLogHeader.turnOn(id, cLogCtx.position);
-                seekAndWriteCommitLogHeader(commitLogHeader.toByteArray());
+                    logger_.debug("Marking replay position " + 
cLogCtx.position + " on commit log " + oldFile);
+                header.turnOn(id, cLogCtx.position);
+                if (oldFile.equals(logFile_))
+                {
+                    seekAndWriteCommitLogHeader(header.toByteArray());
+                }
+                else
+                {
+                    writeOldCommitLogHeader(oldFile, header);
+                }
                 break;
             }
 
-           CommitLogHeader oldCommitLogHeader = clHeaders_.get(oldFile);
-           oldCommitLogHeader.turnOff(id);
-           if (oldCommitLogHeader.isSafeToDelete())
+            header.turnOff(id);
+            if (header.isSafeToDelete())
            {
                if (logger_.isDebugEnabled())
                  logger_.debug("Deleting commit log:" + oldFile);
@@ -525,14 +530,19 @@
            else
            {
                if (logger_.isDebugEnabled())
-                   logger_.debug("Not safe to delete commit log " + oldFile + 
"; dirty is " + oldCommitLogHeader.dirtyString());
-               RandomAccessFile logWriter = CommitLog.createWriter(oldFile);
-               writeCommitLogHeader(logWriter, 
oldCommitLogHeader.toByteArray());
-               logWriter.close();
+                    logger_.debug("Not safe to delete commit log " + oldFile + 
"; dirty is " + header.dirtyString());
+                writeOldCommitLogHeader(oldFile, header);
            }
         }
     }
 
+    private void writeOldCommitLogHeader(String oldFile, CommitLogHeader 
header) throws IOException
+    {
+        BufferedRandomAccessFile logWriter = CommitLog.createWriter(oldFile);
+        writeCommitLogHeader(logWriter, header.toByteArray());
+        logWriter.close();
+    }
+
     private boolean maybeRollLog() throws IOException
     {
         if (logWriter_.length() >= SEGMENT_SIZE)


Reply via email to