Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id ADFE3200D20 for ; Tue, 3 Oct 2017 00:47:12 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id AC9E2160BDA; Mon, 2 Oct 2017 22:47:12 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 5DAF8160BD7 for ; Tue, 3 Oct 2017 00:47:10 +0200 (CEST) Received: (qmail 95929 invoked by uid 500); 2 Oct 2017 22:47:09 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 95884 invoked by uid 99); 2 Oct 2017 22:47:09 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 02 Oct 2017 22:47:09 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id CA8EEF5819; Mon, 2 Oct 2017 22:47:07 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: inigoiri@apache.org To: common-commits@hadoop.apache.org Date: Mon, 02 Oct 2017 22:47:37 -0000 Message-Id: In-Reply-To: <0a68a14797f743219a38d6f9a5a9739a@git.apache.org> References: <0a68a14797f743219a38d6f9a5a9739a@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [31/50] [abbrv] hadoop git commit: HDFS-10687. Federation Membership State Store internal API. Contributed by Jason Kace and Inigo Goiri. archived-at: Mon, 02 Oct 2017 22:47:12 -0000 http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/UpdateNamenodeRegistrationResponse.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/UpdateNamenodeRegistrationResponse.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/UpdateNamenodeRegistrationResponse.java new file mode 100644 index 0000000..1f0d556 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/UpdateNamenodeRegistrationResponse.java @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol; + +import java.io.IOException; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; + +/** + * API response for overriding an existing namenode registration in the state + * store. + */ +public abstract class UpdateNamenodeRegistrationResponse { + + public static UpdateNamenodeRegistrationResponse newInstance() { + return StateStoreSerializer.newRecord( + UpdateNamenodeRegistrationResponse.class); + } + + public static UpdateNamenodeRegistrationResponse newInstance(boolean status) + throws IOException { + UpdateNamenodeRegistrationResponse response = newInstance(); + response.setResult(status); + return response; + } + + @Private + @Unstable + public abstract boolean getResult(); + + @Private + @Unstable + public abstract void setResult(boolean result); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/FederationProtocolPBTranslator.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/FederationProtocolPBTranslator.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/FederationProtocolPBTranslator.java new file mode 100644 index 0000000..baad113 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/FederationProtocolPBTranslator.java @@ -0,0 +1,145 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import java.io.IOException; +import java.lang.reflect.Method; + +import org.apache.commons.codec.binary.Base64; + +import com.google.protobuf.GeneratedMessage; +import com.google.protobuf.Message; +import com.google.protobuf.Message.Builder; +import com.google.protobuf.MessageOrBuilder; + +/** + * Helper class for setting/getting data elements in an object backed by a + * protobuf implementation. + */ +public class FederationProtocolPBTranslator

{ + + /** Optional proto byte stream used to create this object. */ + private P proto; + /** The class of the proto handler for this translator. */ + private Class

protoClass; + /** Internal builder, used to store data that has been set. */ + private B builder; + + public FederationProtocolPBTranslator(Class

protoType) { + this.protoClass = protoType; + } + + /** + * Called if this translator is to be created from an existing protobuf byte + * stream. + * + * @param p The existing proto object to use to initialize the translator. + * @throws IllegalArgumentException + */ + @SuppressWarnings("unchecked") + public void setProto(Message p) { + if (protoClass.isInstance(p)) { + if (this.builder != null) { + // Merge with builder + this.builder.mergeFrom((P) p); + } else { + // Store proto + this.proto = (P) p; + } + } else { + throw new IllegalArgumentException( + "Cannot decode proto type " + p.getClass().getName()); + } + } + + /** + * Create or return the cached protobuf builder for this translator. + * + * @return cached Builder instance + */ + @SuppressWarnings("unchecked") + public B getBuilder() { + if (this.builder == null) { + try { + Method method = protoClass.getMethod("newBuilder"); + this.builder = (B) method.invoke(null); + if (this.proto != null) { + // Merge in existing immutable proto + this.builder.mergeFrom(this.proto); + } + } catch (ReflectiveOperationException e) { + this.builder = null; + } + } + return this.builder; + } + + /** + * Get the serialized proto object. If the translator was created from a byte + * stream, returns the intitial byte stream. Otherwise creates a new byte + * stream from the cached builder. + * + * @return Protobuf message object + */ + @SuppressWarnings("unchecked") + public P build() { + if (this.builder != null) { + // serialize from builder (mutable) first + Message m = this.builder.build(); + return (P) m; + } else if (this.proto != null) { + // Use immutable message source, message is unchanged + return this.proto; + } + return null; + } + + /** + * Returns an interface to access data stored within this object. The object + * may have been initialized either via a builder or by an existing protobuf + * byte stream. + * + * @return MessageOrBuilder protobuf interface for the requested class. + */ + @SuppressWarnings("unchecked") + public T getProtoOrBuilder() { + if (this.builder != null) { + // Use mutable builder if it exists + return (T) this.builder; + } else if (this.proto != null) { + // Use immutable message source + return (T) this.proto; + } else { + // Construct empty builder + return (T) this.getBuilder(); + } + } + + /** + * Read instance from base64 data. + * @param base64String + * @throws IOException + */ + @SuppressWarnings("unchecked") + public void readInstance(String base64String) throws IOException { + byte[] bytes = Base64.decodeBase64(base64String); + Message msg = getBuilder().mergeFrom(bytes).build(); + this.proto = (P) msg; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamenodeRegistrationsRequestPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamenodeRegistrationsRequestPBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamenodeRegistrationsRequestPBImpl.java new file mode 100644 index 0000000..4f7fee1 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamenodeRegistrationsRequestPBImpl.java @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetNamenodeRegistrationsRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetNamenodeRegistrationsRequestProtoOrBuilder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipRecordProto; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetNamenodeRegistrationsRequest; +import org.apache.hadoop.hdfs.server.federation.store.records.MembershipState; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.MembershipStatePBImpl; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * GetNamenodeRegistrationsRequest. + */ +public class GetNamenodeRegistrationsRequestPBImpl + extends GetNamenodeRegistrationsRequest implements PBRecord { + + private FederationProtocolPBTranslator translator = + new FederationProtocolPBTranslator< + GetNamenodeRegistrationsRequestProto, + GetNamenodeRegistrationsRequestProto.Builder, + GetNamenodeRegistrationsRequestProtoOrBuilder>( + GetNamenodeRegistrationsRequestProto.class); + + public GetNamenodeRegistrationsRequestPBImpl() { + } + + public GetNamenodeRegistrationsRequestPBImpl( + GetNamenodeRegistrationsRequestProto proto) { + this.translator.setProto(proto); + } + + @Override + public GetNamenodeRegistrationsRequestProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public MembershipState getPartialMembership() { + GetNamenodeRegistrationsRequestProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasMembership()){ + return null; + } + NamenodeMembershipRecordProto memberProto = proto.getMembership(); + return new MembershipStatePBImpl(memberProto); + } + + @Override + public void setPartialMembership(MembershipState member) { + MembershipStatePBImpl memberPB = (MembershipStatePBImpl)member; + this.translator.getBuilder().setMembership(memberPB.getProto()); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamenodeRegistrationsResponsePBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamenodeRegistrationsResponsePBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamenodeRegistrationsResponsePBImpl.java new file mode 100644 index 0000000..f6be11d --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamenodeRegistrationsResponsePBImpl.java @@ -0,0 +1,99 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetNamenodeRegistrationsResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetNamenodeRegistrationsResponseProtoOrBuilder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipRecordProto; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetNamenodeRegistrationsResponse; +import org.apache.hadoop.hdfs.server.federation.store.records.MembershipState; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.MembershipStatePBImpl; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * GetNamenodeRegistrationsResponse. + */ +public class GetNamenodeRegistrationsResponsePBImpl + extends GetNamenodeRegistrationsResponse implements PBRecord { + + private FederationProtocolPBTranslator translator = + new FederationProtocolPBTranslator< + GetNamenodeRegistrationsResponseProto, + GetNamenodeRegistrationsResponseProto.Builder, + GetNamenodeRegistrationsResponseProtoOrBuilder>( + GetNamenodeRegistrationsResponseProto.class); + + public GetNamenodeRegistrationsResponsePBImpl() { + } + + public GetNamenodeRegistrationsResponsePBImpl( + GetNamenodeRegistrationsResponseProto proto) { + this.translator.setProto(proto); + } + + @Override + public GetNamenodeRegistrationsResponseProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public List getNamenodeMemberships() + throws IOException { + + List ret = new ArrayList(); + List memberships = + this.translator.getProtoOrBuilder().getNamenodeMembershipsList(); + for (NamenodeMembershipRecordProto memberProto : memberships) { + MembershipState membership = new MembershipStatePBImpl(memberProto); + ret.add(membership); + } + + return ret; + } + + @Override + public void setNamenodeMemberships(List records) + throws IOException { + for (MembershipState member : records) { + if (member instanceof MembershipStatePBImpl) { + MembershipStatePBImpl memberPB = (MembershipStatePBImpl)member; + this.translator.getBuilder().addNamenodeMemberships( + memberPB.getProto()); + } + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamespaceInfoRequestPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamespaceInfoRequestPBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamespaceInfoRequestPBImpl.java new file mode 100644 index 0000000..5f3e186 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamespaceInfoRequestPBImpl.java @@ -0,0 +1,60 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetNamespaceInfoRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetNamespaceInfoRequestProto.Builder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetNamespaceInfoRequestProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetNamespaceInfoRequest; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * GetNamespaceInfoRequest. + */ +public class GetNamespaceInfoRequestPBImpl extends GetNamespaceInfoRequest + implements PBRecord { + + private FederationProtocolPBTranslator translator = + new FederationProtocolPBTranslator( + GetNamespaceInfoRequestProto.class); + + public GetNamespaceInfoRequestPBImpl() { + } + + @Override + public GetNamespaceInfoRequestProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message protocol) { + this.translator.setProto(protocol); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamespaceInfoResponsePBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamespaceInfoResponsePBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamespaceInfoResponsePBImpl.java new file mode 100644 index 0000000..be1b184 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetNamespaceInfoResponsePBImpl.java @@ -0,0 +1,95 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.FederationNamespaceInfoProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetNamespaceInfoResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetNamespaceInfoResponseProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.resolver.FederationNamespaceInfo; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetNamespaceInfoResponse; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * GetNamespaceInfoResponse. + */ +public class GetNamespaceInfoResponsePBImpl + extends GetNamespaceInfoResponse implements PBRecord { + + private FederationProtocolPBTranslator translator = + new FederationProtocolPBTranslator( + GetNamespaceInfoResponseProto.class); + + public GetNamespaceInfoResponsePBImpl() { + } + + @Override + public GetNamespaceInfoResponseProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message protocol) { + this.translator.setProto(protocol); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public Set getNamespaceInfo() { + + Set ret = new HashSet(); + List namespaceList = + this.translator.getProtoOrBuilder().getNamespaceInfosList(); + for (FederationNamespaceInfoProto ns : namespaceList) { + FederationNamespaceInfo info = new FederationNamespaceInfo( + ns.getBlockPoolId(), ns.getClusterId(), ns.getNameserviceId()); + ret.add(info); + } + return ret; + } + + @Override + public void setNamespaceInfo(Set namespaceInfo) { + int index = 0; + for (FederationNamespaceInfo item : namespaceInfo) { + FederationNamespaceInfoProto.Builder itemBuilder = + FederationNamespaceInfoProto.newBuilder(); + itemBuilder.setClusterId(item.getClusterId()); + itemBuilder.setBlockPoolId(item.getBlockPoolId()); + itemBuilder.setNameserviceId(item.getNameserviceId()); + this.translator.getBuilder().addNamespaceInfos(index, + itemBuilder.build()); + index++; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/NamenodeHeartbeatRequestPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/NamenodeHeartbeatRequestPBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/NamenodeHeartbeatRequestPBImpl.java new file mode 100644 index 0000000..d1fc73f --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/NamenodeHeartbeatRequestPBImpl.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeHeartbeatRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeHeartbeatRequestProto.Builder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeHeartbeatRequestProtoOrBuilder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipRecordProto; +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; +import org.apache.hadoop.hdfs.server.federation.store.protocol.NamenodeHeartbeatRequest; +import org.apache.hadoop.hdfs.server.federation.store.records.MembershipState; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.MembershipStatePBImpl; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * NamenodeHeartbeatRequest. + */ +public class NamenodeHeartbeatRequestPBImpl + extends NamenodeHeartbeatRequest implements PBRecord { + + private FederationProtocolPBTranslator translator = + new FederationProtocolPBTranslator( + NamenodeHeartbeatRequestProto.class); + + public NamenodeHeartbeatRequestPBImpl() { + } + + @Override + public NamenodeHeartbeatRequestProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public MembershipState getNamenodeMembership() throws IOException { + NamenodeMembershipRecordProto membershipProto = + this.translator.getProtoOrBuilder().getNamenodeMembership(); + MembershipState membership = + StateStoreSerializer.newRecord(MembershipState.class); + if (membership instanceof MembershipStatePBImpl) { + MembershipStatePBImpl membershipPB = (MembershipStatePBImpl)membership; + membershipPB.setProto(membershipProto); + return membershipPB; + } else { + throw new IOException("Cannot get membership from request"); + } + } + + @Override + public void setNamenodeMembership(MembershipState membership) + throws IOException { + if (membership instanceof MembershipStatePBImpl) { + MembershipStatePBImpl membershipPB = (MembershipStatePBImpl)membership; + NamenodeMembershipRecordProto membershipProto = + (NamenodeMembershipRecordProto)membershipPB.getProto(); + this.translator.getBuilder().setNamenodeMembership(membershipProto); + } else { + throw new IOException("Cannot set mount table entry"); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/NamenodeHeartbeatResponsePBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/NamenodeHeartbeatResponsePBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/NamenodeHeartbeatResponsePBImpl.java new file mode 100644 index 0000000..c243a6f --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/NamenodeHeartbeatResponsePBImpl.java @@ -0,0 +1,71 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeHeartbeatResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeHeartbeatResponseProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.NamenodeHeartbeatResponse; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * NamenodeHeartbeatResponse. + */ +public class NamenodeHeartbeatResponsePBImpl extends NamenodeHeartbeatResponse + implements PBRecord { + + private FederationProtocolPBTranslator translator = + new FederationProtocolPBTranslator( + NamenodeHeartbeatResponseProto.class); + + public NamenodeHeartbeatResponsePBImpl() { + } + + @Override + public NamenodeHeartbeatResponseProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public boolean getResult() { + return this.translator.getProtoOrBuilder().getStatus(); + } + + @Override + public void setResult(boolean result) { + this.translator.getBuilder().setStatus(result); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/UpdateNamenodeRegistrationRequestPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/UpdateNamenodeRegistrationRequestPBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/UpdateNamenodeRegistrationRequestPBImpl.java new file mode 100644 index 0000000..5091360 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/UpdateNamenodeRegistrationRequestPBImpl.java @@ -0,0 +1,95 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.UpdateNamenodeRegistrationRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.UpdateNamenodeRegistrationRequestProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.resolver.FederationNamenodeServiceState; +import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateNamenodeRegistrationRequest; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * OverrideNamenodeRegistrationRequest. + */ +public class UpdateNamenodeRegistrationRequestPBImpl + extends UpdateNamenodeRegistrationRequest implements PBRecord { + + private FederationProtocolPBTranslator< + UpdateNamenodeRegistrationRequestProto, + UpdateNamenodeRegistrationRequestProto.Builder, + UpdateNamenodeRegistrationRequestProtoOrBuilder> translator = + new FederationProtocolPBTranslator< + UpdateNamenodeRegistrationRequestProto, + UpdateNamenodeRegistrationRequestProto.Builder, + UpdateNamenodeRegistrationRequestProtoOrBuilder>( + UpdateNamenodeRegistrationRequestProto.class); + + public UpdateNamenodeRegistrationRequestPBImpl() { + } + + @Override + public UpdateNamenodeRegistrationRequestProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message protocol) { + this.translator.setProto(protocol); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public String getNameserviceId() { + return this.translator.getProtoOrBuilder().getNameserviceId(); + } + + @Override + public String getNamenodeId() { + return this.translator.getProtoOrBuilder().getNamenodeId(); + } + + @Override + public FederationNamenodeServiceState getState() { + return FederationNamenodeServiceState + .valueOf(this.translator.getProtoOrBuilder().getState()); + } + + @Override + public void setNameserviceId(String nsId) { + this.translator.getBuilder().setNameserviceId(nsId); + } + + @Override + public void setNamenodeId(String nnId) { + this.translator.getBuilder().setNamenodeId(nnId); + } + + @Override + public void setState(FederationNamenodeServiceState state) { + this.translator.getBuilder().setState(state.toString()); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/UpdateNamenodeRegistrationResponsePBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/UpdateNamenodeRegistrationResponsePBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/UpdateNamenodeRegistrationResponsePBImpl.java new file mode 100644 index 0000000..4558f06 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/UpdateNamenodeRegistrationResponsePBImpl.java @@ -0,0 +1,73 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.UpdateNamenodeRegistrationResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.UpdateNamenodeRegistrationResponseProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateNamenodeRegistrationResponse; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * OverrideNamenodeRegistrationResponse. + */ +public class UpdateNamenodeRegistrationResponsePBImpl + extends UpdateNamenodeRegistrationResponse implements PBRecord { + + private FederationProtocolPBTranslator< + UpdateNamenodeRegistrationResponseProto, + UpdateNamenodeRegistrationResponseProto.Builder, + UpdateNamenodeRegistrationResponseProtoOrBuilder> translator = + new FederationProtocolPBTranslator< + UpdateNamenodeRegistrationResponseProto, + UpdateNamenodeRegistrationResponseProto.Builder, + UpdateNamenodeRegistrationResponseProtoOrBuilder>( + UpdateNamenodeRegistrationResponseProto.class); + + public UpdateNamenodeRegistrationResponsePBImpl() { + } + + @Override + public UpdateNamenodeRegistrationResponseProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public boolean getResult() { + return this.translator.getProtoOrBuilder().getStatus(); + } + + @Override + public void setResult(boolean result) { + this.translator.getBuilder().setStatus(result); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/package-info.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/package-info.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/package-info.java new file mode 100644 index 0000000..43c94be --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/package-info.java @@ -0,0 +1,29 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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. + */ + +/** + * Protobuf implementations of FederationProtocolBase request/response objects + * used by state store APIs. Each state store API is defined in the + * org.apache.hadoop.hdfs.server.federation.store.protocol package. + */ +@InterfaceAudience.Private +@InterfaceStability.Evolving +package org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipState.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipState.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipState.java new file mode 100644 index 0000000..ab0ff0a --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipState.java @@ -0,0 +1,329 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.records; + +import static org.apache.hadoop.hdfs.server.federation.resolver.FederationNamenodeServiceState.ACTIVE; +import static org.apache.hadoop.hdfs.server.federation.resolver.FederationNamenodeServiceState.EXPIRED; +import static org.apache.hadoop.hdfs.server.federation.resolver.FederationNamenodeServiceState.UNAVAILABLE; + +import java.io.IOException; +import java.util.Comparator; +import java.util.SortedMap; +import java.util.TreeMap; + +import org.apache.hadoop.hdfs.server.federation.resolver.FederationNamenodeContext; +import org.apache.hadoop.hdfs.server.federation.resolver.FederationNamenodeServiceState; +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; + +/** + * Data schema for storing NN registration information in the + * {@link org.apache.hadoop.hdfs.server.federation.store.StateStoreService + * FederationStateStoreService}. + */ +public abstract class MembershipState extends BaseRecord + implements FederationNamenodeContext { + + /** Expiration time in ms for this entry. */ + private static long expirationMs; + + + /** Comparator based on the name.*/ + public static final Comparator NAME_COMPARATOR = + new Comparator() { + public int compare(MembershipState m1, MembershipState m2) { + return m1.compareNameTo(m2); + } + }; + + + /** + * Constructors. + */ + public MembershipState() { + super(); + } + + /** + * Create a new membership instance. + * @return Membership instance. + * @throws IOException + */ + public static MembershipState newInstance() { + MembershipState record = + StateStoreSerializer.newRecord(MembershipState.class); + record.init(); + return record; + } + + /** + * Create a new membership instance. + * + * @param router Identifier of the router. + * @param nameservice Identifier of the nameservice. + * @param namenode Identifier of the namenode. + * @param clusterId Identifier of the cluster. + * @param blockPoolId Identifier of the blockpool. + * @param rpcAddress RPC address. + * @param serviceAddress Service RPC address. + * @param lifelineAddress Lifeline RPC address. + * @param webAddress HTTP address. + * @param state State of the federation. + * @param safemode If the safe mode is enabled. + * @return Membership instance. + * @throws IOException If we cannot create the instance. + */ + public static MembershipState newInstance(String router, String nameservice, + String namenode, String clusterId, String blockPoolId, String rpcAddress, + String serviceAddress, String lifelineAddress, String webAddress, + FederationNamenodeServiceState state, boolean safemode) { + + MembershipState record = MembershipState.newInstance(); + record.setRouterId(router); + record.setNameserviceId(nameservice); + record.setNamenodeId(namenode); + record.setRpcAddress(rpcAddress); + record.setServiceAddress(serviceAddress); + record.setLifelineAddress(lifelineAddress); + record.setWebAddress(webAddress); + record.setIsSafeMode(safemode); + record.setState(state); + record.setClusterId(clusterId); + record.setBlockPoolId(blockPoolId); + record.validate(); + return record; + } + + public abstract void setRouterId(String routerId); + + public abstract String getRouterId(); + + public abstract void setNameserviceId(String nameserviceId); + + public abstract void setNamenodeId(String namenodeId); + + public abstract void setWebAddress(String webAddress); + + public abstract void setRpcAddress(String rpcAddress); + + public abstract void setServiceAddress(String serviceAddress); + + public abstract void setLifelineAddress(String lifelineAddress); + + public abstract void setIsSafeMode(boolean isSafeMode); + + public abstract void setClusterId(String clusterId); + + public abstract void setBlockPoolId(String blockPoolId); + + public abstract void setState(FederationNamenodeServiceState state); + + public abstract String getNameserviceId(); + + public abstract String getNamenodeId(); + + public abstract String getClusterId(); + + public abstract String getBlockPoolId(); + + public abstract String getRpcAddress(); + + public abstract String getServiceAddress(); + + public abstract String getLifelineAddress(); + + public abstract String getWebAddress(); + + public abstract boolean getIsSafeMode(); + + public abstract FederationNamenodeServiceState getState(); + + public abstract void setStats(MembershipStats stats); + + public abstract MembershipStats getStats() throws IOException; + + public abstract void setLastContact(long contact); + + public abstract long getLastContact(); + + @Override + public boolean like(BaseRecord o) { + if (o instanceof MembershipState) { + MembershipState other = (MembershipState)o; + if (getRouterId() != null && + !getRouterId().equals(other.getRouterId())) { + return false; + } + if (getNameserviceId() != null && + !getNameserviceId().equals(other.getNameserviceId())) { + return false; + } + if (getNamenodeId() != null && + !getNamenodeId().equals(other.getNamenodeId())) { + return false; + } + if (getRpcAddress() != null && + !getRpcAddress().equals(other.getRpcAddress())) { + return false; + } + if (getClusterId() != null && + !getClusterId().equals(other.getClusterId())) { + return false; + } + if (getBlockPoolId() != null && + !getBlockPoolId().equals(other.getBlockPoolId())) { + return false; + } + if (getState() != null && + !getState().equals(other.getState())) { + return false; + } + return true; + } + return false; + } + + @Override + public String toString() { + return getRouterId() + "->" + getNameserviceId() + ":" + getNamenodeId() + + ":" + getRpcAddress() + "-" + getState(); + } + + @Override + public SortedMap getPrimaryKeys() { + SortedMap map = new TreeMap(); + map.put("routerId", getRouterId()); + map.put("nameserviceId", getNameserviceId()); + map.put("namenodeId", getNamenodeId()); + return map; + } + + /** + * Check if the namenode is available. + * + * @return If the namenode is available. + */ + public boolean isAvailable() { + return getState() == ACTIVE; + } + + /** + * Validates the entry. Throws an IllegalArgementException if the data record + * is missing required information. + */ + @Override + public boolean validate() { + boolean ret = super.validate(); + if (getNameserviceId() == null || getNameserviceId().length() == 0) { + //LOG.error("Invalid registration, no nameservice specified " + this); + ret = false; + } + if (getWebAddress() == null || getWebAddress().length() == 0) { + //LOG.error("Invalid registration, no web address specified " + this); + ret = false; + } + if (getRpcAddress() == null || getRpcAddress().length() == 0) { + //LOG.error("Invalid registration, no rpc address specified " + this); + ret = false; + } + if (!isBadState() && + (getBlockPoolId().isEmpty() || getBlockPoolId().length() == 0)) { + //LOG.error("Invalid registration, no block pool specified " + this); + ret = false; + } + return ret; + } + + + /** + * Overrides the cached getBlockPoolId() with an update. The state will be + * reset when the cache is flushed + * + * @param newState Service state of the namenode. + */ + public void overrideState(FederationNamenodeServiceState newState) { + this.setState(newState); + } + + /** + * Sort by nameservice, namenode, and router. + * + * @param other Another membership to compare to. + * @return If this object goes before the parameter. + */ + public int compareNameTo(MembershipState other) { + int ret = this.getNameserviceId().compareTo(other.getNameserviceId()); + if (ret == 0) { + ret = this.getNamenodeId().compareTo(other.getNamenodeId()); + } + if (ret == 0) { + ret = this.getRouterId().compareTo(other.getRouterId()); + } + return ret; + } + + /** + * Get the identifier of this namenode registration. + * @return Identifier of the namenode. + */ + public String getNamenodeKey() { + return getNamenodeKey(this.getNameserviceId(), this.getNamenodeId()); + } + + /** + * Generate the identifier for a Namenode in the HDFS federation. + * + * @param nsId Nameservice of the Namenode. + * @param nnId Namenode within the Nameservice (HA). + * @return Namenode identifier within the federation. + */ + public static String getNamenodeKey(String nsId, String nnId) { + return nsId + "-" + nnId; + } + + /** + * Check if the membership is in a bad state (expired or unavailable). + * @return If the membership is in a bad state (expired or unavailable). + */ + private boolean isBadState() { + return this.getState() == EXPIRED || this.getState() == UNAVAILABLE; + } + + @Override + public boolean checkExpired(long currentTime) { + if (super.checkExpired(currentTime)) { + this.setState(EXPIRED); + // Commit it + return true; + } + return false; + } + + @Override + public long getExpirationMs() { + return MembershipState.expirationMs; + } + + /** + * Set the expiration time for this class. + * + * @param time Expiration time in milliseconds. + */ + public static void setExpirationMs(long time) { + MembershipState.expirationMs = time; + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipStats.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipStats.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipStats.java new file mode 100644 index 0000000..0bd19d9 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipStats.java @@ -0,0 +1,126 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.records; + +import java.io.IOException; +import java.util.SortedMap; +import java.util.TreeMap; + +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; + +/** + * Data schema for storing NN stats in the + * {@link org.apache.hadoop.hdfs.server.federation.store.StateStoreService + * StateStoreService}. + */ +public abstract class MembershipStats extends BaseRecord { + + public static MembershipStats newInstance() throws IOException { + MembershipStats record = + StateStoreSerializer.newRecord(MembershipStats.class); + record.init(); + return record; + } + + public abstract void setTotalSpace(long space); + + public abstract long getTotalSpace(); + + public abstract void setAvailableSpace(long space); + + public abstract long getAvailableSpace(); + + public abstract void setNumOfFiles(long files); + + public abstract long getNumOfFiles(); + + public abstract void setNumOfBlocks(long blocks); + + public abstract long getNumOfBlocks(); + + public abstract void setNumOfBlocksMissing(long blocks); + + public abstract long getNumOfBlocksMissing(); + + public abstract void setNumOfBlocksPendingReplication(long blocks); + + public abstract long getNumOfBlocksPendingReplication(); + + public abstract void setNumOfBlocksUnderReplicated(long blocks); + + public abstract long getNumOfBlocksUnderReplicated(); + + public abstract void setNumOfBlocksPendingDeletion(long blocks); + + public abstract long getNumOfBlocksPendingDeletion(); + + public abstract void setNumOfActiveDatanodes(int nodes); + + public abstract int getNumOfActiveDatanodes(); + + public abstract void setNumOfDeadDatanodes(int nodes); + + public abstract int getNumOfDeadDatanodes(); + + public abstract void setNumOfDecommissioningDatanodes(int nodes); + + public abstract int getNumOfDecommissioningDatanodes(); + + public abstract void setNumOfDecomActiveDatanodes(int nodes); + + public abstract int getNumOfDecomActiveDatanodes(); + + public abstract void setNumOfDecomDeadDatanodes(int nodes); + + public abstract int getNumOfDecomDeadDatanodes(); + + @Override + public SortedMap getPrimaryKeys() { + // This record is not stored directly, no key needed + SortedMap map = new TreeMap(); + return map; + } + + @Override + public long getExpirationMs() { + // This record is not stored directly, no expiration needed + return -1; + } + + @Override + public void setDateModified(long time) { + // We don't store this record directly + } + + @Override + public long getDateModified() { + // We don't store this record directly + return 0; + } + + @Override + public void setDateCreated(long time) { + // We don't store this record directly + } + + @Override + public long getDateCreated() { + // We don't store this record directly + return 0; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/impl/pb/MembershipStatePBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/impl/pb/MembershipStatePBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/impl/pb/MembershipStatePBImpl.java new file mode 100644 index 0000000..805c2af --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/impl/pb/MembershipStatePBImpl.java @@ -0,0 +1,334 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.records.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipRecordProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipRecordProto.Builder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipRecordProtoOrBuilder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipStatsRecordProto; +import org.apache.hadoop.hdfs.server.federation.resolver.FederationNamenodeServiceState; +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.FederationProtocolPBTranslator; +import org.apache.hadoop.hdfs.server.federation.store.records.MembershipState; +import org.apache.hadoop.hdfs.server.federation.store.records.MembershipStats; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the MembershipState record. + */ +public class MembershipStatePBImpl extends MembershipState implements PBRecord { + + private FederationProtocolPBTranslator translator = + new FederationProtocolPBTranslator( + NamenodeMembershipRecordProto.class); + + public MembershipStatePBImpl() { + } + + public MembershipStatePBImpl(NamenodeMembershipRecordProto proto) { + this.translator.setProto(proto); + } + + @Override + public NamenodeMembershipRecordProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public void setRouterId(String routerId) { + Builder builder = this.translator.getBuilder(); + if (routerId == null) { + builder.clearRouterId(); + } else { + builder.setRouterId(routerId); + } + } + + @Override + public void setNameserviceId(String nameserviceId) { + Builder builder = this.translator.getBuilder(); + if (nameserviceId == null) { + builder.clearNameserviceId(); + } else { + builder.setNameserviceId(nameserviceId); + } + } + + @Override + public void setNamenodeId(String namenodeId) { + Builder builder = this.translator.getBuilder(); + if (namenodeId == null) { + builder.clearNamenodeId(); + } else { + builder.setNamenodeId(namenodeId); + } + } + + @Override + public void setWebAddress(String webAddress) { + Builder builder = this.translator.getBuilder(); + if (webAddress == null) { + builder.clearWebAddress(); + } else { + builder.setWebAddress(webAddress); + } + } + + @Override + public void setRpcAddress(String rpcAddress) { + Builder builder = this.translator.getBuilder(); + if (rpcAddress == null) { + builder.clearRpcAddress(); + } else { + builder.setRpcAddress(rpcAddress); + } + } + + @Override + public void setServiceAddress(String serviceAddress) { + this.translator.getBuilder().setServiceAddress(serviceAddress); + } + + @Override + public void setLifelineAddress(String lifelineAddress) { + Builder builder = this.translator.getBuilder(); + if (lifelineAddress == null) { + builder.clearLifelineAddress(); + } else { + builder.setLifelineAddress(lifelineAddress); + } + } + + @Override + public void setIsSafeMode(boolean isSafeMode) { + Builder builder = this.translator.getBuilder(); + builder.setIsSafeMode(isSafeMode); + } + + @Override + public void setClusterId(String clusterId) { + Builder builder = this.translator.getBuilder(); + if (clusterId == null) { + builder.clearClusterId(); + } else { + builder.setClusterId(clusterId); + } + } + + @Override + public void setBlockPoolId(String blockPoolId) { + Builder builder = this.translator.getBuilder(); + if (blockPoolId == null) { + builder.clearBlockPoolId(); + } else { + builder.setBlockPoolId(blockPoolId); + } + } + + @Override + public void setState(FederationNamenodeServiceState state) { + Builder builder = this.translator.getBuilder(); + if (state == null) { + builder.clearState(); + } else { + builder.setState(state.toString()); + } + } + + @Override + public String getRouterId() { + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasRouterId()) { + return null; + } + return proto.getRouterId(); + } + + @Override + public String getNameserviceId() { + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasNameserviceId()) { + return null; + } + return this.translator.getProtoOrBuilder().getNameserviceId(); + } + + @Override + public String getNamenodeId() { + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasNamenodeId()) { + return null; + } + return this.translator.getProtoOrBuilder().getNamenodeId(); + } + + @Override + public String getClusterId() { + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasClusterId()) { + return null; + } + return this.translator.getProtoOrBuilder().getClusterId(); + } + + @Override + public String getBlockPoolId() { + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasBlockPoolId()) { + return null; + } + return this.translator.getProtoOrBuilder().getBlockPoolId(); + } + + @Override + public String getRpcAddress() { + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasRpcAddress()) { + return null; + } + return this.translator.getProtoOrBuilder().getRpcAddress(); + } + + @Override + public String getServiceAddress() { + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasServiceAddress()) { + return null; + } + return this.translator.getProtoOrBuilder().getServiceAddress(); + } + + @Override + public String getWebAddress() { + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasWebAddress()) { + return null; + } + return this.translator.getProtoOrBuilder().getWebAddress(); + } + + @Override + public String getLifelineAddress() { + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasLifelineAddress()) { + return null; + } + return this.translator.getProtoOrBuilder().getLifelineAddress(); + } + + @Override + public boolean getIsSafeMode() { + return this.translator.getProtoOrBuilder().getIsSafeMode(); + } + + @Override + public FederationNamenodeServiceState getState() { + FederationNamenodeServiceState ret = + FederationNamenodeServiceState.UNAVAILABLE; + NamenodeMembershipRecordProtoOrBuilder proto = + this.translator.getProtoOrBuilder(); + if (!proto.hasState()) { + return null; + } + try { + ret = FederationNamenodeServiceState.valueOf(proto.getState()); + } catch (IllegalArgumentException e) { + // Ignore this error + } + return ret; + } + + @Override + public void setStats(MembershipStats stats) { + if (stats instanceof MembershipStatsPBImpl) { + MembershipStatsPBImpl statsPB = (MembershipStatsPBImpl)stats; + NamenodeMembershipStatsRecordProto statsProto = + (NamenodeMembershipStatsRecordProto)statsPB.getProto(); + this.translator.getBuilder().setStats(statsProto); + } + } + + @Override + public MembershipStats getStats() throws IOException { + NamenodeMembershipStatsRecordProto statsProto = + this.translator.getProtoOrBuilder().getStats(); + MembershipStats stats = + StateStoreSerializer.newRecord(MembershipStats.class); + if (stats instanceof MembershipStatsPBImpl) { + MembershipStatsPBImpl statsPB = (MembershipStatsPBImpl)stats; + statsPB.setProto(statsProto); + return statsPB; + } else { + throw new IOException("Cannot get stats for the membership"); + } + } + + @Override + public void setLastContact(long contact) { + this.translator.getBuilder().setLastContact(contact); + } + + @Override + public long getLastContact() { + return this.translator.getProtoOrBuilder().getLastContact(); + } + + @Override + public void setDateModified(long time) { + this.translator.getBuilder().setDateModified(time); + } + + @Override + public long getDateModified() { + return this.translator.getProtoOrBuilder().getDateModified(); + } + + @Override + public void setDateCreated(long time) { + this.translator.getBuilder().setDateCreated(time); + } + + @Override + public long getDateCreated() { + return this.translator.getProtoOrBuilder().getDateCreated(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/impl/pb/MembershipStatsPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/impl/pb/MembershipStatsPBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/impl/pb/MembershipStatsPBImpl.java new file mode 100644 index 0000000..9f0a167 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/impl/pb/MembershipStatsPBImpl.java @@ -0,0 +1,191 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 org.apache.hadoop.hdfs.server.federation.store.records.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipStatsRecordProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipStatsRecordProto.Builder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.NamenodeMembershipStatsRecordProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.FederationProtocolPBTranslator; +import org.apache.hadoop.hdfs.server.federation.store.records.MembershipStats; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the MembershipStats record. + */ +public class MembershipStatsPBImpl extends MembershipStats + implements PBRecord { + + private FederationProtocolPBTranslator translator = + new FederationProtocolPBTranslator( + NamenodeMembershipStatsRecordProto.class); + + public MembershipStatsPBImpl() { + } + + @Override + public NamenodeMembershipStatsRecordProto getProto() { + return this.translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public void setTotalSpace(long space) { + this.translator.getBuilder().setTotalSpace(space); + } + + @Override + public long getTotalSpace() { + return this.translator.getProtoOrBuilder().getTotalSpace(); + } + + @Override + public void setAvailableSpace(long space) { + this.translator.getBuilder().setAvailableSpace(space); + } + + @Override + public long getAvailableSpace() { + return this.translator.getProtoOrBuilder().getAvailableSpace(); + } + + @Override + public void setNumOfFiles(long files) { + this.translator.getBuilder().setNumOfFiles(files); + } + + @Override + public long getNumOfFiles() { + return this.translator.getProtoOrBuilder().getNumOfFiles(); + } + + @Override + public void setNumOfBlocks(long blocks) { + this.translator.getBuilder().setNumOfBlocks(blocks); + } + + @Override + public long getNumOfBlocks() { + return this.translator.getProtoOrBuilder().getNumOfBlocks(); + } + + @Override + public void setNumOfBlocksMissing(long blocks) { + this.translator.getBuilder().setNumOfBlocksMissing(blocks); + } + + @Override + public long getNumOfBlocksMissing() { + return this.translator.getProtoOrBuilder().getNumOfBlocksMissing(); + } + + @Override + public void setNumOfBlocksPendingReplication(long blocks) { + this.translator.getBuilder().setNumOfBlocksPendingReplication(blocks); + } + + @Override + public long getNumOfBlocksPendingReplication() { + return this.translator.getProtoOrBuilder() + .getNumOfBlocksPendingReplication(); + } + + @Override + public void setNumOfBlocksUnderReplicated(long blocks) { + this.translator.getBuilder().setNumOfBlocksUnderReplicated(blocks); + } + + @Override + public long getNumOfBlocksUnderReplicated() { + return this.translator.getProtoOrBuilder().getNumOfBlocksUnderReplicated(); + } + + @Override + public void setNumOfBlocksPendingDeletion(long blocks) { + this.translator.getBuilder().setNumOfBlocksPendingDeletion(blocks); + } + + @Override + public long getNumOfBlocksPendingDeletion() { + return this.translator.getProtoOrBuilder().getNumOfBlocksPendingDeletion(); + } + + @Override + public void setNumOfActiveDatanodes(int nodes) { + this.translator.getBuilder().setNumOfActiveDatanodes(nodes); + } + + @Override + public int getNumOfActiveDatanodes() { + return this.translator.getProtoOrBuilder().getNumOfActiveDatanodes(); + } + + @Override + public void setNumOfDeadDatanodes(int nodes) { + this.translator.getBuilder().setNumOfDeadDatanodes(nodes); + } + + @Override + public int getNumOfDeadDatanodes() { + return this.translator.getProtoOrBuilder().getNumOfDeadDatanodes(); + } + + @Override + public void setNumOfDecommissioningDatanodes(int nodes) { + this.translator.getBuilder().setNumOfDecommissioningDatanodes(nodes); + } + + @Override + public int getNumOfDecommissioningDatanodes() { + return this.translator.getProtoOrBuilder() + .getNumOfDecommissioningDatanodes(); + } + + @Override + public void setNumOfDecomActiveDatanodes(int nodes) { + this.translator.getBuilder().setNumOfDecomActiveDatanodes(nodes); + } + + @Override + public int getNumOfDecomActiveDatanodes() { + return this.translator.getProtoOrBuilder().getNumOfDecomActiveDatanodes(); + } + + @Override + public void setNumOfDecomDeadDatanodes(int nodes) { + this.translator.getBuilder().setNumOfDecomDeadDatanodes(nodes); + } + + @Override + public int getNumOfDecomDeadDatanodes() { + return this.translator.getProtoOrBuilder().getNumOfDecomDeadDatanodes(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/FederationProtocol.proto ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/FederationProtocol.proto b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/FederationProtocol.proto new file mode 100644 index 0000000..487fe46 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/FederationProtocol.proto @@ -0,0 +1,107 @@ +/** + * Licensed to the Apache Software Foundation (ASF) 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 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. + */ + +option java_package = "org.apache.hadoop.hdfs.federation.protocol.proto"; +option java_outer_classname = "HdfsServerFederationProtos"; +option java_generic_services = true; +option java_generate_equals_and_hash = true; +package hadoop.hdfs; + + +///////////////////////////////////////////////// +// Membership +///////////////////////////////////////////////// + +message NamenodeMembershipStatsRecordProto { + optional uint64 totalSpace = 1; + optional uint64 availableSpace = 2; + + optional uint64 numOfFiles = 10; + optional uint64 numOfBlocks = 11; + optional uint64 numOfBlocksMissing = 12; + optional uint64 numOfBlocksPendingReplication = 13; + optional uint64 numOfBlocksUnderReplicated = 14; + optional uint64 numOfBlocksPendingDeletion = 15; + + optional uint32 numOfActiveDatanodes = 20; + optional uint32 numOfDeadDatanodes = 21; + optional uint32 numOfDecommissioningDatanodes = 22; + optional uint32 numOfDecomActiveDatanodes = 23; + optional uint32 numOfDecomDeadDatanodes = 24; +} + +message NamenodeMembershipRecordProto { + optional uint64 dateCreated = 1; + optional uint64 dateModified = 2; + optional uint64 lastContact = 3; + optional string routerId = 4; + optional string nameserviceId = 5; + optional string namenodeId = 6; + optional string clusterId = 7; + optional string blockPoolId = 8; + optional string webAddress = 9; + optional string rpcAddress = 10; + optional string serviceAddress = 11; + optional string lifelineAddress = 12; + optional string state = 13; + optional bool isSafeMode = 14; + + optional NamenodeMembershipStatsRecordProto stats = 15; +} + +message FederationNamespaceInfoProto { + optional string blockPoolId = 1; + optional string clusterId = 2; + optional string nameserviceId = 3; +} + +message GetNamenodeRegistrationsRequestProto { + optional NamenodeMembershipRecordProto membership = 1; +} + +message GetNamenodeRegistrationsResponseProto { + repeated NamenodeMembershipRecordProto namenodeMemberships = 1; +} + +message GetExpiredRegistrationsRequestProto { +} + +message GetNamespaceInfoRequestProto { +} + +message GetNamespaceInfoResponseProto { + repeated FederationNamespaceInfoProto namespaceInfos = 1; +} + +message UpdateNamenodeRegistrationRequestProto { + optional string nameserviceId = 1; + optional string namenodeId = 2; + optional string state = 3; +} + +message UpdateNamenodeRegistrationResponseProto { + optional bool status = 1; +} + +message NamenodeHeartbeatRequestProto { + optional NamenodeMembershipRecordProto namenodeMembership = 1; +} + +message NamenodeHeartbeatResponseProto { + optional bool status = 1; +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/98d26835/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml index 7041b1e..cd5b549 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml @@ -4745,7 +4745,7 @@ dfs.federation.router.namenode.resolver.client.class - org.apache.hadoop.hdfs.server.federation.MockResolver + org.apache.hadoop.hdfs.server.federation.resolver.MembershipNamenodeResolver Class to resolve the namenode for a subcluster. @@ -4775,4 +4775,20 @@ + + dfs.federation.router.cache.ttl + 60000 + + How often to refresh the State Store caches in milliseconds. + + + + + dfs.federation.router.store.membership.expiration + 300000 + + Expiration time in milliseconds for a membership record. + + + --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org For additional commands, e-mail: common-commits-help@hadoop.apache.org