001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.hadoop.hdfs.server.protocol; 019 020 import java.io.DataInput; 021 import java.io.DataOutput; 022 import java.io.IOException; 023 024 import org.apache.hadoop.classification.InterfaceAudience; 025 import org.apache.hadoop.classification.InterfaceStability; 026 import org.apache.hadoop.io.Writable; 027 import org.apache.hadoop.io.WritableFactory; 028 import org.apache.hadoop.io.WritableFactories; 029 import org.apache.hadoop.io.WritableUtils; 030 import org.apache.avro.reflect.Union; 031 032 /** 033 * Base class for data-node command. 034 * Issued by the name-node to notify data-nodes what should be done. 035 */ 036 037 // Declare subclasses for Avro's denormalized representation 038 @Union({Void.class, 039 DatanodeCommand.Register.class, DatanodeCommand.Finalize.class, 040 BlockCommand.class, UpgradeCommand.class, 041 BlockRecoveryCommand.class, KeyUpdateCommand.class}) 042 043 @InterfaceAudience.Private 044 @InterfaceStability.Evolving 045 public abstract class DatanodeCommand extends ServerCommand { 046 static class Register extends DatanodeCommand { 047 private Register() {super(DatanodeProtocol.DNA_REGISTER);} 048 public void readFields(DataInput in) {} 049 public void write(DataOutput out) {} 050 } 051 052 public static class Finalize extends DatanodeCommand { 053 String blockPoolId; 054 private Finalize() { 055 super(DatanodeProtocol.DNA_FINALIZE); 056 } 057 058 public Finalize(String bpid) { 059 super(DatanodeProtocol.DNA_FINALIZE); 060 blockPoolId = bpid; 061 } 062 063 public String getBlockPoolId() { 064 return blockPoolId; 065 } 066 067 public void readFields(DataInput in) throws IOException { 068 blockPoolId = WritableUtils.readString(in); 069 } 070 public void write(DataOutput out) throws IOException { 071 WritableUtils.writeString(out, blockPoolId); 072 } 073 } 074 075 static { // register a ctor 076 WritableFactories.setFactory(Register.class, 077 new WritableFactory() { 078 public Writable newInstance() {return new Register();} 079 }); 080 WritableFactories.setFactory(Finalize.class, 081 new WritableFactory() { 082 public Writable newInstance() {return new Finalize();} 083 }); 084 } 085 086 public static final DatanodeCommand REGISTER = new Register(); 087 088 public DatanodeCommand() { 089 super(); 090 } 091 092 DatanodeCommand(int action) { 093 super(action); 094 } 095 }