DatanodeProtocol.proto 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. /**
  19. * These .proto interfaces are private and stable.
  20. * Please see http://wiki.apache.org/hadoop/Compatibility
  21. * for what changes are allowed for a *stable* .proto interface.
  22. */
  23. // This file contains protocol buffers that are used throughout HDFS -- i.e.
  24. // by the client, server, and data transfer protocols.
  25. option java_package = "org.apache.hadoop.hdfs.protocol.proto";
  26. option java_outer_classname = "DatanodeProtocolProtos";
  27. option java_generic_services = true;
  28. option java_generate_equals_and_hash = true;
  29. package hadoop.hdfs.datanode;
  30. import "hdfs.proto";
  31. /**
  32. * Information to identify a datanode to a namenode
  33. */
  34. message DatanodeRegistrationProto {
  35. required DatanodeIDProto datanodeID = 1; // Datanode information
  36. required StorageInfoProto storageInfo = 2; // Node information
  37. required ExportedBlockKeysProto keys = 3; // Block keys
  38. required string softwareVersion = 4; // Software version of the DN, e.g. "2.0.0"
  39. }
  40. /**
  41. * Represents a storage available on the datanode
  42. */
  43. message DatanodeStorageProto {
  44. enum StorageState {
  45. NORMAL = 0;
  46. READ_ONLY_SHARED = 1;
  47. }
  48. required string storageUuid = 1;
  49. optional StorageState state = 2 [default = NORMAL];
  50. optional StorageTypeProto storageType = 3 [default = DISK];
  51. }
  52. /**
  53. * Commands sent from namenode to the datanodes
  54. */
  55. message DatanodeCommandProto {
  56. enum Type {
  57. BalancerBandwidthCommand = 0;
  58. BlockCommand = 1;
  59. BlockRecoveryCommand = 2;
  60. FinalizeCommand = 3;
  61. KeyUpdateCommand = 4;
  62. RegisterCommand = 5;
  63. UnusedUpgradeCommand = 6;
  64. NullDatanodeCommand = 7;
  65. BlockIdCommand = 8;
  66. }
  67. required Type cmdType = 1; // Type of the command
  68. // One of the following command is available when the corresponding
  69. // cmdType is set
  70. optional BalancerBandwidthCommandProto balancerCmd = 2;
  71. optional BlockCommandProto blkCmd = 3;
  72. optional BlockRecoveryCommandProto recoveryCmd = 4;
  73. optional FinalizeCommandProto finalizeCmd = 5;
  74. optional KeyUpdateCommandProto keyUpdateCmd = 6;
  75. optional RegisterCommandProto registerCmd = 7;
  76. optional BlockIdCommandProto blkIdCmd = 8;
  77. }
  78. /**
  79. * Command sent from namenode to datanode to set the
  80. * maximum bandwidth to be used for balancing.
  81. */
  82. message BalancerBandwidthCommandProto {
  83. // Maximum bandwidth to be used by datanode for balancing
  84. required uint64 bandwidth = 1;
  85. }
  86. /**
  87. * Command to instruct datanodes to perform certain action
  88. * on the given set of blocks.
  89. */
  90. message BlockCommandProto {
  91. enum Action {
  92. TRANSFER = 1; // Transfer blocks to another datanode
  93. INVALIDATE = 2; // Invalidate blocks
  94. SHUTDOWN = 3; // Shutdown the datanode
  95. }
  96. required Action action = 1;
  97. required string blockPoolId = 2;
  98. repeated BlockProto blocks = 3;
  99. repeated DatanodeInfosProto targets = 4;
  100. repeated StorageUuidsProto targetStorageUuids = 5;
  101. }
  102. /**
  103. * Command to instruct datanodes to perform certain action
  104. * on the given set of block IDs.
  105. */
  106. message BlockIdCommandProto {
  107. enum Action {
  108. CACHE = 1;
  109. UNCACHE = 2;
  110. }
  111. required Action action = 1;
  112. required string blockPoolId = 2;
  113. repeated uint64 blockIds = 3 [packed=true];
  114. }
  115. /**
  116. * List of blocks to be recovered by the datanode
  117. */
  118. message BlockRecoveryCommandProto {
  119. repeated RecoveringBlockProto blocks = 1;
  120. }
  121. /**
  122. * Finalize the upgrade at the datanode
  123. */
  124. message FinalizeCommandProto {
  125. required string blockPoolId = 1; // Block pool to be finalized
  126. }
  127. /**
  128. * Update the block keys at the datanode
  129. */
  130. message KeyUpdateCommandProto {
  131. required ExportedBlockKeysProto keys = 1;
  132. }
  133. /**
  134. * Instruct datanode to register with the namenode
  135. */
  136. message RegisterCommandProto {
  137. // void
  138. }
  139. /**
  140. * registration - Information of the datanode registering with the namenode
  141. */
  142. message RegisterDatanodeRequestProto {
  143. required DatanodeRegistrationProto registration = 1; // Datanode info
  144. }
  145. /**
  146. * registration - Update registration of the datanode that successfully
  147. * registered. StorageInfo will be updated to include new
  148. * storage ID if the datanode did not have one in the request.
  149. */
  150. message RegisterDatanodeResponseProto {
  151. required DatanodeRegistrationProto registration = 1; // Datanode info
  152. }
  153. /**
  154. * registration - datanode registration information
  155. * capacity - total storage capacity available at the datanode
  156. * dfsUsed - storage used by HDFS
  157. * remaining - remaining storage available for HDFS
  158. * blockPoolUsed - storage used by the block pool
  159. * xmitsInProgress - number of transfers from this datanode to others
  160. * xceiverCount - number of active transceiver threads
  161. * failedVolumes - number of failed volumes
  162. * cacheCapacity - total cache capacity available at the datanode
  163. * cacheUsed - amount of cache used
  164. */
  165. message HeartbeatRequestProto {
  166. required DatanodeRegistrationProto registration = 1; // Datanode info
  167. repeated StorageReportProto reports = 2;
  168. optional uint32 xmitsInProgress = 3 [ default = 0 ];
  169. optional uint32 xceiverCount = 4 [ default = 0 ];
  170. optional uint32 failedVolumes = 5 [ default = 0 ];
  171. optional uint64 cacheCapacity = 6 [ default = 0 ];
  172. optional uint64 cacheUsed = 7 [default = 0 ];
  173. }
  174. message StorageReportProto {
  175. required string storageUuid = 1 [ deprecated = true ];
  176. optional bool failed = 2 [ default = false ];
  177. optional uint64 capacity = 3 [ default = 0 ];
  178. optional uint64 dfsUsed = 4 [ default = 0 ];
  179. optional uint64 remaining = 5 [ default = 0 ];
  180. optional uint64 blockPoolUsed = 6 [ default = 0 ];
  181. optional DatanodeStorageProto storage = 7; // supersedes StorageUuid
  182. }
  183. /**
  184. * state - State the NN is in when returning response to the DN
  185. * txid - Highest transaction ID this NN has seen
  186. */
  187. message NNHAStatusHeartbeatProto {
  188. enum State {
  189. ACTIVE = 0;
  190. STANDBY = 1;
  191. }
  192. required State state = 1;
  193. required uint64 txid = 2;
  194. }
  195. /**
  196. * cmds - Commands from namenode to datanode.
  197. * haStatus - Status (from an HA perspective) of the NN sending this response
  198. */
  199. message HeartbeatResponseProto {
  200. repeated DatanodeCommandProto cmds = 1; // Returned commands can be null
  201. required NNHAStatusHeartbeatProto haStatus = 2;
  202. optional RollingUpgradeStatusProto rollingUpgradeStatus = 3;
  203. }
  204. /**
  205. * registration - datanode registration information
  206. * blockPoolID - block pool ID of the reported blocks
  207. * blocks - each block is represented as multiple longs in the array.
  208. * first long represents block ID
  209. * second long represents length
  210. * third long represents gen stamp
  211. * fourth long (if under construction) represents replica state
  212. */
  213. message BlockReportRequestProto {
  214. required DatanodeRegistrationProto registration = 1;
  215. required string blockPoolId = 2;
  216. repeated StorageBlockReportProto reports = 3;
  217. }
  218. /**
  219. * Report of blocks in a storage
  220. */
  221. message StorageBlockReportProto {
  222. required DatanodeStorageProto storage = 1; // Storage
  223. repeated uint64 blocks = 2 [packed=true];
  224. }
  225. /**
  226. * cmd - Command from namenode to the datanode
  227. */
  228. message BlockReportResponseProto {
  229. optional DatanodeCommandProto cmd = 1;
  230. }
  231. /**
  232. * registration - datanode registration information
  233. * blockPoolId - block pool ID of the reported blocks
  234. * blocks - representation of blocks as longs for efficiency reasons
  235. */
  236. message CacheReportRequestProto {
  237. required DatanodeRegistrationProto registration = 1;
  238. required string blockPoolId = 2;
  239. repeated uint64 blocks = 3 [packed=true];
  240. }
  241. message CacheReportResponseProto {
  242. optional DatanodeCommandProto cmd = 1;
  243. }
  244. /**
  245. * Data structure to send received or deleted block information
  246. * from datanode to namenode.
  247. */
  248. message ReceivedDeletedBlockInfoProto {
  249. enum BlockStatus {
  250. RECEIVING = 1; // block being created
  251. RECEIVED = 2; // block creation complete
  252. DELETED = 3;
  253. }
  254. required BlockProto block = 1;
  255. required BlockStatus status = 3;
  256. optional string deleteHint = 2;
  257. }
  258. /**
  259. * List of blocks received and deleted for a storage.
  260. */
  261. message StorageReceivedDeletedBlocksProto {
  262. required string storageUuid = 1 [ deprecated = true ];
  263. repeated ReceivedDeletedBlockInfoProto blocks = 2;
  264. optional DatanodeStorageProto storage = 3; // supersedes storageUuid.
  265. }
  266. /**
  267. * registration - datanode registration information
  268. * blockPoolID - block pool ID of the reported blocks
  269. * blocks - Received/deleted block list
  270. */
  271. message BlockReceivedAndDeletedRequestProto {
  272. required DatanodeRegistrationProto registration = 1;
  273. required string blockPoolId = 2;
  274. repeated StorageReceivedDeletedBlocksProto blocks = 3;
  275. }
  276. /**
  277. * void response
  278. */
  279. message BlockReceivedAndDeletedResponseProto {
  280. }
  281. /**
  282. * registartion - Datanode reporting the error
  283. * errorCode - error code indicating the error
  284. * msg - Free text description of the error
  285. */
  286. message ErrorReportRequestProto {
  287. enum ErrorCode {
  288. NOTIFY = 0; // Error report to be logged at the namenode
  289. DISK_ERROR = 1; // DN has disk errors but still has valid volumes
  290. INVALID_BLOCK = 2; // Command from namenode has invalid block ID
  291. FATAL_DISK_ERROR = 3; // No valid volumes left on datanode
  292. }
  293. required DatanodeRegistrationProto registartion = 1; // Registartion info
  294. required uint32 errorCode = 2; // Error code
  295. required string msg = 3; // Error message
  296. }
  297. /**
  298. * void response
  299. */
  300. message ErrorReportResponseProto {
  301. }
  302. /**
  303. * blocks - list of blocks that are reported as corrupt
  304. */
  305. message ReportBadBlocksRequestProto {
  306. repeated LocatedBlockProto blocks = 1;
  307. }
  308. /**
  309. * void response
  310. */
  311. message ReportBadBlocksResponseProto {
  312. }
  313. /**
  314. * Commit block synchronization request during lease recovery
  315. */
  316. message CommitBlockSynchronizationRequestProto {
  317. required ExtendedBlockProto block = 1;
  318. required uint64 newGenStamp = 2;
  319. required uint64 newLength = 3;
  320. required bool closeFile = 4;
  321. required bool deleteBlock = 5;
  322. repeated DatanodeIDProto newTaragets = 6;
  323. repeated string newTargetStorages = 7;
  324. }
  325. /**
  326. * void response
  327. */
  328. message CommitBlockSynchronizationResponseProto {
  329. }
  330. /**
  331. * Protocol used from datanode to the namenode
  332. * See the request and response for details of rpc call.
  333. */
  334. service DatanodeProtocolService {
  335. /**
  336. * Register a datanode at a namenode
  337. */
  338. rpc registerDatanode(RegisterDatanodeRequestProto)
  339. returns(RegisterDatanodeResponseProto);
  340. /**
  341. * Send heartbeat from datanode to namenode
  342. */
  343. rpc sendHeartbeat(HeartbeatRequestProto) returns(HeartbeatResponseProto);
  344. /**
  345. * Report blocks at a given datanode to the namenode
  346. */
  347. rpc blockReport(BlockReportRequestProto) returns(BlockReportResponseProto);
  348. /**
  349. * Report cached blocks at a datanode to the namenode
  350. */
  351. rpc cacheReport(CacheReportRequestProto) returns(CacheReportResponseProto);
  352. /**
  353. * Incremental block report from the DN. This contains info about recently
  354. * received and deleted blocks, as well as when blocks start being
  355. * received.
  356. */
  357. rpc blockReceivedAndDeleted(BlockReceivedAndDeletedRequestProto)
  358. returns(BlockReceivedAndDeletedResponseProto);
  359. /**
  360. * Report from a datanode of an error to the active namenode.
  361. * Used for debugging.
  362. */
  363. rpc errorReport(ErrorReportRequestProto) returns(ErrorReportResponseProto);
  364. /**
  365. * Request the version
  366. */
  367. rpc versionRequest(VersionRequestProto) returns(VersionResponseProto);
  368. /**
  369. * Report corrupt blocks at the specified location
  370. */
  371. rpc reportBadBlocks(ReportBadBlocksRequestProto) returns(ReportBadBlocksResponseProto);
  372. /**
  373. * Commit block synchronization during lease recovery.
  374. */
  375. rpc commitBlockSynchronization(CommitBlockSynchronizationRequestProto)
  376. returns(CommitBlockSynchronizationResponseProto);
  377. }