1/*2 * Licensed to the Apache Software Foundation (ASF) under one3 * or more contributor license agreements. See the NOTICE file4 * distributed with this work for additional information5 * regarding copyright ownership. The ASF licenses this file6 * to you under the Apache License, Version 2.0 (the7 * "License"); you may not use this file except in compliance8 * with the License. You may obtain a copy of the License at9 *10 * http://www.apache.org/licenses/LICENSE-2.011 *12 * Unless required by applicable law or agreed to in writing, software13 * 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 and16 * limitations under the License.17 */1819package org.apache.giraph.utils;
2021import org.apache.hadoop.io.Writable;
22import org.apache.hadoop.io.WritableComparable;
2324import java.io.IOException;
25import javax.annotation.concurrent.NotThreadSafe;
2627/**28 * Special iterator that reuses vertex ids and messages bytes so that the29 * lifetime of the object is only until next() is called.30 *31 * Vertex id ownership can be released if desired through32 * releaseCurrentVertexId(). This optimization allows us to cut down33 * on the number of objects instantiated and garbage collected. Messages34 * can only be copied to an ExtendedDataOutput object35 *36 * @param <I> vertexId type parameter37 * @param <M> message type parameter38 */39 @NotThreadSafe
40publicabstractclass ByteStructVertexIdMessageBytesIterator<I
41extends WritableComparable, M extends Writable>
42extends ByteStructVertexIdDataIterator<I, M>
43implements VertexIdMessageBytesIterator<I, M> {
44/** Last message offset */45protectedint messageOffset = -1;
46/** Number of bytes in the last message */47protectedint messageBytes = -1;
4849/**50 * Constructor with vertexIdData51 *52 * @param vertexIdData vertexIdData53 */54publicByteStructVertexIdMessageBytesIterator(
55 AbstractVertexIdData<I, M> vertexIdData) {
56super(vertexIdData);
57 }
5859/**60 * Moves to the next element in the iteration.61 */62 @Override
63publicvoid next() {
64if (vertexId == null) {
65 vertexId = vertexIdData.getConf().createVertexId();
66 }
6768try {
69 vertexId.readFields(extendedDataInput);
70 messageBytes = extendedDataInput.readInt();
71 messageOffset = extendedDataInput.getPos();
72if (extendedDataInput.skipBytes(messageBytes) != messageBytes) {
73thrownew IllegalStateException("next: Failed to skip " +
74 messageBytes);
75 }
76 } catch (IOException e) {
77thrownew IllegalStateException("next: IOException", e);
78 }
79 }
80 }