You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2018/01/02 22:45:25 UTC
[directory-mavibot] branch single-value updated: Added the
transaction list,
to be able to have a list of pending revisions when we will be able to clean
them up.
This is an automated email from the ASF dual-hosted git repository.
elecharny pushed a commit to branch single-value
in repository https://gitbox.apache.org/repos/asf/directory-mavibot.git
The following commit(s) were added to refs/heads/single-value by this push:
new 79566e1 Added the transaction list, to be able to have a list of pending revisions when we will be able to clean them up.
79566e1 is described below
commit 79566e1b28efbfb5e4eaeb1a44010137e4932f69
Author: Emmanuel Lécharny <el...@symas.com>
AuthorDate: Tue Jan 2 23:45:23 2018 +0100
Added the transaction list, to be able to have a list of pending
revisions when we will be able to clean them up.
---
.../directory/mavibot/btree/AbstractTransaction.java | 16 ++++++++++++++++
.../directory/mavibot/btree/ReadTransaction.java | 12 ++++++++++++
.../apache/directory/mavibot/btree/RecordManager.java | 12 ++++++++++--
.../directory/mavibot/btree/RecordManagerHeader.java | 4 ++++
.../directory/mavibot/btree/WriteTransaction.java | 18 ++++++++++++++++++
5 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractTransaction.java b/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractTransaction.java
index 8e98d34..4e0664a 100644
--- a/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractTransaction.java
+++ b/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractTransaction.java
@@ -183,6 +183,14 @@ public abstract class AbstractTransaction implements Transaction
public void abort() throws IOException
{
aborted = true;
+
+ // Decrement the counter
+ int txnNumber = recordManagerHeader.txnCounter.getAndDecrement();
+
+ if ( ( txnNumber == 0 ) && ( recordManager.transactionsList.peek().revision != recordManagerHeader.revision ) )
+ {
+ // We can cleanup
+ }
}
@@ -193,6 +201,14 @@ public abstract class AbstractTransaction implements Transaction
public void commit() throws IOException
{
closed = true;
+
+ // Decrement the counter
+ int txnNumber = recordManagerHeader.txnCounter.getAndDecrement();
+
+ if ( ( txnNumber == 0 ) && ( recordManager.transactionsList.peek().revision != recordManagerHeader.revision ) )
+ {
+ // We can cleanup
+ }
}
diff --git a/mavibot/src/main/java/org/apache/directory/mavibot/btree/ReadTransaction.java b/mavibot/src/main/java/org/apache/directory/mavibot/btree/ReadTransaction.java
index d9d0876..947b766 100644
--- a/mavibot/src/main/java/org/apache/directory/mavibot/btree/ReadTransaction.java
+++ b/mavibot/src/main/java/org/apache/directory/mavibot/btree/ReadTransaction.java
@@ -21,6 +21,7 @@ package org.apache.directory.mavibot.btree;
import java.io.Closeable;
+import java.io.IOException;
import java.util.Date;
@@ -71,6 +72,17 @@ public class ReadTransaction extends AbstractTransaction implements Closeable
/**
+ * {@inheritDoc}
+ * @throws IOException
+ */
+ @Override
+ public void close() throws IOException
+ {
+ commit();
+ }
+
+
+ /**
* @see Object#toString()
*/
@Override
diff --git a/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java b/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
index 24285fe..ba06be0 100644
--- a/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
+++ b/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
@@ -26,6 +26,7 @@ import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
+import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
@@ -33,6 +34,7 @@ import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
@@ -178,6 +180,9 @@ public class RecordManager implements TransactionManager
/** The page cache */
private Cache<Long, Page> pageCache;
+
+ /** The active transactions list */
+ Deque<RecordManagerHeader> transactionsList = new ConcurrentLinkedDeque<>();
@@ -598,7 +603,11 @@ public class RecordManager implements TransactionManager
Thread.currentThread().getName() );
}
- return new ReadTransaction( this, timeout );
+ Transaction transaction = new ReadTransaction( this, timeout );
+
+ transaction.getRecordManagerHeader().txnCounter.getAndIncrement();
+
+ return transaction;
}
@@ -625,7 +634,6 @@ public class RecordManager implements TransactionManager
TXN_LOG.debug( "..o The current thread already holds the lock" );
}
- // Create the transaction
return new WriteTransaction( this );
}
diff --git a/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManagerHeader.java b/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManagerHeader.java
index db5ebd0..581e33d 100644
--- a/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManagerHeader.java
+++ b/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManagerHeader.java
@@ -4,6 +4,7 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -73,6 +74,9 @@ public class RecordManagerHeader
/** The offset of the end of the file */
/* no qualifier */long lastOffset = BTreeConstants.NO_PAGE;
+ /** The transaction counter */
+ /* no qualifier */ AtomicInteger txnCounter = new AtomicInteger( 0 );
+
/** The lock used to protect the recordManagerHeader while accessing it */
private ReadWriteLock lock = new ReentrantReadWriteLock();
diff --git a/mavibot/src/main/java/org/apache/directory/mavibot/btree/WriteTransaction.java b/mavibot/src/main/java/org/apache/directory/mavibot/btree/WriteTransaction.java
index 8919846..1303223 100644
--- a/mavibot/src/main/java/org/apache/directory/mavibot/btree/WriteTransaction.java
+++ b/mavibot/src/main/java/org/apache/directory/mavibot/btree/WriteTransaction.java
@@ -177,6 +177,24 @@ public class WriteTransaction extends AbstractTransaction
newPages.clear();
copiedPageMap.clear();
super.close();
+
+ // Finally add the new RecordManagerHeader in the transaction list
+ RecordManagerHeader previousRMH = recordManager.transactionsList.peek();
+
+ recordManager.transactionsList.offerFirst( recordManagerHeader );
+
+ // Corner case : it might be null, if this is the first revision
+ if ( previousRMH != null )
+ {
+ // We may also have to cleanup the previous RMH
+ if ( previousRMH.txnCounter.get() == 0 )
+ {
+ // Ok, we can get read of it
+ recordManager.transactionsList.remove( previousRMH );
+
+ // And we can clean it up
+ }
+ }
}
}
--
To stop receiving notification emails like this one, please contact
['"commits@directory.apache.org" <co...@directory.apache.org>'].