You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by dp...@apache.org on 2007/04/27 10:49:26 UTC
svn commit: r533019 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal:
AbstractJournal.java AppendRecord.java DatabaseJournal.java
DefaultRecordProducer.java FileJournal.java
Author: dpfister
Date: Fri Apr 27 01:49:25 2007
New Revision: 533019
URL: http://svn.apache.org/viewvc?view=rev&rev=533019
Log:
JCR-884 - DatabaseJournal assigns same revision id to different revisions
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DefaultRecordProducer.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/FileJournal.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java?view=diff&rev=533019&r1=533018&r2=533019
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java Fri Apr 27 01:49:25 2007
@@ -272,16 +272,27 @@
protected abstract void doLock() throws JournalException;
/**
- * Append a record backed by a file. Subclass responsibility.
+ * Notification method called by an appended record at creation time.
+ * May be overridden by subclasses to save some context information
+ * inside the appended record.
*
- * @param producerId producer identifier
+ * @param record record that was appended
+ */
+ protected void appending(AppendRecord record) {
+ // nothing to be done here
+ }
+
+ /**
+ * Append a record backed by a file. On exit, the new revision must have
+ * been set inside the appended record. Subclass responsibility.
+ *
+ * @param record record to append
* @param in input stream
* @param length number of bytes in input stream
- * @return the new record's revision
*
* @throws JournalException if an error occurs
*/
- protected abstract long append(String producerId, InputStream in, int length)
+ protected abstract void append(AppendRecord record, InputStream in, int length)
throws JournalException;
/**
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java?view=diff&rev=533019&r1=533018&r2=533019
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java Fri Apr 27 01:49:25 2007
@@ -138,6 +138,15 @@
}
/**
+ * Set the revision this record represents.
+ *
+ * @param revision revision
+ */
+ protected void setRevision(long revision) {
+ this.revision = revision;
+ }
+
+ /**
* {@inheritDoc}
*/
public void writeByte(int n) throws JournalException {
@@ -239,7 +248,7 @@
InputStream in = openInput();
try {
- revision = journal.append(producerId, in, length);
+ journal.append(this, in, length);
succeeded = true;
} finally {
try {
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java?view=diff&rev=533019&r1=533018&r2=533019
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java Fri Apr 27 01:49:25 2007
@@ -215,6 +215,11 @@
/**
* {@inheritDoc}
+ * <p/>
+ * This journal is locked by incrementing the current value in the table
+ * named <code>GLOBAL_REVISION</code>, which effectively write-locks this
+ * table. The updated value is then saved away and remembered in the
+ * appended record, because a save may entail multiple appends (JCR-884).
*/
protected void doLock() throws JournalException {
ResultSet rs = null;
@@ -278,22 +283,32 @@
/**
* {@inheritDoc}
+ * <p/>
+ * Save away the locked revision inside the newly appended record.
*/
- protected long append(String producerId, InputStream in, int length)
+ protected void appending(AppendRecord record) {
+ record.setRevision(lockedRevision);
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p/>
+ * We have already saved away the revision for this record.
+ */
+ protected void append(AppendRecord record, InputStream in, int length)
throws JournalException {
try {
try {
insertRevisionStmt.clearParameters();
insertRevisionStmt.clearWarnings();
- insertRevisionStmt.setLong(1, lockedRevision);
+ insertRevisionStmt.setLong(1, record.getRevision());
insertRevisionStmt.setString(2, getId());
- insertRevisionStmt.setString(3, producerId);
+ insertRevisionStmt.setString(3, record.getProducerId());
insertRevisionStmt.setBinaryStream(4, in, length);
insertRevisionStmt.execute();
con.commit();
- return lockedRevision;
} finally {
try {
con.setAutoCommit(true);
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DefaultRecordProducer.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DefaultRecordProducer.java?view=diff&rev=533019&r1=533018&r2=533019
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DefaultRecordProducer.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/DefaultRecordProducer.java Fri Apr 27 01:49:25 2007
@@ -46,12 +46,13 @@
* {@inheritDoc}
*/
public Record append() throws JournalException {
- Record record = null;
+ AppendRecord record = null;
journal.lockAndSync();
try {
record = createRecord();
+ journal.appending(record);
return record;
} finally {
if (record == null) {
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/FileJournal.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/FileJournal.java?view=diff&rev=533019&r1=533018&r2=533019
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/FileJournal.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/FileJournal.java Fri Apr 27 01:49:25 2007
@@ -169,7 +169,7 @@
/**
* {@inheritDoc}
*/
- protected long append(String producerId, InputStream in, int length)
+ protected void append(AppendRecord record, InputStream in, int length)
throws JournalException {
try {
@@ -181,9 +181,10 @@
if (recordLog.isNew()) {
recordLog.init(globalRevision.get());
}
- long revision = recordLog.append(getId(), producerId, in, length);
+ long revision = recordLog.append(getId(),
+ record.getProducerId(), in, length);
globalRevision.set(revision);
- return revision;
+ record.setRevision(revision);
} catch (IOException e) {
String msg = "Unable to append new record to journal '" + journalFile + "'.";