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)