You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2009/09/29 05:33:17 UTC

svn commit: r819823 - /incubator/cassandra/branches/cassandra-0.4/src/java/org/apache/cassandra/db/CommitLog.java

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)