| /** |
| * 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.yarn.server.timelineservice.storage.common; |
| |
| import org.apache.hadoop.hbase.util.Bytes; |
| import org.apache.hadoop.yarn.api.records.ApplicationId; |
| |
| /** |
| * Encodes and decodes {@link ApplicationId} for row keys. |
| * App ID is stored in row key as 12 bytes, cluster timestamp section of app id |
| * (long - 8 bytes) followed by sequence id section of app id (int - 4 bytes). |
| */ |
| public final class AppIdKeyConverter implements KeyConverter<String> { |
| |
| public AppIdKeyConverter() { |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * Converts/encodes a string app Id into a byte representation for (row) keys. |
| * For conversion, we extract cluster timestamp and sequence id from the |
| * string app id (calls ConverterUtils#toApplicationId(String) for |
| * conversion) and then store it in a byte array of length 12 (8 bytes (long) |
| * for cluster timestamp followed 4 bytes(int) for sequence id). Both cluster |
| * timestamp and sequence id are inverted so that the most recent cluster |
| * timestamp and highest sequence id appears first in the table (i.e. |
| * application id appears in a descending order). |
| * |
| * @see |
| * org.apache.hadoop.yarn.server.timelineservice.storage.common.KeyConverter |
| * #encode(java.lang.Object) |
| */ |
| @Override |
| public byte[] encode(String appIdStr) { |
| ApplicationId appId = ApplicationId.fromString(appIdStr); |
| byte[] appIdBytes = new byte[getKeySize()]; |
| byte[] clusterTs = Bytes.toBytes( |
| LongConverter.invertLong(appId.getClusterTimestamp())); |
| System.arraycopy(clusterTs, 0, appIdBytes, 0, Bytes.SIZEOF_LONG); |
| byte[] seqId = Bytes.toBytes(TimelineStorageUtils.invertInt(appId.getId())); |
| System.arraycopy(seqId, 0, appIdBytes, Bytes.SIZEOF_LONG, Bytes.SIZEOF_INT); |
| return appIdBytes; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * Converts/decodes a 12 byte representation of app id for (row) keys to an |
| * app id in string format which can be returned back to client. |
| * For decoding, 12 bytes are interpreted as 8 bytes of inverted cluster |
| * timestamp(long) followed by 4 bytes of inverted sequence id(int). Calls |
| * ApplicationId#toString to generate string representation of app id. |
| * |
| * @see |
| * org.apache.hadoop.yarn.server.timelineservice.storage.common.KeyConverter |
| * #decode(byte[]) |
| */ |
| @Override |
| public String decode(byte[] appIdBytes) { |
| if (appIdBytes.length != getKeySize()) { |
| throw new IllegalArgumentException("Invalid app id in byte format"); |
| } |
| long clusterTs = LongConverter.invertLong( |
| Bytes.toLong(appIdBytes, 0, Bytes.SIZEOF_LONG)); |
| int seqId = TimelineStorageUtils.invertInt( |
| Bytes.toInt(appIdBytes, Bytes.SIZEOF_LONG, Bytes.SIZEOF_INT)); |
| return ApplicationId.newInstance(clusterTs, seqId).toString(); |
| } |
| |
| /** |
| * Returns the size of app id after encoding. |
| * |
| * @return size of app id after encoding. |
| */ |
| public static int getKeySize() { |
| return Bytes.SIZEOF_LONG + Bytes.SIZEOF_INT; |
| } |
| } |