Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Licensed to the Apache Software Foundation (ASF) under one or more
0003  * contributor license agreements.  See the NOTICE file distributed with
0004  * this work for additional information regarding copyright ownership.
0005  * The ASF licenses this file to You under the Apache License, Version 2.0
0006  * (the "License"); you may not use this file except in compliance with
0007  * the License.  You may obtain a copy of the License at
0008  *
0009  *    http://www.apache.org/licenses/LICENSE-2.0
0010  *
0011  * Unless required by applicable law or agreed to in writing, software
0012  * distributed under the License is distributed on an "AS IS" BASIS,
0013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0014  * See the License for the specific language governing permissions and
0015  * limitations under the License.
0016  */
0017 
0018 package org.apache.spark.network.shuffle.protocol;
0019 
0020 import java.util.Arrays;
0021 import java.util.Objects;
0022 
0023 import io.netty.buffer.ByteBuf;
0024 import org.apache.commons.lang3.builder.ToStringBuilder;
0025 import org.apache.commons.lang3.builder.ToStringStyle;
0026 
0027 import org.apache.spark.network.protocol.Encoders;
0028 
0029 // Needed by ScalaDoc. See SPARK-7726
0030 import static org.apache.spark.network.shuffle.protocol.BlockTransferMessage.Type;
0031 
0032 
0033 /** Request to upload a block with a certain StorageLevel. Returns nothing (empty byte array). */
0034 public class UploadBlock extends BlockTransferMessage {
0035   public final String appId;
0036   public final String execId;
0037   public final String blockId;
0038   // TODO: StorageLevel is serialized separately in here because StorageLevel is not available in
0039   // this package. We should avoid this hack.
0040   public final byte[] metadata;
0041   public final byte[] blockData;
0042 
0043   /**
0044    * @param metadata Meta-information about block, typically StorageLevel.
0045    * @param blockData The actual block's bytes.
0046    */
0047   public UploadBlock(
0048       String appId,
0049       String execId,
0050       String blockId,
0051       byte[] metadata,
0052       byte[] blockData) {
0053     this.appId = appId;
0054     this.execId = execId;
0055     this.blockId = blockId;
0056     this.metadata = metadata;
0057     this.blockData = blockData;
0058   }
0059 
0060   @Override
0061   protected Type type() { return Type.UPLOAD_BLOCK; }
0062 
0063   @Override
0064   public int hashCode() {
0065     int objectsHashCode = Objects.hash(appId, execId, blockId);
0066     return (objectsHashCode * 41 + Arrays.hashCode(metadata)) * 41 + Arrays.hashCode(blockData);
0067   }
0068 
0069   @Override
0070   public String toString() {
0071     return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
0072       .append("appId", appId)
0073       .append("execId", execId)
0074       .append("blockId", blockId)
0075       .append("metadata size", metadata.length)
0076       .append("block size", blockData.length)
0077       .toString();
0078   }
0079 
0080   @Override
0081   public boolean equals(Object other) {
0082     if (other != null && other instanceof UploadBlock) {
0083       UploadBlock o = (UploadBlock) other;
0084       return Objects.equals(appId, o.appId)
0085         && Objects.equals(execId, o.execId)
0086         && Objects.equals(blockId, o.blockId)
0087         && Arrays.equals(metadata, o.metadata)
0088         && Arrays.equals(blockData, o.blockData);
0089     }
0090     return false;
0091   }
0092 
0093   @Override
0094   public int encodedLength() {
0095     return Encoders.Strings.encodedLength(appId)
0096       + Encoders.Strings.encodedLength(execId)
0097       + Encoders.Strings.encodedLength(blockId)
0098       + Encoders.ByteArrays.encodedLength(metadata)
0099       + Encoders.ByteArrays.encodedLength(blockData);
0100   }
0101 
0102   @Override
0103   public void encode(ByteBuf buf) {
0104     Encoders.Strings.encode(buf, appId);
0105     Encoders.Strings.encode(buf, execId);
0106     Encoders.Strings.encode(buf, blockId);
0107     Encoders.ByteArrays.encode(buf, metadata);
0108     Encoders.ByteArrays.encode(buf, blockData);
0109   }
0110 
0111   public static UploadBlock decode(ByteBuf buf) {
0112     String appId = Encoders.Strings.decode(buf);
0113     String execId = Encoders.Strings.decode(buf);
0114     String blockId = Encoders.Strings.decode(buf);
0115     byte[] metadata = Encoders.ByteArrays.decode(buf);
0116     byte[] blockData = Encoders.ByteArrays.decode(buf);
0117     return new UploadBlock(appId, execId, blockId, metadata, blockData);
0118   }
0119 }