From 9f2f337fcb9b1163dcf54cab2b793c0b78407178 Mon Sep 17 00:00:00 2001 From: Jiri Simsa Date: Tue, 2 Feb 2016 16:33:56 -0800 Subject: [PATCH] Replacing client-side SetAttributeOptions with server-side version and renaming SetStateEntry to SetAttributeEntry. --- .../java/tachyon/master/MasterSource.java | 10 +- .../tachyon/master/file/FileSystemMaster.java | 53 ++-- .../FileSystemMasterClientServiceHandler.java | 6 +- .../file/options/SetAttributeOptions.java | 161 +++++++++++++ .../master/journal/JournalProtoUtils.java | 4 +- .../main/java/tachyon/proto/journal/File.java | 128 +++++----- .../java/tachyon/proto/journal/Journal.java | 228 +++++++++--------- core/server/src/proto/journal/file.proto | 2 +- core/server/src/proto/journal/journal.proto | 2 +- .../java/tachyon/master/MasterSourceTest.java | 9 +- .../master/file/FileSystemMasterTest.java | 32 +-- .../master/file/PermissionCheckTest.java | 10 +- .../file/options/SetAttributeOptionsTest.java | 61 +++++ .../journal/JournalFormatterTestBase.java | 8 +- .../master/journal/JsonJournalEntries.json | 4 +- 15 files changed, 471 insertions(+), 247 deletions(-) create mode 100644 core/server/src/main/java/tachyon/master/file/options/SetAttributeOptions.java create mode 100644 core/server/src/test/java/tachyon/master/file/options/SetAttributeOptionsTest.java diff --git a/core/server/src/main/java/tachyon/master/MasterSource.java b/core/server/src/main/java/tachyon/master/MasterSource.java index 1c92e5f5b633..5a81d5689140 100644 --- a/core/server/src/main/java/tachyon/master/MasterSource.java +++ b/core/server/src/main/java/tachyon/master/MasterSource.java @@ -89,8 +89,8 @@ public class MasterSource implements Source { mMetricRegistry.counter(MetricRegistry.name("MountOps")); private final Counter mRenamePathOps = mMetricRegistry.counter(MetricRegistry.name("RenamePathOps")); - private final Counter mSetStateOps = - mMetricRegistry.counter(MetricRegistry.name("SetStateOps")); + private final Counter mSetAttributeOps = + mMetricRegistry.counter(MetricRegistry.name("SetAttributeOps")); private final Counter mUnmountOps = mMetricRegistry.counter(MetricRegistry.name("UnmountOps")); @@ -403,12 +403,12 @@ public void incRenamePathOps(long n) { } /** - * Increments the counter of set state RPCs. + * Increments the counter of set attribute RPCs. * * @param n the increment */ - public void incSetStateOps(long n) { - mSetStateOps.inc(n); + public void incSetAttributeOps(long n) { + mSetAttributeOps.inc(n); } /** diff --git a/core/server/src/main/java/tachyon/master/file/FileSystemMaster.java b/core/server/src/main/java/tachyon/master/file/FileSystemMaster.java index bb602bb0dde4..6a7b0cb0130d 100644 --- a/core/server/src/main/java/tachyon/master/file/FileSystemMaster.java +++ b/core/server/src/main/java/tachyon/master/file/FileSystemMaster.java @@ -42,7 +42,6 @@ import tachyon.Constants; import tachyon.TachyonURI; -import tachyon.client.file.options.SetAttributeOptions; import tachyon.collections.Pair; import tachyon.collections.PrefixList; import tachyon.conf.TachyonConf; @@ -78,6 +77,7 @@ import tachyon.master.file.options.CreateDirectoryOptions; import tachyon.master.file.options.CreateFileOptions; import tachyon.master.file.options.SetAclOptions; +import tachyon.master.file.options.SetAttributeOptions; import tachyon.master.journal.Journal; import tachyon.master.journal.JournalOutputStream; import tachyon.master.journal.JournalProtoUtils; @@ -94,7 +94,7 @@ import tachyon.proto.journal.File.ReinitializeFileEntry; import tachyon.proto.journal.File.RenameEntry; import tachyon.proto.journal.File.SetAclEntry; -import tachyon.proto.journal.File.SetStateEntry; +import tachyon.proto.journal.File.SetAttributeEntry; import tachyon.proto.journal.Journal.JournalEntry; import tachyon.security.User; import tachyon.security.authentication.PlainSaslServer; @@ -248,9 +248,9 @@ public void processJournalEntry(JournalEntry entry) throws IOException { } catch (FileAlreadyCompletedException e) { throw new RuntimeException(e); } - } else if (innerEntry instanceof SetStateEntry) { + } else if (innerEntry instanceof SetAttributeEntry) { try { - setStateFromEntry((SetStateEntry) innerEntry); + setAttributeFromEntry((SetAttributeEntry) innerEntry); } catch (FileDoesNotExistException e) { throw new RuntimeException(e); } @@ -1705,34 +1705,34 @@ public void resetFile(long fileId) } /** - * Sets the file state. + * Sets the file attribute. * - * @param path the path to set state + * @param path the path to set attribute for * @param options attributes to be set, see {@link SetAttributeOptions} * @throws FileDoesNotExistException if the file does not exist * @throws AccessControlException if permission checking fails * @throws InvalidPathException if the given path is invalid */ - public void setState(TachyonURI path, SetAttributeOptions options) + public void setAttribute(TachyonURI path, SetAttributeOptions options) throws FileDoesNotExistException, AccessControlException, InvalidPathException { - MasterContext.getMasterSource().incSetStateOps(1); + MasterContext.getMasterSource().incSetAttributeOps(1); synchronized (mInodeTree) { checkPermission(FileSystemAction.WRITE, path, false); long fileId = mInodeTree.getInodeByPath(path).getId(); long opTimeMs = System.currentTimeMillis(); - setStateInternal(fileId, opTimeMs, options); - SetStateEntry.Builder setState = - SetStateEntry.newBuilder().setId(fileId).setOpTimeMs(opTimeMs); - if (options.hasPinned()) { - setState.setPinned(options.getPinned()); + setAttributeInternal(fileId, opTimeMs, options); + SetAttributeEntry.Builder builder = + SetAttributeEntry.newBuilder().setId(fileId).setOpTimeMs(opTimeMs); + if (options.getPinned() != null) { + builder.setPinned(options.getPinned()); } - if (options.hasTtl()) { - setState.setTtl(options.getTtl()); + if (options.getTtl() != null) { + builder.setTtl(options.getTtl()); } - if (options.hasPersisted()) { - setState.setPersisted(options.getPersisted()); + if (options.getPersisted() != null) { + builder.setPersisted(options.getPersisted()); } - writeJournalEntry(JournalEntry.newBuilder().setSetState(setState).build()); + writeJournalEntry(JournalEntry.newBuilder().setSetAttribute(builder).build()); flushJournal(); } } @@ -1891,7 +1891,7 @@ private List pollFilesToCheckpoint(long workerId) public synchronized FileSystemCommand workerHeartbeat(long workerId, List persistedFiles) throws FileDoesNotExistException, InvalidPathException, AccessControlException { for (long fileId : persistedFiles) { - setState(getPath(fileId), SetAttributeOptions.defaults().setPersisted(true)); + setAttribute(getPath(fileId), new SetAttributeOptions.Builder().setPersisted(true).build()); } // get the files for the given worker to checkpoint @@ -1912,14 +1912,14 @@ public synchronized FileSystemCommand workerHeartbeat(long workerId, List * @param options the method options * @throws FileDoesNotExistException */ - private void setStateInternal(long fileId, long opTimeMs, SetAttributeOptions options) + private void setAttributeInternal(long fileId, long opTimeMs, SetAttributeOptions options) throws FileDoesNotExistException { Inode inode = mInodeTree.getInodeById(fileId); - if (options.hasPinned()) { + if (options.getPinned() != null) { mInodeTree.setPinned(inode, options.getPinned(), opTimeMs); inode.setLastModificationTimeMs(opTimeMs); } - if (options.hasTtl()) { + if (options.getTtl() != null) { Preconditions.checkArgument(inode.isFile(), PreconditionMessage.TTL_ONLY_FOR_FILE); long ttl = options.getTtl(); InodeFile file = (InodeFile) inode; @@ -1930,7 +1930,7 @@ private void setStateInternal(long fileId, long opTimeMs, SetAttributeOptions op file.setLastModificationTimeMs(opTimeMs); } } - if (options.hasPersisted()) { + if (options.getPersisted() != null) { Preconditions.checkArgument(inode.isFile(), PreconditionMessage.PERSIST_ONLY_FOR_FILE); Preconditions.checkArgument(((InodeFile) inode).isCompleted(), PreconditionMessage.FILE_TO_PERSIST_MUST_BE_COMPLETE); @@ -1953,9 +1953,8 @@ private void setStateInternal(long fileId, long opTimeMs, SetAttributeOptions op * @param entry the entry to use * @throws FileDoesNotExistException if the file does not exist */ - // TODO(calvin): Rename SetStateEntry to SetAttributeEntry, do not rely on client side options. - private void setStateFromEntry(SetStateEntry entry) throws FileDoesNotExistException { - SetAttributeOptions options = SetAttributeOptions.defaults(); + private void setAttributeFromEntry(SetAttributeEntry entry) throws FileDoesNotExistException { + SetAttributeOptions.Builder options = new SetAttributeOptions.Builder(); if (entry.hasPinned()) { options.setPinned(entry.getPinned()); } @@ -1965,7 +1964,7 @@ private void setStateFromEntry(SetStateEntry entry) throws FileDoesNotExistExcep if (entry.hasPersisted()) { options.setPersisted(entry.getPersisted()); } - setStateInternal(entry.getId(), entry.getOpTimeMs(), options); + setAttributeInternal(entry.getId(), entry.getOpTimeMs(), options.build()); } /** diff --git a/core/server/src/main/java/tachyon/master/file/FileSystemMasterClientServiceHandler.java b/core/server/src/main/java/tachyon/master/file/FileSystemMasterClientServiceHandler.java index 0d72564e83f4..46e436a809fa 100644 --- a/core/server/src/main/java/tachyon/master/file/FileSystemMasterClientServiceHandler.java +++ b/core/server/src/main/java/tachyon/master/file/FileSystemMasterClientServiceHandler.java @@ -24,7 +24,6 @@ import tachyon.Constants; import tachyon.TachyonURI; -import tachyon.client.file.options.SetAttributeOptions; import tachyon.exception.FileDoesNotExistException; import tachyon.exception.InvalidPathException; import tachyon.exception.TachyonException; @@ -32,6 +31,7 @@ import tachyon.master.file.options.CreateDirectoryOptions; import tachyon.master.file.options.CreateFileOptions; import tachyon.master.file.options.SetAclOptions; +import tachyon.master.file.options.SetAttributeOptions; import tachyon.thrift.CompleteFileTOptions; import tachyon.thrift.CreateDirectoryTOptions; import tachyon.thrift.CreateFileTOptions; @@ -47,7 +47,6 @@ * This class is a Thrift handler for file system master RPCs invoked by a Tachyon client. */ @NotThreadSafe // TODO(jiri): make thread-safe (c.f. TACHYON-1664) -//TODO(dong): server side should use a separate SetAttributeOptions in tachyon.master.file.options public final class FileSystemMasterClientServiceHandler implements FileSystemMasterClientService.Iface { private final FileSystemMaster mFileSystemMaster; @@ -231,8 +230,7 @@ public void scheduleAsyncPersist(String path) throws TachyonTException { @Override public void setAttribute(String path, SetAttributeTOptions options) throws TachyonTException { try { - mFileSystemMaster.setState(new TachyonURI(path), - SetAttributeOptions.fromThriftOptions(options)); + mFileSystemMaster.setAttribute(new TachyonURI(path), new SetAttributeOptions(options)); } catch (TachyonException e) { throw e.toTachyonTException(); } diff --git a/core/server/src/main/java/tachyon/master/file/options/SetAttributeOptions.java b/core/server/src/main/java/tachyon/master/file/options/SetAttributeOptions.java new file mode 100644 index 000000000000..31acaf391191 --- /dev/null +++ b/core/server/src/main/java/tachyon/master/file/options/SetAttributeOptions.java @@ -0,0 +1,161 @@ +/* + * Licensed to the University of California, Berkeley under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package tachyon.master.file.options; + +import javax.annotation.concurrent.NotThreadSafe; + +import tachyon.conf.TachyonConf; +import tachyon.master.MasterContext; +import tachyon.thrift.SetAttributeTOptions; + +/** + * Method option for setting the attributes. + */ +@NotThreadSafe +public class SetAttributeOptions { + /** + * Builder for {@link SetAttributeOptions} + */ + public static class Builder { + private Boolean mPinned; + private Long mTtl; + private Boolean mPersisted; + private long mOperationTimeMs; + + /** + * Creates a new builder for {@link SetAttributeOptions}. + */ + public Builder() { + this(MasterContext.getConf()); + } + + /** + * Creates a new builder for {@link SetAttributeOptions}. + * + * @param conf a Tachyon configuration + */ + public Builder(TachyonConf conf) { + mPinned = null; + mTtl = null; + mPersisted = null; + mOperationTimeMs = System.currentTimeMillis(); + } + + /** + * @param pinned the pinned flag value to use + * @return the builder + */ + public Builder setPinned(boolean pinned) { + mPinned = pinned; + return this; + } + + /** + * @param ttl the time-to-live (in seconds) to use + * @return the builder + */ + public Builder setTtl(long ttl) { + mTtl = ttl; + return this; + } + + /** + * @param persisted the persisted flag value to use + * @return the builder + */ + public Builder setPersisted(boolean persisted) { + mPersisted = persisted; + return this; + } + + /** + * @param operationTimeMs the operation time to use + * @return the builder + */ + public Builder setOperationTimeMs(long operationTimeMs) { + mOperationTimeMs = operationTimeMs; + return this; + } + + /** + * Builds a new instance of {@link SetAttributeOptions}. + * + * @return a {@link SetAttributeOptions} instance + */ + public SetAttributeOptions build() { + return new SetAttributeOptions(this); + } + } + + private final Boolean mPinned; + private final Long mTtl; + private final Boolean mPersisted; + private long mOperationTimeMs; + + /** + * Constructs a new method option for setting the attributes. + * + * @param options the options for setting the attributes + */ + public SetAttributeOptions(SetAttributeTOptions options) { + mPinned = options.isSetPinned() ? options.isPinned() : null; + mTtl = options.isSetTtl() ? options.getTtl() : null; + mPersisted = options.isSetPersisted() ? options.isPersisted() : null; + mOperationTimeMs = System.currentTimeMillis(); + } + + /** + * @return the default {@link SetAttributeOptions} + */ + public static SetAttributeOptions defaults() { + return new Builder(MasterContext.getConf()).build(); + } + + private SetAttributeOptions(Builder builder) { + mPinned = builder.mPinned; + mTtl = builder.mTtl; + mPersisted = builder.mPersisted; + mOperationTimeMs = builder.mOperationTimeMs; + } + + /** + * @return the pinned flag value + */ + public Boolean getPinned() { + return mPinned; + } + + /** + * @return the time-to-live (in seconds) + */ + public Long getTtl() { + return mTtl; + } + + /** + * @return the recursive flag value + */ + public Boolean getPersisted() { + return mPersisted; + } + + /** + * @return the operation time + */ + public long getOperationTimeMs() { + return mOperationTimeMs; + } +} diff --git a/core/server/src/main/java/tachyon/master/journal/JournalProtoUtils.java b/core/server/src/main/java/tachyon/master/journal/JournalProtoUtils.java index 5139e23f2397..d51c7ddb0ce0 100644 --- a/core/server/src/main/java/tachyon/master/journal/JournalProtoUtils.java +++ b/core/server/src/main/java/tachyon/master/journal/JournalProtoUtils.java @@ -71,8 +71,8 @@ public static Message unwrap(JournalEntry entry) { return entry.getRename(); case SET_ACL: return entry.getSetAcl(); - case SET_STATE: - return entry.getSetState(); + case SET_ATTRIBUTE: + return entry.getSetAttribute(); case ENTRY_NOT_SET: // This could mean that the field was never set, or it was set with a different version of // this message. Given the history of the JournalEntry protobuf message, the keys of the diff --git a/core/server/src/main/java/tachyon/proto/journal/File.java b/core/server/src/main/java/tachyon/proto/journal/File.java index 45a3078bd31a..980b367a7e58 100644 --- a/core/server/src/main/java/tachyon/proto/journal/File.java +++ b/core/server/src/main/java/tachyon/proto/journal/File.java @@ -10293,8 +10293,8 @@ public Builder clearPermission() { // @@protoc_insertion_point(class_scope:tachyon.proto.journal.SetAclEntry) } - public interface SetStateEntryOrBuilder extends - // @@protoc_insertion_point(interface_extends:tachyon.proto.journal.SetStateEntry) + public interface SetAttributeEntryOrBuilder extends + // @@protoc_insertion_point(interface_extends:tachyon.proto.journal.SetAttributeEntry) com.google.protobuf.MessageOrBuilder { /** @@ -10343,29 +10343,29 @@ public interface SetStateEntryOrBuilder extends boolean getPersisted(); } /** - * Protobuf type {@code tachyon.proto.journal.SetStateEntry} + * Protobuf type {@code tachyon.proto.journal.SetAttributeEntry} * *
    * next available id: 6
    * 
*/ - public static final class SetStateEntry extends + public static final class SetAttributeEntry extends com.google.protobuf.GeneratedMessage implements - // @@protoc_insertion_point(message_implements:tachyon.proto.journal.SetStateEntry) - SetStateEntryOrBuilder { - // Use SetStateEntry.newBuilder() to construct. - private SetStateEntry(com.google.protobuf.GeneratedMessage.Builder builder) { + // @@protoc_insertion_point(message_implements:tachyon.proto.journal.SetAttributeEntry) + SetAttributeEntryOrBuilder { + // Use SetAttributeEntry.newBuilder() to construct. + private SetAttributeEntry(com.google.protobuf.GeneratedMessage.Builder builder) { super(builder); this.unknownFields = builder.getUnknownFields(); } - private SetStateEntry(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + private SetAttributeEntry(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - private static final SetStateEntry defaultInstance; - public static SetStateEntry getDefaultInstance() { + private static final SetAttributeEntry defaultInstance; + public static SetAttributeEntry getDefaultInstance() { return defaultInstance; } - public SetStateEntry getDefaultInstanceForType() { + public SetAttributeEntry getDefaultInstanceForType() { return defaultInstance; } @@ -10375,7 +10375,7 @@ public SetStateEntry getDefaultInstanceForType() { getUnknownFields() { return this.unknownFields; } - private SetStateEntry( + private SetAttributeEntry( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { @@ -10437,28 +10437,28 @@ private SetStateEntry( } public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetStateEntry_descriptor; + return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetAttributeEntry_descriptor; } protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetStateEntry_fieldAccessorTable + return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetAttributeEntry_fieldAccessorTable .ensureFieldAccessorsInitialized( - tachyon.proto.journal.File.SetStateEntry.class, tachyon.proto.journal.File.SetStateEntry.Builder.class); + tachyon.proto.journal.File.SetAttributeEntry.class, tachyon.proto.journal.File.SetAttributeEntry.Builder.class); } - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public SetStateEntry parsePartialFrom( + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SetAttributeEntry parsePartialFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - return new SetStateEntry(input, extensionRegistry); + return new SetAttributeEntry(input, extensionRegistry); } }; @java.lang.Override - public com.google.protobuf.Parser getParserForType() { + public com.google.protobuf.Parser getParserForType() { return PARSER; } @@ -10614,53 +10614,53 @@ protected java.lang.Object writeReplace() return super.writeReplace(); } - public static tachyon.proto.journal.File.SetStateEntry parseFrom( + public static tachyon.proto.journal.File.SetAttributeEntry parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static tachyon.proto.journal.File.SetStateEntry parseFrom( + public static tachyon.proto.journal.File.SetAttributeEntry parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static tachyon.proto.journal.File.SetStateEntry parseFrom(byte[] data) + public static tachyon.proto.journal.File.SetAttributeEntry parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static tachyon.proto.journal.File.SetStateEntry parseFrom( + public static tachyon.proto.journal.File.SetAttributeEntry parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static tachyon.proto.journal.File.SetStateEntry parseFrom(java.io.InputStream input) + public static tachyon.proto.journal.File.SetAttributeEntry parseFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } - public static tachyon.proto.journal.File.SetStateEntry parseFrom( + public static tachyon.proto.journal.File.SetAttributeEntry parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseFrom(input, extensionRegistry); } - public static tachyon.proto.journal.File.SetStateEntry parseDelimitedFrom(java.io.InputStream input) + public static tachyon.proto.journal.File.SetAttributeEntry parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseDelimitedFrom(input); } - public static tachyon.proto.journal.File.SetStateEntry parseDelimitedFrom( + public static tachyon.proto.journal.File.SetAttributeEntry parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseDelimitedFrom(input, extensionRegistry); } - public static tachyon.proto.journal.File.SetStateEntry parseFrom( + public static tachyon.proto.journal.File.SetAttributeEntry parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } - public static tachyon.proto.journal.File.SetStateEntry parseFrom( + public static tachyon.proto.journal.File.SetAttributeEntry parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -10669,7 +10669,7 @@ public static tachyon.proto.journal.File.SetStateEntry parseFrom( public static Builder newBuilder() { return Builder.create(); } public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(tachyon.proto.journal.File.SetStateEntry prototype) { + public static Builder newBuilder(tachyon.proto.journal.File.SetAttributeEntry prototype) { return newBuilder().mergeFrom(prototype); } public Builder toBuilder() { return newBuilder(this); } @@ -10681,7 +10681,7 @@ protected Builder newBuilderForType( return builder; } /** - * Protobuf type {@code tachyon.proto.journal.SetStateEntry} + * Protobuf type {@code tachyon.proto.journal.SetAttributeEntry} * *
      * next available id: 6
@@ -10689,21 +10689,21 @@ protected Builder newBuilderForType(
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder implements
-        // @@protoc_insertion_point(builder_implements:tachyon.proto.journal.SetStateEntry)
-        tachyon.proto.journal.File.SetStateEntryOrBuilder {
+        // @@protoc_insertion_point(builder_implements:tachyon.proto.journal.SetAttributeEntry)
+        tachyon.proto.journal.File.SetAttributeEntryOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetStateEntry_descriptor;
+        return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetAttributeEntry_descriptor;
       }
 
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetStateEntry_fieldAccessorTable
+        return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetAttributeEntry_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                tachyon.proto.journal.File.SetStateEntry.class, tachyon.proto.journal.File.SetStateEntry.Builder.class);
+                tachyon.proto.journal.File.SetAttributeEntry.class, tachyon.proto.journal.File.SetAttributeEntry.Builder.class);
       }
 
-      // Construct using tachyon.proto.journal.File.SetStateEntry.newBuilder()
+      // Construct using tachyon.proto.journal.File.SetAttributeEntry.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -10742,23 +10742,23 @@ public Builder clone() {
 
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetStateEntry_descriptor;
+        return tachyon.proto.journal.File.internal_static_tachyon_proto_journal_SetAttributeEntry_descriptor;
       }
 
-      public tachyon.proto.journal.File.SetStateEntry getDefaultInstanceForType() {
-        return tachyon.proto.journal.File.SetStateEntry.getDefaultInstance();
+      public tachyon.proto.journal.File.SetAttributeEntry getDefaultInstanceForType() {
+        return tachyon.proto.journal.File.SetAttributeEntry.getDefaultInstance();
       }
 
-      public tachyon.proto.journal.File.SetStateEntry build() {
-        tachyon.proto.journal.File.SetStateEntry result = buildPartial();
+      public tachyon.proto.journal.File.SetAttributeEntry build() {
+        tachyon.proto.journal.File.SetAttributeEntry result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
         return result;
       }
 
-      public tachyon.proto.journal.File.SetStateEntry buildPartial() {
-        tachyon.proto.journal.File.SetStateEntry result = new tachyon.proto.journal.File.SetStateEntry(this);
+      public tachyon.proto.journal.File.SetAttributeEntry buildPartial() {
+        tachyon.proto.journal.File.SetAttributeEntry result = new tachyon.proto.journal.File.SetAttributeEntry(this);
         int from_bitField0_ = bitField0_;
         int to_bitField0_ = 0;
         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
@@ -10787,16 +10787,16 @@ public tachyon.proto.journal.File.SetStateEntry buildPartial() {
       }
 
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof tachyon.proto.journal.File.SetStateEntry) {
-          return mergeFrom((tachyon.proto.journal.File.SetStateEntry)other);
+        if (other instanceof tachyon.proto.journal.File.SetAttributeEntry) {
+          return mergeFrom((tachyon.proto.journal.File.SetAttributeEntry)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(tachyon.proto.journal.File.SetStateEntry other) {
-        if (other == tachyon.proto.journal.File.SetStateEntry.getDefaultInstance()) return this;
+      public Builder mergeFrom(tachyon.proto.journal.File.SetAttributeEntry other) {
+        if (other == tachyon.proto.journal.File.SetAttributeEntry.getDefaultInstance()) return this;
         if (other.hasId()) {
           setId(other.getId());
         }
@@ -10824,11 +10824,11 @@ public Builder mergeFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        tachyon.proto.journal.File.SetStateEntry parsedMessage = null;
+        tachyon.proto.journal.File.SetAttributeEntry parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (tachyon.proto.journal.File.SetStateEntry) e.getUnfinishedMessage();
+          parsedMessage = (tachyon.proto.journal.File.SetAttributeEntry) e.getUnfinishedMessage();
           throw e;
         } finally {
           if (parsedMessage != null) {
@@ -10999,15 +10999,15 @@ public Builder clearPersisted() {
         return this;
       }
 
-      // @@protoc_insertion_point(builder_scope:tachyon.proto.journal.SetStateEntry)
+      // @@protoc_insertion_point(builder_scope:tachyon.proto.journal.SetAttributeEntry)
     }
 
     static {
-      defaultInstance = new SetStateEntry(true);
+      defaultInstance = new SetAttributeEntry(true);
       defaultInstance.initFields();
     }
 
-    // @@protoc_insertion_point(class_scope:tachyon.proto.journal.SetStateEntry)
+    // @@protoc_insertion_point(class_scope:tachyon.proto.journal.SetAttributeEntry)
   }
 
   private static final com.google.protobuf.Descriptors.Descriptor
@@ -11081,10 +11081,10 @@ public Builder clearPersisted() {
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_tachyon_proto_journal_SetAclEntry_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_tachyon_proto_journal_SetStateEntry_descriptor;
+    internal_static_tachyon_proto_journal_SetAttributeEntry_descriptor;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_tachyon_proto_journal_SetStateEntry_fieldAccessorTable;
+      internal_static_tachyon_proto_journal_SetAttributeEntry_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -11129,10 +11129,10 @@ public Builder clearPersisted() {
       "d\030\001 \001(\003\022\020\n\010dst_path\030\002 \001(\t\022\022\n\nop_time_ms\030" +
       "\003 \001(\003\"h\n\013SetAclEntry\022\n\n\002id\030\001 \001(\003\022\022\n\nop_t" +
       "ime_ms\030\002 \001(\003\022\021\n\tuser_name\030\003 \001(\t\022\022\n\ngroup" +
-      "_name\030\004 \001(\t\022\022\n\npermission\030\005 \001(\005\"_\n\rSetSt" +
-      "ateEntry\022\n\n\002id\030\001 \001(\003\022\022\n\nop_time_ms\030\002 \001(\003" +
-      "\022\016\n\006pinned\030\003 \001(\010\022\013\n\003ttl\030\004 \001(\003\022\021\n\tpersist" +
-      "ed\030\005 \001(\010"
+      "_name\030\004 \001(\t\022\022\n\npermission\030\005 \001(\005\"c\n\021SetAt" +
+      "tributeEntry\022\n\n\002id\030\001 \001(\003\022\022\n\nop_time_ms\030\002" +
+      " \001(\003\022\016\n\006pinned\030\003 \001(\010\022\013\n\003ttl\030\004 \001(\003\022\021\n\tper" +
+      "sisted\030\005 \001(\010"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
         new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
@@ -11230,11 +11230,11 @@ public com.google.protobuf.ExtensionRegistry assignDescriptors(
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_tachyon_proto_journal_SetAclEntry_descriptor,
         new java.lang.String[] { "Id", "OpTimeMs", "UserName", "GroupName", "Permission", });
-    internal_static_tachyon_proto_journal_SetStateEntry_descriptor =
+    internal_static_tachyon_proto_journal_SetAttributeEntry_descriptor =
       getDescriptor().getMessageTypes().get(14);
-    internal_static_tachyon_proto_journal_SetStateEntry_fieldAccessorTable = new
+    internal_static_tachyon_proto_journal_SetAttributeEntry_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-        internal_static_tachyon_proto_journal_SetStateEntry_descriptor,
+        internal_static_tachyon_proto_journal_SetAttributeEntry_descriptor,
         new java.lang.String[] { "Id", "OpTimeMs", "Pinned", "Ttl", "Persisted", });
   }
 
diff --git a/core/server/src/main/java/tachyon/proto/journal/Journal.java b/core/server/src/main/java/tachyon/proto/journal/Journal.java
index 2f7952eb5c0e..f40e67bfda8a 100644
--- a/core/server/src/main/java/tachyon/proto/journal/Journal.java
+++ b/core/server/src/main/java/tachyon/proto/journal/Journal.java
@@ -321,17 +321,17 @@ public interface JournalEntryOrBuilder extends
     tachyon.proto.journal.File.SetAclEntryOrBuilder getSetAclOrBuilder();
 
     /**
-     * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+     * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
      */
-    boolean hasSetState();
+    boolean hasSetAttribute();
     /**
-     * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+     * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
      */
-    tachyon.proto.journal.File.SetStateEntry getSetState();
+    tachyon.proto.journal.File.SetAttributeEntry getSetAttribute();
     /**
-     * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+     * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
      */
-    tachyon.proto.journal.File.SetStateEntryOrBuilder getSetStateOrBuilder();
+    tachyon.proto.journal.File.SetAttributeEntryOrBuilder getSetAttributeOrBuilder();
   }
   /**
    * Protobuf type {@code tachyon.proto.journal.JournalEntry}
@@ -616,19 +616,6 @@ private JournalEntry(
               entryCase_ = 19;
               break;
             }
-            case 162: {
-              tachyon.proto.journal.File.SetStateEntry.Builder subBuilder = null;
-              if (entryCase_ == 20) {
-                subBuilder = ((tachyon.proto.journal.File.SetStateEntry) entry_).toBuilder();
-              }
-              entry_ = input.readMessage(tachyon.proto.journal.File.SetStateEntry.PARSER, extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom((tachyon.proto.journal.File.SetStateEntry) entry_);
-                entry_ = subBuilder.buildPartial();
-              }
-              entryCase_ = 20;
-              break;
-            }
             case 170: {
               tachyon.proto.journal.KeyValue.CompletePartitionEntry.Builder subBuilder = null;
               if (entryCase_ == 21) {
@@ -707,6 +694,19 @@ private JournalEntry(
               entryCase_ = 26;
               break;
             }
+            case 218: {
+              tachyon.proto.journal.File.SetAttributeEntry.Builder subBuilder = null;
+              if (entryCase_ == 27) {
+                subBuilder = ((tachyon.proto.journal.File.SetAttributeEntry) entry_).toBuilder();
+              }
+              entry_ = input.readMessage(tachyon.proto.journal.File.SetAttributeEntry.PARSER, extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom((tachyon.proto.journal.File.SetAttributeEntry) entry_);
+                entry_ = subBuilder.buildPartial();
+              }
+              entryCase_ = 27;
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -774,7 +774,7 @@ public enum EntryCase
       REINITIALIZE_FILE(18),
       RENAME(19),
       SET_ACL(24),
-      SET_STATE(20),
+      SET_ATTRIBUTE(27),
       ENTRY_NOT_SET(0);
       private int value = 0;
       private EntryCase(int value) {
@@ -805,7 +805,7 @@ public static EntryCase valueOf(int value) {
           case 18: return REINITIALIZE_FILE;
           case 19: return RENAME;
           case 24: return SET_ACL;
-          case 20: return SET_STATE;
+          case 27: return SET_ATTRIBUTE;
           case 0: return ENTRY_NOT_SET;
           default: throw new java.lang.IllegalArgumentException(
             "Value is undefined for this oneof enum.");
@@ -1435,30 +1435,30 @@ public tachyon.proto.journal.File.SetAclEntryOrBuilder getSetAclOrBuilder() {
       return tachyon.proto.journal.File.SetAclEntry.getDefaultInstance();
     }
 
-    public static final int SET_STATE_FIELD_NUMBER = 20;
+    public static final int SET_ATTRIBUTE_FIELD_NUMBER = 27;
     /**
-     * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+     * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
      */
-    public boolean hasSetState() {
-      return entryCase_ == 20;
+    public boolean hasSetAttribute() {
+      return entryCase_ == 27;
     }
     /**
-     * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+     * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
      */
-    public tachyon.proto.journal.File.SetStateEntry getSetState() {
-      if (entryCase_ == 20) {
-         return (tachyon.proto.journal.File.SetStateEntry) entry_;
+    public tachyon.proto.journal.File.SetAttributeEntry getSetAttribute() {
+      if (entryCase_ == 27) {
+         return (tachyon.proto.journal.File.SetAttributeEntry) entry_;
       }
-      return tachyon.proto.journal.File.SetStateEntry.getDefaultInstance();
+      return tachyon.proto.journal.File.SetAttributeEntry.getDefaultInstance();
     }
     /**
-     * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+     * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
      */
-    public tachyon.proto.journal.File.SetStateEntryOrBuilder getSetStateOrBuilder() {
-      if (entryCase_ == 20) {
-         return (tachyon.proto.journal.File.SetStateEntry) entry_;
+    public tachyon.proto.journal.File.SetAttributeEntryOrBuilder getSetAttributeOrBuilder() {
+      if (entryCase_ == 27) {
+         return (tachyon.proto.journal.File.SetAttributeEntry) entry_;
       }
-      return tachyon.proto.journal.File.SetStateEntry.getDefaultInstance();
+      return tachyon.proto.journal.File.SetAttributeEntry.getDefaultInstance();
     }
 
     private void initFields() {
@@ -1531,9 +1531,6 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
       if (entryCase_ == 19) {
         output.writeMessage(19, (tachyon.proto.journal.File.RenameEntry) entry_);
       }
-      if (entryCase_ == 20) {
-        output.writeMessage(20, (tachyon.proto.journal.File.SetStateEntry) entry_);
-      }
       if (entryCase_ == 21) {
         output.writeMessage(21, (tachyon.proto.journal.KeyValue.CompletePartitionEntry) entry_);
       }
@@ -1552,6 +1549,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
       if (entryCase_ == 26) {
         output.writeMessage(26, (tachyon.proto.journal.KeyValue.MergeStoreEntry) entry_);
       }
+      if (entryCase_ == 27) {
+        output.writeMessage(27, (tachyon.proto.journal.File.SetAttributeEntry) entry_);
+      }
       getUnknownFields().writeTo(output);
     }
 
@@ -1633,10 +1633,6 @@ public int getSerializedSize() {
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(19, (tachyon.proto.journal.File.RenameEntry) entry_);
       }
-      if (entryCase_ == 20) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(20, (tachyon.proto.journal.File.SetStateEntry) entry_);
-      }
       if (entryCase_ == 21) {
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(21, (tachyon.proto.journal.KeyValue.CompletePartitionEntry) entry_);
@@ -1661,6 +1657,10 @@ public int getSerializedSize() {
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(26, (tachyon.proto.journal.KeyValue.MergeStoreEntry) entry_);
       }
+      if (entryCase_ == 27) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(27, (tachyon.proto.journal.File.SetAttributeEntry) entry_);
+      }
       size += getUnknownFields().getSerializedSize();
       memoizedSerializedSize = size;
       return size;
@@ -1980,11 +1980,11 @@ public tachyon.proto.journal.Journal.JournalEntry buildPartial() {
             result.entry_ = setAclBuilder_.build();
           }
         }
-        if (entryCase_ == 20) {
-          if (setStateBuilder_ == null) {
+        if (entryCase_ == 27) {
+          if (setAttributeBuilder_ == null) {
             result.entry_ = entry_;
           } else {
-            result.entry_ = setStateBuilder_.build();
+            result.entry_ = setAttributeBuilder_.build();
           }
         }
         result.bitField0_ = to_bitField0_;
@@ -2100,8 +2100,8 @@ public Builder mergeFrom(tachyon.proto.journal.Journal.JournalEntry other) {
             mergeSetAcl(other.getSetAcl());
             break;
           }
-          case SET_STATE: {
-            mergeSetState(other.getSetState());
+          case SET_ATTRIBUTE: {
+            mergeSetAttribute(other.getSetAttribute());
             break;
           }
           case ENTRY_NOT_SET: {
@@ -5288,138 +5288,138 @@ public tachyon.proto.journal.File.SetAclEntryOrBuilder getSetAclOrBuilder() {
       }
 
       private com.google.protobuf.SingleFieldBuilder<
-          tachyon.proto.journal.File.SetStateEntry, tachyon.proto.journal.File.SetStateEntry.Builder, tachyon.proto.journal.File.SetStateEntryOrBuilder> setStateBuilder_;
+          tachyon.proto.journal.File.SetAttributeEntry, tachyon.proto.journal.File.SetAttributeEntry.Builder, tachyon.proto.journal.File.SetAttributeEntryOrBuilder> setAttributeBuilder_;
       /**
-       * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+       * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
        */
-      public boolean hasSetState() {
-        return entryCase_ == 20;
+      public boolean hasSetAttribute() {
+        return entryCase_ == 27;
       }
       /**
-       * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+       * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
        */
-      public tachyon.proto.journal.File.SetStateEntry getSetState() {
-        if (setStateBuilder_ == null) {
-          if (entryCase_ == 20) {
-            return (tachyon.proto.journal.File.SetStateEntry) entry_;
+      public tachyon.proto.journal.File.SetAttributeEntry getSetAttribute() {
+        if (setAttributeBuilder_ == null) {
+          if (entryCase_ == 27) {
+            return (tachyon.proto.journal.File.SetAttributeEntry) entry_;
           }
-          return tachyon.proto.journal.File.SetStateEntry.getDefaultInstance();
+          return tachyon.proto.journal.File.SetAttributeEntry.getDefaultInstance();
         } else {
-          if (entryCase_ == 20) {
-            return setStateBuilder_.getMessage();
+          if (entryCase_ == 27) {
+            return setAttributeBuilder_.getMessage();
           }
-          return tachyon.proto.journal.File.SetStateEntry.getDefaultInstance();
+          return tachyon.proto.journal.File.SetAttributeEntry.getDefaultInstance();
         }
       }
       /**
-       * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+       * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
        */
-      public Builder setSetState(tachyon.proto.journal.File.SetStateEntry value) {
-        if (setStateBuilder_ == null) {
+      public Builder setSetAttribute(tachyon.proto.journal.File.SetAttributeEntry value) {
+        if (setAttributeBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
           entry_ = value;
           onChanged();
         } else {
-          setStateBuilder_.setMessage(value);
+          setAttributeBuilder_.setMessage(value);
         }
-        entryCase_ = 20;
+        entryCase_ = 27;
         return this;
       }
       /**
-       * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+       * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
        */
-      public Builder setSetState(
-          tachyon.proto.journal.File.SetStateEntry.Builder builderForValue) {
-        if (setStateBuilder_ == null) {
+      public Builder setSetAttribute(
+          tachyon.proto.journal.File.SetAttributeEntry.Builder builderForValue) {
+        if (setAttributeBuilder_ == null) {
           entry_ = builderForValue.build();
           onChanged();
         } else {
-          setStateBuilder_.setMessage(builderForValue.build());
+          setAttributeBuilder_.setMessage(builderForValue.build());
         }
-        entryCase_ = 20;
+        entryCase_ = 27;
         return this;
       }
       /**
-       * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+       * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
        */
-      public Builder mergeSetState(tachyon.proto.journal.File.SetStateEntry value) {
-        if (setStateBuilder_ == null) {
-          if (entryCase_ == 20 &&
-              entry_ != tachyon.proto.journal.File.SetStateEntry.getDefaultInstance()) {
-            entry_ = tachyon.proto.journal.File.SetStateEntry.newBuilder((tachyon.proto.journal.File.SetStateEntry) entry_)
+      public Builder mergeSetAttribute(tachyon.proto.journal.File.SetAttributeEntry value) {
+        if (setAttributeBuilder_ == null) {
+          if (entryCase_ == 27 &&
+              entry_ != tachyon.proto.journal.File.SetAttributeEntry.getDefaultInstance()) {
+            entry_ = tachyon.proto.journal.File.SetAttributeEntry.newBuilder((tachyon.proto.journal.File.SetAttributeEntry) entry_)
                 .mergeFrom(value).buildPartial();
           } else {
             entry_ = value;
           }
           onChanged();
         } else {
-          if (entryCase_ == 20) {
-            setStateBuilder_.mergeFrom(value);
+          if (entryCase_ == 27) {
+            setAttributeBuilder_.mergeFrom(value);
           }
-          setStateBuilder_.setMessage(value);
+          setAttributeBuilder_.setMessage(value);
         }
-        entryCase_ = 20;
+        entryCase_ = 27;
         return this;
       }
       /**
-       * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+       * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
        */
-      public Builder clearSetState() {
-        if (setStateBuilder_ == null) {
-          if (entryCase_ == 20) {
+      public Builder clearSetAttribute() {
+        if (setAttributeBuilder_ == null) {
+          if (entryCase_ == 27) {
             entryCase_ = 0;
             entry_ = null;
             onChanged();
           }
         } else {
-          if (entryCase_ == 20) {
+          if (entryCase_ == 27) {
             entryCase_ = 0;
             entry_ = null;
           }
-          setStateBuilder_.clear();
+          setAttributeBuilder_.clear();
         }
         return this;
       }
       /**
-       * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+       * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
        */
-      public tachyon.proto.journal.File.SetStateEntry.Builder getSetStateBuilder() {
-        return getSetStateFieldBuilder().getBuilder();
+      public tachyon.proto.journal.File.SetAttributeEntry.Builder getSetAttributeBuilder() {
+        return getSetAttributeFieldBuilder().getBuilder();
       }
       /**
-       * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+       * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
        */
-      public tachyon.proto.journal.File.SetStateEntryOrBuilder getSetStateOrBuilder() {
-        if ((entryCase_ == 20) && (setStateBuilder_ != null)) {
-          return setStateBuilder_.getMessageOrBuilder();
+      public tachyon.proto.journal.File.SetAttributeEntryOrBuilder getSetAttributeOrBuilder() {
+        if ((entryCase_ == 27) && (setAttributeBuilder_ != null)) {
+          return setAttributeBuilder_.getMessageOrBuilder();
         } else {
-          if (entryCase_ == 20) {
-            return (tachyon.proto.journal.File.SetStateEntry) entry_;
+          if (entryCase_ == 27) {
+            return (tachyon.proto.journal.File.SetAttributeEntry) entry_;
           }
-          return tachyon.proto.journal.File.SetStateEntry.getDefaultInstance();
+          return tachyon.proto.journal.File.SetAttributeEntry.getDefaultInstance();
         }
       }
       /**
-       * optional .tachyon.proto.journal.SetStateEntry set_state = 20;
+       * optional .tachyon.proto.journal.SetAttributeEntry set_attribute = 27;
        */
       private com.google.protobuf.SingleFieldBuilder<
-          tachyon.proto.journal.File.SetStateEntry, tachyon.proto.journal.File.SetStateEntry.Builder, tachyon.proto.journal.File.SetStateEntryOrBuilder> 
-          getSetStateFieldBuilder() {
-        if (setStateBuilder_ == null) {
-          if (!(entryCase_ == 20)) {
-            entry_ = tachyon.proto.journal.File.SetStateEntry.getDefaultInstance();
-          }
-          setStateBuilder_ = new com.google.protobuf.SingleFieldBuilder<
-              tachyon.proto.journal.File.SetStateEntry, tachyon.proto.journal.File.SetStateEntry.Builder, tachyon.proto.journal.File.SetStateEntryOrBuilder>(
-                  (tachyon.proto.journal.File.SetStateEntry) entry_,
+          tachyon.proto.journal.File.SetAttributeEntry, tachyon.proto.journal.File.SetAttributeEntry.Builder, tachyon.proto.journal.File.SetAttributeEntryOrBuilder> 
+          getSetAttributeFieldBuilder() {
+        if (setAttributeBuilder_ == null) {
+          if (!(entryCase_ == 27)) {
+            entry_ = tachyon.proto.journal.File.SetAttributeEntry.getDefaultInstance();
+          }
+          setAttributeBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              tachyon.proto.journal.File.SetAttributeEntry, tachyon.proto.journal.File.SetAttributeEntry.Builder, tachyon.proto.journal.File.SetAttributeEntryOrBuilder>(
+                  (tachyon.proto.journal.File.SetAttributeEntry) entry_,
                   getParentForChildren(),
                   isClean());
           entry_ = null;
         }
-        entryCase_ = 20;
-        return setStateBuilder_;
+        entryCase_ = 27;
+        return setAttributeBuilder_;
       }
 
       // @@protoc_insertion_point(builder_scope:tachyon.proto.journal.JournalEntry)
@@ -5449,7 +5449,7 @@ public tachyon.proto.journal.File.SetStateEntryOrBuilder getSetStateOrBuilder()
     java.lang.String[] descriptorData = {
       "\n\rjournal.proto\022\025tachyon.proto.journal\032\013" +
       "block.proto\032\nfile.proto\032\017key_value.proto" +
-      "\032\rlineage.proto\"\322\r\n\014JournalEntry\022\027\n\017sequ" +
+      "\032\rlineage.proto\"\332\r\n\014JournalEntry\022\027\n\017sequ" +
       "ence_number\030\001 \001(\003\022D\n\017add_mount_point\030\002 \001" +
       "(\0132).tachyon.proto.journal.AddMountPoint" +
       "EntryH\000\022]\n\034block_container_id_generator\030" +
@@ -5491,9 +5491,9 @@ public tachyon.proto.journal.File.SetStateEntryOrBuilder getSetStateOrBuilder()
       "nal.ReinitializeFileEntryH\000\0224\n\006rename\030\023 " +
       "\001(\0132\".tachyon.proto.journal.RenameEntryH" +
       "\000\0225\n\007set_acl\030\030 \001(\0132\".tachyon.proto.journ" +
-      "al.SetAclEntryH\000\0229\n\tset_state\030\024 \001(\0132$.ta" +
-      "chyon.proto.journal.SetStateEntryH\000B\007\n\005e" +
-      "ntryB\027\n\025tachyon.proto.journal"
+      "al.SetAclEntryH\000\022A\n\rset_attribute\030\033 \001(\0132" +
+      "(.tachyon.proto.journal.SetAttributeEntr" +
+      "yH\000B\007\n\005entryB\027\n\025tachyon.proto.journal"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
         new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
@@ -5516,7 +5516,7 @@ public com.google.protobuf.ExtensionRegistry assignDescriptors(
     internal_static_tachyon_proto_journal_JournalEntry_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessage.FieldAccessorTable(
         internal_static_tachyon_proto_journal_JournalEntry_descriptor,
-        new java.lang.String[] { "SequenceNumber", "AddMountPoint", "BlockContainerIdGenerator", "BlockInfo", "CompleteFile", "CompletePartition", "CompleteStore", "CreateStore", "DeleteFile", "DeleteLineage", "DeleteMountPoint", "DeleteStore", "InodeDirectory", "InodeDirectoryIdGenerator", "InodeFile", "InodeLastModificationTime", "Lineage", "LineageIdGenerator", "MergeStore", "PersistDirectory", "AsyncPersistRequest", "ReinitializeFile", "Rename", "SetAcl", "SetState", "Entry", });
+        new java.lang.String[] { "SequenceNumber", "AddMountPoint", "BlockContainerIdGenerator", "BlockInfo", "CompleteFile", "CompletePartition", "CompleteStore", "CreateStore", "DeleteFile", "DeleteLineage", "DeleteMountPoint", "DeleteStore", "InodeDirectory", "InodeDirectoryIdGenerator", "InodeFile", "InodeLastModificationTime", "Lineage", "LineageIdGenerator", "MergeStore", "PersistDirectory", "AsyncPersistRequest", "ReinitializeFile", "Rename", "SetAcl", "SetAttribute", "Entry", });
     tachyon.proto.journal.Block.getDescriptor();
     tachyon.proto.journal.File.getDescriptor();
     tachyon.proto.journal.KeyValue.getDescriptor();
diff --git a/core/server/src/proto/journal/file.proto b/core/server/src/proto/journal/file.proto
index 79d598a4a644..536051540375 100644
--- a/core/server/src/proto/journal/file.proto
+++ b/core/server/src/proto/journal/file.proto
@@ -117,7 +117,7 @@ message SetAclEntry {
 }
 
 // next available id: 6
-message SetStateEntry {
+message SetAttributeEntry {
   optional int64 id = 1;
   optional int64 op_time_ms = 2;
   optional bool pinned = 3;
diff --git a/core/server/src/proto/journal/journal.proto b/core/server/src/proto/journal/journal.proto
index f20f9611bb1d..ad269cda95ba 100644
--- a/core/server/src/proto/journal/journal.proto
+++ b/core/server/src/proto/journal/journal.proto
@@ -36,6 +36,6 @@ message JournalEntry {
     ReinitializeFileEntry reinitialize_file = 18;
     RenameEntry rename = 19;
     SetAclEntry set_acl = 24;
-    SetStateEntry set_state = 20;
+    SetAttributeEntry set_attribute = 27;
   }
 }
diff --git a/core/server/src/test/java/tachyon/master/MasterSourceTest.java b/core/server/src/test/java/tachyon/master/MasterSourceTest.java
index b83082137aa3..507eeac70e2e 100644
--- a/core/server/src/test/java/tachyon/master/MasterSourceTest.java
+++ b/core/server/src/test/java/tachyon/master/MasterSourceTest.java
@@ -32,7 +32,6 @@
 
 import tachyon.Constants;
 import tachyon.TachyonURI;
-import tachyon.client.file.options.SetAttributeOptions;
 import tachyon.exception.ExceptionMessage;
 import tachyon.exception.FileAlreadyCompletedException;
 import tachyon.exception.FileAlreadyExistsException;
@@ -44,6 +43,7 @@
 import tachyon.master.file.options.CompleteFileOptions;
 import tachyon.master.file.options.CreateFileOptions;
 import tachyon.master.file.options.CreateDirectoryOptions;
+import tachyon.master.file.options.SetAttributeOptions;
 import tachyon.master.journal.Journal;
 import tachyon.master.journal.ReadWriteJournal;
 import tachyon.thrift.FileInfo;
@@ -315,9 +315,9 @@ public void getNewBlockIdForFileTest() throws Exception {
   public void setStateTest() throws Exception {
     mFileSystemMaster.create(NESTED_FILE_URI, sNestedFileOptions);
 
-    mFileSystemMaster.setState(NESTED_FILE_URI, SetAttributeOptions.defaults());
+    mFileSystemMaster.setAttribute(NESTED_FILE_URI, SetAttributeOptions.defaults());
 
-    Assert.assertEquals(1, mCounters.get("SetStateOps").getCount());
+    Assert.assertEquals(1, mCounters.get("SetAttributeOps").getCount());
   }
 
   /**
@@ -329,7 +329,8 @@ public void setStateTest() throws Exception {
   public void filePersistedTest() throws Exception {
     createCompleteFileWithSingleBlock(NESTED_FILE_URI);
 
-    mFileSystemMaster.setState(NESTED_FILE_URI, SetAttributeOptions.defaults().setPersisted(true));
+    mFileSystemMaster.setAttribute(NESTED_FILE_URI,
+        new SetAttributeOptions.Builder().setPersisted(true).build());
 
     Assert.assertEquals(1, mCounters.get("FilesPersisted").getCount());
   }
diff --git a/core/server/src/test/java/tachyon/master/file/FileSystemMasterTest.java b/core/server/src/test/java/tachyon/master/file/FileSystemMasterTest.java
index 2b5294e1dd16..8298f6bd6851 100644
--- a/core/server/src/test/java/tachyon/master/file/FileSystemMasterTest.java
+++ b/core/server/src/test/java/tachyon/master/file/FileSystemMasterTest.java
@@ -39,7 +39,6 @@
 import tachyon.Constants;
 import tachyon.TachyonURI;
 import tachyon.conf.TachyonConf;
-import tachyon.client.file.options.SetAttributeOptions;
 import tachyon.exception.DirectoryNotEmptyException;
 import tachyon.exception.ExceptionMessage;
 import tachyon.exception.FileAlreadyExistsException;
@@ -54,6 +53,7 @@
 import tachyon.master.file.meta.TtlBucketPrivateAccess;
 import tachyon.master.file.options.CompleteFileOptions;
 import tachyon.master.file.options.CreateFileOptions;
+import tachyon.master.file.options.SetAttributeOptions;
 import tachyon.master.journal.Journal;
 import tachyon.master.journal.ReadWriteJournal;
 import tachyon.thrift.CommandType;
@@ -273,7 +273,8 @@ public void setTtlForFileWithNoTtlTest() throws Exception {
     // Since no valid TTL is set, the file should not be deleted.
     Assert.assertEquals(fileId, mFileSystemMaster.getFileInfo(NESTED_FILE_URI).getFileId());
 
-    mFileSystemMaster.setState(NESTED_FILE_URI, SetAttributeOptions.defaults().setTtl(0));
+    mFileSystemMaster.setAttribute(NESTED_FILE_URI,
+        new SetAttributeOptions.Builder().setTtl(0).build());
     executeTtlCheckOnce();
     // TTL is set to 0, the file should have been deleted during last TTL check.
     mThrown.expect(FileDoesNotExistException.class);
@@ -296,7 +297,8 @@ public void setSmallerTtlForFileWithTtlTest() throws Exception {
     // Since TTL is 1 hour, the file won't be deleted during last TTL check.
     Assert.assertEquals(fileId, mFileSystemMaster.getFileInfo(NESTED_FILE_URI).getFileId());
 
-    mFileSystemMaster.setState(NESTED_FILE_URI, SetAttributeOptions.defaults().setTtl(0));
+    mFileSystemMaster.setAttribute(NESTED_FILE_URI,
+        new SetAttributeOptions.Builder().setTtl(0).build());
     executeTtlCheckOnce();
     // TTL is reset to 0, the file should have been deleted during last TTL check.
     mThrown.expect(FileDoesNotExistException.class);
@@ -316,8 +318,8 @@ public void setLargerTtlForFileWithTtlTest() throws Exception {
     long fileId = mFileSystemMaster.create(NESTED_FILE_URI, options);
     Assert.assertEquals(fileId, mFileSystemMaster.getFileInfo(NESTED_FILE_URI).getFileId());
 
-    mFileSystemMaster.setState(NESTED_FILE_URI,
-        SetAttributeOptions.defaults().setTtl(Constants.HOUR_MS));
+    mFileSystemMaster.setAttribute(NESTED_FILE_URI,
+        new SetAttributeOptions.Builder().setTtl(Constants.HOUR_MS).build());
     executeTtlCheckOnce();
     // TTL is reset to 1 hour, the file should not be deleted during last TTL check.
     Assert.assertEquals(fileId, mFileSystemMaster.getFileInfo(fileId).getFileId());
@@ -336,15 +338,15 @@ public void setNoTtlForFileWithTtlTest() throws Exception {
     long fileId = mFileSystemMaster.create(NESTED_FILE_URI, options);
     // After setting TTL to NO_TTL, the original TTL will be removed, and the file will not be
     // deleted during next TTL check.
-    mFileSystemMaster.setState(NESTED_FILE_URI,
-        SetAttributeOptions.defaults().setTtl(Constants.NO_TTL));
+    mFileSystemMaster.setAttribute(NESTED_FILE_URI,
+        new SetAttributeOptions.Builder().setTtl(Constants.NO_TTL).build());
     executeTtlCheckOnce();
     Assert.assertEquals(fileId, mFileSystemMaster.getFileInfo(fileId).getFileId());
   }
 
   /**
-   * Tests the {@link FileSystemMaster#setState(TachyonURI, SetAttributeOptions)} method and that an
-   * exception is thrown when trying to set a TTL for a directory.
+   * Tests the {@link FileSystemMaster#setAttribute(TachyonURI, SetAttributeOptions)} method and
+   * that an exception is thrown when trying to set a TTL for a directory.
    *
    * @throws Exception if a {@link FileSystemMaster} operation fails
    */
@@ -356,27 +358,29 @@ public void setStateTest() throws Exception {
     Assert.assertEquals(Constants.NO_TTL, fileInfo.getTtl());
 
     // No State.
-    mFileSystemMaster.setState(NESTED_FILE_URI, SetAttributeOptions.defaults());
+    mFileSystemMaster.setAttribute(NESTED_FILE_URI, SetAttributeOptions.defaults());
     fileInfo = mFileSystemMaster.getFileInfo(NESTED_FILE_URI);
     Assert.assertFalse(fileInfo.isPinned());
     Assert.assertEquals(Constants.NO_TTL, fileInfo.getTtl());
 
     // Just set pinned flag.
-    mFileSystemMaster.setState(NESTED_FILE_URI, SetAttributeOptions.defaults().setPinned(true));
+    mFileSystemMaster.setAttribute(NESTED_FILE_URI,
+        new SetAttributeOptions.Builder().setPinned(true).build());
     fileInfo = mFileSystemMaster.getFileInfo(NESTED_FILE_URI);
     Assert.assertTrue(fileInfo.isPinned());
     Assert.assertEquals(Constants.NO_TTL, fileInfo.getTtl());
 
     // Both pinned flag and ttl value.
-    mFileSystemMaster.setState(NESTED_FILE_URI, SetAttributeOptions.defaults().setPinned(false)
-        .setTtl(1));
+    mFileSystemMaster.setAttribute(NESTED_FILE_URI,
+        new SetAttributeOptions.Builder().setPinned(false).setTtl(1).build());
     fileInfo = mFileSystemMaster.getFileInfo(NESTED_FILE_URI);
     Assert.assertFalse(fileInfo.isPinned());
     Assert.assertEquals(1, fileInfo.getTtl());
 
     // Set ttl for a directory, raise IllegalArgumentException.
     mThrown.expect(IllegalArgumentException.class);
-    mFileSystemMaster.setState(NESTED_URI, SetAttributeOptions.defaults().setTtl(1));
+    mFileSystemMaster.setAttribute(NESTED_URI,
+        new SetAttributeOptions.Builder().setTtl(1).build());
   }
 
   /**
diff --git a/core/server/src/test/java/tachyon/master/file/PermissionCheckTest.java b/core/server/src/test/java/tachyon/master/file/PermissionCheckTest.java
index 8ecdb4092838..083008cbddce 100644
--- a/core/server/src/test/java/tachyon/master/file/PermissionCheckTest.java
+++ b/core/server/src/test/java/tachyon/master/file/PermissionCheckTest.java
@@ -30,7 +30,6 @@
 
 import tachyon.Constants;
 import tachyon.TachyonURI;
-import tachyon.client.file.options.SetAttributeOptions;
 import tachyon.conf.TachyonConf;
 import tachyon.exception.AccessControlException;
 import tachyon.exception.ExceptionMessage;
@@ -41,6 +40,7 @@
 import tachyon.master.file.options.CreateDirectoryOptions;
 import tachyon.master.file.options.CreateFileOptions;
 import tachyon.master.file.options.SetAclOptions;
+import tachyon.master.file.options.SetAttributeOptions;
 import tachyon.master.journal.Journal;
 import tachyon.master.journal.ReadWriteJournal;
 import tachyon.security.authentication.PlainSaslServer;
@@ -509,18 +509,18 @@ private SetAttributeOptions getNonDefaultSetState() {
     boolean recursive = true;
     long ttl = 11;
 
-    return SetAttributeOptions.defaults().setPinned(recursive).setTtl(ttl);
+    return new SetAttributeOptions.Builder().setPinned(recursive).setTtl(ttl).build();
   }
 
   private SetAttributeOptions verifySetState(
       TestUser user, String path, SetAttributeOptions options) throws Exception {
     PlainSaslServer.AuthorizedClientUser.set(user.getUser());
 
-    mFileSystemMaster.setState(new TachyonURI(path), options);
+    mFileSystemMaster.setAttribute(new TachyonURI(path), options);
 
     FileInfo fileInfo = mFileSystemMaster.getFileInfo(new TachyonURI(path));
-    return SetAttributeOptions.defaults().setPinned(fileInfo.isPinned())
-        .setTtl(fileInfo.getTtl()).setPersisted(fileInfo.isPersisted());
+    return new SetAttributeOptions.Builder().setPinned(fileInfo.isPinned())
+        .setTtl(fileInfo.getTtl()).setPersisted(fileInfo.isPersisted()).build();
   }
 
   @Test
diff --git a/core/server/src/test/java/tachyon/master/file/options/SetAttributeOptionsTest.java b/core/server/src/test/java/tachyon/master/file/options/SetAttributeOptionsTest.java
new file mode 100644
index 000000000000..c0290d600ba4
--- /dev/null
+++ b/core/server/src/test/java/tachyon/master/file/options/SetAttributeOptionsTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the University of California, Berkeley under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package tachyon.master.file.options;
+
+import java.util.Random;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import tachyon.conf.TachyonConf;
+
+/**
+ * Unit tests for {@link SetAttributeOptions}.
+ */
+public class SetAttributeOptionsTest {
+  /**
+   * Tests the {@link SetAttributeOptions.Builder}.
+   */
+  @Test
+  public void builderTest() {
+    Random random = new Random();
+    Boolean pinned = random.nextBoolean();
+    Long ttl = random.nextLong();
+    Boolean persisted = random.nextBoolean();
+
+    SetAttributeOptions options = new SetAttributeOptions.Builder(new TachyonConf())
+        .setPinned(pinned)
+        .setTtl(ttl)
+        .setPersisted(persisted)
+        .build();
+
+    Assert.assertEquals(pinned, options.getPinned());
+    Assert.assertEquals(ttl, options.getTtl());
+    Assert.assertEquals(persisted, options.getPersisted());
+  }
+
+  /**
+   * Tests the {@link CreateDirectoryOptions#defaults()} method.
+   */
+  @Test
+  public void defaultsTest() {
+    SetAttributeOptions options = SetAttributeOptions.defaults();
+
+    Assert.assertNull(options.getPinned());
+    Assert.assertNull(options.getTtl());
+    Assert.assertNull(options.getPersisted());
+  }
+}
diff --git a/core/server/src/test/java/tachyon/master/journal/JournalFormatterTestBase.java b/core/server/src/test/java/tachyon/master/journal/JournalFormatterTestBase.java
index 934a14ba16bf..287637dff47e 100644
--- a/core/server/src/test/java/tachyon/master/journal/JournalFormatterTestBase.java
+++ b/core/server/src/test/java/tachyon/master/journal/JournalFormatterTestBase.java
@@ -41,7 +41,6 @@
 import tachyon.TachyonURI;
 import tachyon.proto.journal.Block.BlockContainerIdGeneratorEntry;
 import tachyon.proto.journal.Block.BlockInfoEntry;
-import tachyon.proto.journal.File;
 import tachyon.proto.journal.File.AddMountPointEntry;
 import tachyon.proto.journal.File.AsyncPersistRequestEntry;
 import tachyon.proto.journal.File.CompleteFileEntry;
@@ -54,7 +53,8 @@
 import tachyon.proto.journal.File.PersistDirectoryEntry;
 import tachyon.proto.journal.File.ReinitializeFileEntry;
 import tachyon.proto.journal.File.RenameEntry;
-import tachyon.proto.journal.File.SetStateEntry;
+import tachyon.proto.journal.File.SetAclEntry;
+import tachyon.proto.journal.File.SetAttributeEntry;
 import tachyon.proto.journal.Journal.JournalEntry;
 import tachyon.proto.journal.KeyValue.CompletePartitionEntry;
 import tachyon.proto.journal.KeyValue.CompleteStoreEntry;
@@ -228,7 +228,7 @@ public abstract class JournalFormatterTestBase {
             .build())
         .add(
             JournalEntry.newBuilder()
-                .setSetState(SetStateEntry.newBuilder()
+                .setSetAttribute(SetAttributeEntry.newBuilder()
                     .setId(TEST_FILE_ID)
                     .setOpTimeMs(TEST_OP_TIME_MS)
                     .setPinned(true)
@@ -237,7 +237,7 @@ public abstract class JournalFormatterTestBase {
                 .build())
         .add(
             JournalEntry.newBuilder()
-                .setSetAcl(File.SetAclEntry.newBuilder()
+                .setSetAcl(SetAclEntry.newBuilder()
                     .setId(TEST_FILE_ID)
                     .setOpTimeMs(TEST_OP_TIME_MS)
                     .setUserName(TEST_PERMISSION_STATUS.getUserName())
diff --git a/core/server/src/test/resources/tachyon/master/journal/JsonJournalEntries.json b/core/server/src/test/resources/tachyon/master/journal/JsonJournalEntries.json
index 2f2806fec671..8f3ed4eb5657 100644
--- a/core/server/src/test/resources/tachyon/master/journal/JsonJournalEntries.json
+++ b/core/server/src/test/resources/tachyon/master/journal/JsonJournalEntries.json
@@ -203,9 +203,9 @@
       ]
     }
   },
-  "SET_STATE":{
+  "SET_ATTRIBUTE":{
     "mSequenceNumber":1945,
-    "mType":"SET_STATE",
+    "mType":"SET_ATTRIBUTE",
     "mParameters":{
       "id":1,
       "operationTimeMs":1409349750338,