|
@@ -275,7 +275,7 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
* that are currently being written by this client.
|
|
|
* Note that a file can only be written by a single client.
|
|
|
*/
|
|
|
- private final Map<Long, DFSOutputStream> filesBeingWritten = new HashMap<>();
|
|
|
+ private final Map<String, DFSOutputStream> filesBeingWritten = new HashMap<>();
|
|
|
|
|
|
/**
|
|
|
* Same as this(NameNode.getNNAddress(conf), conf);
|
|
@@ -502,9 +502,9 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
}
|
|
|
|
|
|
/** Get a lease and start automatic renewal */
|
|
|
- private void beginFileLease(final long inodeId, final DFSOutputStream out) {
|
|
|
+ private void beginFileLease(final String key, final DFSOutputStream out) {
|
|
|
synchronized (filesBeingWritten) {
|
|
|
- putFileBeingWritten(inodeId, out);
|
|
|
+ putFileBeingWritten(key, out);
|
|
|
LeaseRenewer renewer = getLeaseRenewer();
|
|
|
boolean result = renewer.put(this);
|
|
|
if (!result) {
|
|
@@ -518,9 +518,9 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
}
|
|
|
|
|
|
/** Stop renewal of lease for the file. */
|
|
|
- void endFileLease(final long inodeId) {
|
|
|
+ void endFileLease(final String renewLeaseKey) {
|
|
|
synchronized (filesBeingWritten) {
|
|
|
- removeFileBeingWritten(inodeId);
|
|
|
+ removeFileBeingWritten(renewLeaseKey);
|
|
|
// remove client from renewer if no files are open
|
|
|
if (filesBeingWritten.isEmpty()) {
|
|
|
getLeaseRenewer().closeClient(this);
|
|
@@ -532,10 +532,10 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
* enforced to consistently update its local dfsclients array and
|
|
|
* client's filesBeingWritten map.
|
|
|
*/
|
|
|
- public void putFileBeingWritten(final long inodeId,
|
|
|
+ public void putFileBeingWritten(final String key,
|
|
|
final DFSOutputStream out) {
|
|
|
synchronized(filesBeingWritten) {
|
|
|
- filesBeingWritten.put(inodeId, out);
|
|
|
+ filesBeingWritten.put(key, out);
|
|
|
// update the last lease renewal time only when there was no
|
|
|
// writes. once there is one write stream open, the lease renewer
|
|
|
// thread keeps it updated well with in anyone's expiration time.
|
|
@@ -546,9 +546,9 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
}
|
|
|
|
|
|
/** Remove a file. Only called from LeaseRenewer. */
|
|
|
- public void removeFileBeingWritten(final long inodeId) {
|
|
|
+ public void removeFileBeingWritten(final String key) {
|
|
|
synchronized(filesBeingWritten) {
|
|
|
- filesBeingWritten.remove(inodeId);
|
|
|
+ filesBeingWritten.remove(key);
|
|
|
if (filesBeingWritten.isEmpty()) {
|
|
|
lastLeaseRenewal = 0;
|
|
|
}
|
|
@@ -580,6 +580,13 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @VisibleForTesting
|
|
|
+ public int getNumOfFilesBeingWritten() {
|
|
|
+ synchronized (filesBeingWritten) {
|
|
|
+ return filesBeingWritten.size();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Get all namespaces of DFSOutputStreams.
|
|
|
*/
|
|
@@ -640,14 +647,14 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
/** Close/abort all files being written. */
|
|
|
public void closeAllFilesBeingWritten(final boolean abort) {
|
|
|
for(;;) {
|
|
|
- final long inodeId;
|
|
|
+ final String key;
|
|
|
final DFSOutputStream out;
|
|
|
synchronized(filesBeingWritten) {
|
|
|
if (filesBeingWritten.isEmpty()) {
|
|
|
return;
|
|
|
}
|
|
|
- inodeId = filesBeingWritten.keySet().iterator().next();
|
|
|
- out = filesBeingWritten.remove(inodeId);
|
|
|
+ key = filesBeingWritten.keySet().iterator().next();
|
|
|
+ out = filesBeingWritten.remove(key);
|
|
|
}
|
|
|
if (out != null) {
|
|
|
try {
|
|
@@ -658,7 +665,7 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
}
|
|
|
} catch(IOException ie) {
|
|
|
LOG.error("Failed to " + (abort ? "abort" : "close") + " file: "
|
|
|
- + out.getSrc() + " with inode: " + inodeId, ie);
|
|
|
+ + out.getSrc() + " with renewLeaseKey: " + key, ie);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1297,7 +1304,7 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
src, masked, flag, createParent, replication, blockSize, progress,
|
|
|
dfsClientConf.createChecksum(checksumOpt),
|
|
|
getFavoredNodesStr(favoredNodes), ecPolicyName, storagePolicy);
|
|
|
- beginFileLease(result.getFileId(), result);
|
|
|
+ beginFileLease(result.getUniqKey(), result);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -1352,7 +1359,7 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
flag, createParent, replication, blockSize, progress, checksum,
|
|
|
null, null, null);
|
|
|
}
|
|
|
- beginFileLease(result.getFileId(), result);
|
|
|
+ beginFileLease(result.getUniqKey(), result);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -1497,7 +1504,7 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
checkOpen();
|
|
|
final DFSOutputStream result = callAppend(src, flag, progress,
|
|
|
favoredNodes);
|
|
|
- beginFileLease(result.getFileId(), result);
|
|
|
+ beginFileLease(result.getUniqKey(), result);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -2418,8 +2425,8 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
|
|
}
|
|
|
|
|
|
@VisibleForTesting
|
|
|
- ExtendedBlock getPreviousBlock(long fileId) {
|
|
|
- return filesBeingWritten.get(fileId).getBlock();
|
|
|
+ ExtendedBlock getPreviousBlock(String key) {
|
|
|
+ return filesBeingWritten.get(key).getBlock();
|
|
|
}
|
|
|
|
|
|
/**
|