|
@@ -124,8 +124,26 @@ public class LocalDirAllocator {
|
|
|
*/
|
|
|
public Path getLocalPathForWrite(String pathStr, long size,
|
|
|
Configuration conf) throws IOException {
|
|
|
+ return getLocalPathForWrite(pathStr, size, conf, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ /** Get a path from the local FS. Pass size as
|
|
|
+ * SIZE_UNKNOWN if not known apriori. We
|
|
|
+ * round-robin over the set of disks (via the configured dirs) and return
|
|
|
+ * the first complete path which has enough space
|
|
|
+ * @param pathStr the requested path (this will be created on the first
|
|
|
+ * available disk)
|
|
|
+ * @param size the size of the file that is going to be written
|
|
|
+ * @param conf the Configuration object
|
|
|
+ * @param checkWrite ensure that the path is writable
|
|
|
+ * @return the complete path to the file on a local disk
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ public Path getLocalPathForWrite(String pathStr, long size,
|
|
|
+ Configuration conf,
|
|
|
+ boolean checkWrite) throws IOException {
|
|
|
AllocatorPerContext context = obtainContext(contextCfgItemName);
|
|
|
- return context.getLocalPathForWrite(pathStr, size, conf);
|
|
|
+ return context.getLocalPathForWrite(pathStr, size, conf, checkWrite);
|
|
|
}
|
|
|
|
|
|
/** Get a path from the local FS for reading. We search through all the
|
|
@@ -266,18 +284,21 @@ public class LocalDirAllocator {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private Path createPath(String path) throws IOException {
|
|
|
+ private Path createPath(String path,
|
|
|
+ boolean checkWrite) throws IOException {
|
|
|
Path file = new Path(new Path(localDirs[dirNumLastAccessed]),
|
|
|
path);
|
|
|
- //check whether we are able to create a directory here. If the disk
|
|
|
- //happens to be RDONLY we will fail
|
|
|
- try {
|
|
|
- DiskChecker.checkDir(new File(file.getParent().toUri().getPath()));
|
|
|
- return file;
|
|
|
- } catch (DiskErrorException d) {
|
|
|
- LOG.warn(StringUtils.stringifyException(d));
|
|
|
- return null;
|
|
|
+ if (checkWrite) {
|
|
|
+ //check whether we are able to create a directory here. If the disk
|
|
|
+ //happens to be RDONLY we will fail
|
|
|
+ try {
|
|
|
+ DiskChecker.checkDir(new File(file.getParent().toUri().getPath()));
|
|
|
+ } catch (DiskErrorException d) {
|
|
|
+ LOG.warn(StringUtils.stringifyException(d));
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|
|
|
+ return file;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -295,8 +316,10 @@ public class LocalDirAllocator {
|
|
|
* If size is not known, use roulette selection -- pick directories
|
|
|
* with probability proportional to their available space.
|
|
|
*/
|
|
|
- public synchronized Path getLocalPathForWrite(String pathStr, long size,
|
|
|
- Configuration conf) throws IOException {
|
|
|
+ public synchronized
|
|
|
+ Path getLocalPathForWrite(String pathStr, long size,
|
|
|
+ Configuration conf, boolean checkWrite
|
|
|
+ ) throws IOException {
|
|
|
confChanged(conf);
|
|
|
int numDirs = localDirs.length;
|
|
|
int numDirsSearched = 0;
|
|
@@ -328,7 +351,7 @@ public class LocalDirAllocator {
|
|
|
dir++;
|
|
|
}
|
|
|
dirNumLastAccessed = dir;
|
|
|
- returnPath = createPath(pathStr);
|
|
|
+ returnPath = createPath(pathStr, checkWrite);
|
|
|
if (returnPath == null) {
|
|
|
totalAvailable -= availableOnDisk[dir];
|
|
|
availableOnDisk[dir] = 0; // skip this disk
|
|
@@ -339,7 +362,7 @@ public class LocalDirAllocator {
|
|
|
while (numDirsSearched < numDirs && returnPath == null) {
|
|
|
long capacity = dirDF[dirNumLastAccessed].getAvailable();
|
|
|
if (capacity > size) {
|
|
|
- returnPath = createPath(pathStr);
|
|
|
+ returnPath = createPath(pathStr, checkWrite);
|
|
|
}
|
|
|
dirNumLastAccessed++;
|
|
|
dirNumLastAccessed = dirNumLastAccessed % numDirs;
|
|
@@ -365,7 +388,7 @@ public class LocalDirAllocator {
|
|
|
Configuration conf) throws IOException {
|
|
|
|
|
|
// find an appropriate directory
|
|
|
- Path path = getLocalPathForWrite(pathStr, size, conf);
|
|
|
+ Path path = getLocalPathForWrite(pathStr, size, conf, true);
|
|
|
File dir = new File(path.getParent().toUri().getPath());
|
|
|
String prefix = path.getName();
|
|
|
|