|
@@ -27,6 +27,7 @@ import java.util.HashMap;
|
|
|
import java.util.Stack;
|
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
|
|
|
|
+import org.apache.hadoop.util.Time;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
@@ -40,6 +41,7 @@ public class DataSetLockManager implements DataNodeLockManager<AutoCloseDataSetL
|
|
|
private boolean isFair = true;
|
|
|
private final boolean openLockTrace;
|
|
|
private Exception lastException;
|
|
|
+ private DataNode datanode;
|
|
|
|
|
|
/**
|
|
|
* Class for maintain lockMap and is thread safe.
|
|
@@ -143,17 +145,18 @@ public class DataSetLockManager implements DataNodeLockManager<AutoCloseDataSetL
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public DataSetLockManager(Configuration conf) {
|
|
|
+ public DataSetLockManager() {
|
|
|
+ this.openLockTrace = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public DataSetLockManager(Configuration conf, DataNode dn) {
|
|
|
this.isFair = conf.getBoolean(
|
|
|
DFSConfigKeys.DFS_DATANODE_LOCK_FAIR_KEY,
|
|
|
DFSConfigKeys.DFS_DATANODE_LOCK_FAIR_DEFAULT);
|
|
|
this.openLockTrace = conf.getBoolean(
|
|
|
DFSConfigKeys.DFS_DATANODE_LOCKMANAGER_TRACE,
|
|
|
DFSConfigKeys.DFS_DATANODE_LOCKMANAGER_TRACE_DEFAULT);
|
|
|
- }
|
|
|
-
|
|
|
- public DataSetLockManager() {
|
|
|
- this.openLockTrace = true;
|
|
|
+ this.datanode = dn;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -214,6 +217,7 @@ public class DataSetLockManager implements DataNodeLockManager<AutoCloseDataSetL
|
|
|
* Return a not null ReadLock.
|
|
|
*/
|
|
|
private AutoCloseDataSetLock getReadLock(LockLevel level, String... resources) {
|
|
|
+ long startTimeNanos = Time.monotonicNowNanos();
|
|
|
String lockName = generateLockName(level, resources);
|
|
|
AutoCloseDataSetLock lock = lockMap.getReadLock(lockName);
|
|
|
if (lock == null) {
|
|
@@ -226,6 +230,9 @@ public class DataSetLockManager implements DataNodeLockManager<AutoCloseDataSetL
|
|
|
if (openLockTrace) {
|
|
|
putThreadName(getThreadName());
|
|
|
}
|
|
|
+ if (datanode != null) {
|
|
|
+ datanode.metrics.addAcquireDataSetReadLock(Time.monotonicNowNanos() - startTimeNanos);
|
|
|
+ }
|
|
|
return lock;
|
|
|
}
|
|
|
|
|
@@ -233,6 +240,7 @@ public class DataSetLockManager implements DataNodeLockManager<AutoCloseDataSetL
|
|
|
* Return a not null WriteLock.
|
|
|
*/
|
|
|
private AutoCloseDataSetLock getWriteLock(LockLevel level, String... resources) {
|
|
|
+ long startTimeNanos = Time.monotonicNowNanos();
|
|
|
String lockName = generateLockName(level, resources);
|
|
|
AutoCloseDataSetLock lock = lockMap.getWriteLock(lockName);
|
|
|
if (lock == null) {
|
|
@@ -245,6 +253,9 @@ public class DataSetLockManager implements DataNodeLockManager<AutoCloseDataSetL
|
|
|
if (openLockTrace) {
|
|
|
putThreadName(getThreadName());
|
|
|
}
|
|
|
+ if (datanode != null) {
|
|
|
+ datanode.metrics.addAcquireDataSetWriteLock(Time.monotonicNowNanos() - startTimeNanos);
|
|
|
+ }
|
|
|
return lock;
|
|
|
}
|
|
|
|