Skip to content

Commit

Permalink
Add a command to set DirectChildrenLoaded on dir
Browse files Browse the repository at this point in the history
```
$ bin/alluxio fs syncDirNextTime true /data
Successfully marked the dir /data to trigger metadata sync on next
access

$ bin/alluxio fs syncDirNextTime false /data
Successfully marked the dir /data to skip metadata sync on next access
```

pr-link: #16542
change-id: cid-78744676d83727f380d4c7a4ef7206044001a5fa
  • Loading branch information
maobaolong committed Dec 16, 2022
1 parent 0170784 commit 8228341
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -4074,6 +4074,10 @@ protected void setAttributeSingleFile(RpcContext rpcContext, LockedInodePath ino
throws FileDoesNotExistException, InvalidPathException, AccessControlException {
Inode inode = inodePath.getInode();
SetAttributePOptions.Builder protoOptions = context.getOptions();
if (inode.isDirectory() && protoOptions.hasDirectChildrenLoaded()) {
mInodeTree.setDirectChildrenLoaded(
rpcContext, inode.asDirectory(), protoOptions.getDirectChildrenLoaded());
}
if (protoOptions.hasPinned()) {
mInodeTree.setPinned(rpcContext, inodePath, context.getOptions().getPinned(),
context.getOptions().getPinnedMediaList(), opTimeMs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -293,9 +293,21 @@ public Map<Long, Number> getFileSizeHistogram() {
* @param dir the inode directory
*/
public void setDirectChildrenLoaded(Supplier<JournalContext> context, InodeDirectory dir) {
setDirectChildrenLoaded(context, dir, true);
}

/**
* Marks an inode directory as having its direct children loaded or not.
*
* @param context journal context supplier
* @param dir the inode directory
* @param directChildrenLoaded whether to load the direct children if they were not loaded before
*/
public void setDirectChildrenLoaded(Supplier<JournalContext> context, InodeDirectory dir,
boolean directChildrenLoaded) {
mState.applyAndJournal(context, UpdateInodeDirectoryEntry.newBuilder()
.setId(dir.getId())
.setDirectChildrenLoaded(true)
.setDirectChildrenLoaded(directChildrenLoaded)
.build());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,7 @@ message SetAttributePOptions {
repeated string pinnedMedia = 10;
map<string, bytes> xattr = 11;
optional alluxio.proto.journal.XAttrUpdateStrategy xattrUpdateStrategy = 12;
optional bool directChildrenLoaded = 13;
}
message SetAttributePRequest {
/** the path of the file */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,21 @@ public static void setPinned(FileSystem fs, AlluxioURI path, boolean pinned,
.build();
fs.setAttribute(path, options);
}

/**
* Sets direct children loaded.
*
* @param fs The {@link FileSystem} client
* @param path The {@link AlluxioURI} path as the input of the command
* @param directChildrenLoaded true or false
*/
public static void setDirectChildrenLoaded(FileSystem fs, AlluxioURI path,
boolean directChildrenLoaded)
throws AlluxioException, IOException {
SetAttributePOptions options = SetAttributePOptions.newBuilder()
.setRecursive(false)
.setDirectChildrenLoaded(directChildrenLoaded)
.build();
fs.setAttribute(path, options);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/

package alluxio.cli.fs.command;

import alluxio.AlluxioURI;
import alluxio.annotation.PublicApi;
import alluxio.cli.CommandUtils;
import alluxio.client.file.FileSystemContext;
import alluxio.exception.AlluxioException;
import alluxio.exception.status.InvalidArgumentException;

import org.apache.commons.cli.CommandLine;

import java.io.IOException;
import javax.annotation.concurrent.ThreadSafe;

/**
* Sync direct children next time command.
*/
@ThreadSafe
@PublicApi
public final class SyncDirNextTimeCommand extends AbstractFileSystemCommand {

private boolean mSyncNextTime;

/**
* @param fsContext the filesystem of Alluxio
*/
public SyncDirNextTimeCommand(FileSystemContext fsContext) {
super(fsContext);
}

@Override
public String getCommandName() {
return "syncDirNextTime";
}

@Override
public void validateArgs(CommandLine cl) throws InvalidArgumentException {
CommandUtils.checkNumOfArgsEquals(this, cl, 2);
}

@Override
protected void runPlainPath(AlluxioURI path, CommandLine cl)
throws AlluxioException, IOException {
FileSystemCommandUtils.setDirectChildrenLoaded(mFileSystem, path, mSyncNextTime);
System.out.format("Successfully marked the dir %s to %s%n", path,
mSyncNextTime ? "trigger metadata sync on next access"
: "skip metadata sync on next access");
}

@Override
public int run(CommandLine cl) throws AlluxioException, IOException {
String[] args = cl.getArgs();
mSyncNextTime = Boolean.parseBoolean(args[0]);
runWildCardCmd(new AlluxioURI(args[1]), cl);
return 0;
}

@Override
public String getUsage() {
return "syncDirNextTime <true|false> <path>\n"
+ "\ttrue means the next access will trigger a metadata sync on the dir"
+ "\tfalse means the next metadata sync is disabled";
}

@Override
public String getDescription() {
return "Marks a directory to either trigger a metadata sync or skip the "
+ "metadata sync on next access.";
}
}

0 comments on commit 8228341

Please sign in to comment.