[prev in list] [next in list] [prev in thread] [next in thread]
List: slide-dev
Subject: cvs commit: jakarta-slide/lib commons-transaction-20041031.jar
From: ozeigermann () apache ! org
Date: 2004-10-31 11:32:44
Message-ID: 20041031113244.97811.qmail () minotaur ! apache ! org
[Download RAW message or body]
ozeigermann 2004/10/31 03:32:44
Modified: src/webdav/server/org/apache/slide/webdav/method
MkworkspaceMethod.java UpdateMethod.java
SearchMethod.java BindMethod.java
AbstractWebdavMethod.java LabelMethod.java
UnbindMethod.java RebindMethod.java
Added: lib commons-transaction-20041031.jar
Log:
Made global search lock idea more general and expanded this to
all global write lock methods.
Required modification of commons tx lib with new compatibility mode -
replaced jar with newest version.
Revision Changes Path
1.15 +4 -4 \
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/MkworkspaceMethod.java \
Index: MkworkspaceMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/MkworkspaceMethod.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- MkworkspaceMethod.java 26 Oct 2004 20:34:47 -0000 1.14
+++ MkworkspaceMethod.java 31 Oct 2004 11:32:39 -0000 1.15
@@ -67,7 +67,7 @@
*/
public void acquireFineGrainLocks() {
// TODO a global write lock is certainly too much, but I have no better \
idea (OZ)
- acquireLock("/", WRITE_LOCK);
+ acquireGlobalWriteLock();
}
/**
1.34 +4 -4 \
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/UpdateMethod.java
Index: UpdateMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/UpdateMethod.java,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- UpdateMethod.java 26 Oct 2004 20:34:47 -0000 1.33
+++ UpdateMethod.java 31 Oct 2004 11:32:39 -0000 1.34
@@ -115,7 +115,7 @@
*/
public void acquireFineGrainLocks() {
// TODO a global write lock is certainly too much, but I have no better \
idea (OZ)
- acquireLock("/", WRITE_LOCK);
+ acquireGlobalWriteLock();
}
/**
1.50 +4 -4 \
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/SearchMethod.java
Index: SearchMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/SearchMethod.java,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -r1.49 -r1.50
--- SearchMethod.java 26 Oct 2004 20:06:01 -0000 1.49
+++ SearchMethod.java 31 Oct 2004 11:32:39 -0000 1.50
@@ -95,7 +95,7 @@
* @see org.apache.slide.webdav.method.FineGrainedLockingMethod#acquireFineGrainLocks()
*/
public void acquireFineGrainLocks() {
- acquireSearchLock();
+ acquireGlobalReadLock();
}
/**
1.20 +4 -4 \
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/BindMethod.java
Index: BindMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/BindMethod.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- BindMethod.java 26 Oct 2004 20:34:47 -0000 1.19
+++ BindMethod.java 31 Oct 2004 11:32:39 -0000 1.20
@@ -73,7 +73,7 @@
*/
public void acquireFineGrainLocks() {
// TODO a global write lock is certainly too much, but I have no better \
idea (OZ)
- acquireLock("/", WRITE_LOCK);
+ acquireGlobalWriteLock();
}
/**
1.59 +77 -24 \
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/AbstractWebdavMethod.java
Index: AbstractWebdavMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/AbstractWebdavMethod.java,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- AbstractWebdavMethod.java 29 Oct 2004 20:17:14 -0000 1.58
+++ AbstractWebdavMethod.java 31 Oct 2004 11:32:39 -0000 1.59
@@ -155,12 +155,13 @@
new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US)
};
+ private static final int LOCK_LOG_LEVEL = Logger.INFO;
+
protected static final int READ_LOCK = 1;
protected static final int WRITE_LOCK = 2;
- private static final int SHARED_SEARCH_LOCK = 1;
- private static final int NO_WRITE_SEARCH_LOCK = 2;
- private static final int EXCLUSIVE_SEARCH_LOCK = 3;
+ private static final int SHARED_LOCK = 1;
+ private static final int EXCLUSIVE_LOCK = 2;
// global read/write lock to allow for deadlock-free access
private static final MultiLevelLock GLOBAL_LOCK = new GenericLock("global", \
WRITE_LOCK, @@ -172,15 +173,12 @@
private static final LockManager FINE_LOCK_MANAGER = new \
GenericLockManager(WRITE_LOCK,
new PrintWriterLogger(new PrintWriter(System.out), LOG_CHANNEL, \
false));
- // global search lock to deny write access while searching
- // XXX setting the highest lock to more than no write looks wrong, but
- // causes two SEARCH methods
- // to execute concurrently which is what we want - the highest lock level
- // will never be acquired
- private static final GenericLock SEARCH_LOCK = new GenericLock("GLOBAL \
SEARCH",
- WRITE_LOCK + 1, new PrintWriterLogger(new PrintWriter(System.out),
- LOG_CHANNEL, false));
-
+ private static final GenericLock GLOBAL_READ_LOCK = new GenericLock("GLOBAL \
READ", EXCLUSIVE_LOCK, + new PrintWriterLogger(new \
PrintWriter(System.out), LOG_CHANNEL, false)); +
+ private static final GenericLock GLOBAL_WRITE_LOCK = new GenericLock("GLOBAL \
WRITE", EXCLUSIVE_LOCK, + new PrintWriterLogger(new \
PrintWriter(System.out), LOG_CHANNEL, false)); +
// ----------------------------------------------------- Instance Variables
@@ -910,14 +908,45 @@
}
/**
- * Acquires an exclusive search lock to disallow any writing while searching.
- * Should be used by the search method or any other method that does not allow
- * any writing while running.
- *
+ * Acquires a global read lock to disallow any writing.
+ * Should be used by methods that do not allow any writing while running.
*/
- protected void acquireSearchLock() {
- if (this instanceof WriteMethod) {
- acquireLock(SEARCH_LOCK, NO_WRITE_SEARCH_LOCK);
+ protected void acquireGlobalReadLock() {
+ // we should already have this lock, but just to make sure:
+ synchronized (ATOMIC_LOCKING_MONITOR) {
+ // we have a shared global read lock which means we are compatible \
with + // any other read
+ acquireLock(GLOBAL_READ_LOCK, SHARED_LOCK);
+ // this means no other write request may run in parallel, but if \
another global read + // has the lock, we will *not* be blocked
+ blockWithLock(GLOBAL_WRITE_LOCK, EXCLUSIVE_LOCK);
+ }
+ }
+
+ /**
+ * Acquires a global write lock to disallow any concurrent access.
+ */
+ protected void acquireGlobalWriteLock() {
+ // we should already have this lock, but just to make sure:
+ synchronized (ATOMIC_LOCKING_MONITOR) {
+ // we really want to read and write alone:
+ acquireLock(GLOBAL_READ_LOCK, EXCLUSIVE_LOCK);
+ acquireLock(GLOBAL_WRITE_LOCK, EXCLUSIVE_LOCK);
+ }
+ }
+
+ /**
+ * Inhibits a global read lock. Should be called by all fine grain writing \
methods. + */
+ protected void inhibitGlobalReadLock() {
+ // we should already have this lock, but just to make sure:
+ synchronized (ATOMIC_LOCKING_MONITOR) {
+ // we have a shared global write lock which means other fine grained \
write + // methods are compatible
+ acquireLock(GLOBAL_WRITE_LOCK, SHARED_LOCK);
+ // do not allow global read as long as we write to any resource, but
+ // if another global write has the lock, we will *not* be blocked
+ blockWithLock(GLOBAL_READ_LOCK, EXCLUSIVE_LOCK);
}
}
@@ -963,9 +992,10 @@
if (Configuration.useVersionControl() && \
path.startsWith(getHistoryPath())) { acquireLock(getHistoryPath(), READ_LOCK);
}
- // (4) be sure to write only when no search currently takes place
+ // (4) be sure to write only when no search or other global read currently \
takes place + // this is the counter part to acquireSearchLock()
if (this instanceof WriteMethod) {
- acquireLock(SEARCH_LOCK, SHARED_SEARCH_LOCK);
+ inhibitGlobalReadLock();
}
}
@@ -1026,7 +1056,29 @@
locks.add(lock);
token.getLogger().log(Thread.currentThread() +
(level == READ_LOCK ? " read" : " write") + " locking "
- + lock.getResourceId().toString(), LOG_CHANNEL, \
Logger.INFO); + + lock.getResourceId().toString(), \
LOG_CHANNEL, LOCK_LOG_LEVEL); + }
+
+ /**
+ * Acquires a supporting block lock.
+ *
+ * @param lock
+ * the lock to acquire
+ * @param level
+ * either {@link #READ_LOCK} or {@link #WRITE_LOCK}
+ *
+ * @see #acquireLock(String, int)
+ */
+ protected void blockWithLock(GenericLock lock, int level) {
+ try {
+ lock.acquire(this, level, true, \
GenericLock.COMPATIBILITY_REENTRANT_AND_SUPPORT, + \
Long.MAX_VALUE); + } catch (InterruptedException e) {
+ }
+ locks.add(lock);
+ token.getLogger().log(
+ Thread.currentThread() + (level == READ_LOCK ? " read" : " write") \
+ " locking " + + lock.getResourceId().toString(), \
LOG_CHANNEL, LOCK_LOG_LEVEL); }
/**
@@ -1051,8 +1103,9 @@
for (Iterator i = locks.iterator(); i.hasNext();) {
lock = (GenericLock) i.next();
lock.release(this);
- token.getLogger().log(Thread.currentThread() + " releasing " + \
lock.getResourceId().toString(), LOG_CHANNEL,
- Logger.INFO);
+ token.getLogger().log(
+ Thread.currentThread() + " releasing " + \
lock.getResourceId().toString(), + LOG_CHANNEL, LOCK_LOG_LEVEL);
}
}
1.30 +5 -5 \
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/LabelMethod.java
Index: LabelMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/LabelMethod.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- LabelMethod.java 26 Oct 2004 20:34:48 -0000 1.29
+++ LabelMethod.java 31 Oct 2004 11:32:40 -0000 1.30
@@ -131,7 +131,7 @@
*/
public void acquireFineGrainLocks() {
// TODO a global write lock is certainly too much, but I have no better \
idea (OZ)
- acquireLock("/", WRITE_LOCK);
+ acquireGlobalWriteLock();
}
/**
1.17 +4 -4 \
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/UnbindMethod.java
Index: UnbindMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/UnbindMethod.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- UnbindMethod.java 26 Oct 2004 20:34:48 -0000 1.16
+++ UnbindMethod.java 31 Oct 2004 11:32:40 -0000 1.17
@@ -70,7 +70,7 @@
*/
public void acquireFineGrainLocks() {
// TODO a global write lock is certainly too much, but I have no better \
idea (OZ)
- acquireLock("/", WRITE_LOCK);
+ acquireGlobalWriteLock();
}
/**
1.18 +4 -4 \
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/RebindMethod.java
Index: RebindMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/RebindMethod.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- RebindMethod.java 26 Oct 2004 20:34:48 -0000 1.17
+++ RebindMethod.java 31 Oct 2004 11:32:40 -0000 1.18
@@ -76,7 +76,7 @@
*/
public void acquireFineGrainLocks() {
// TODO a global write lock is certainly too much, but I have no better \
idea (OZ)
- acquireLock("/", WRITE_LOCK);
+ acquireGlobalWriteLock();
}
/**
1.1 jakarta-slide/lib/commons-transaction-20041031.jar
<<Binary file>>
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic