package ch.usi.da.paxos.lab; /* * Copyright (c) 2013 Università della Svizzera italiana (USI) * * This file is part of URingPaxos. * * URingPaxos is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * URingPaxos is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with URingPaxos. If not, see <http://www.gnu.org/licenses/>. */ import java.nio.ByteBuffer; import ch.usi.da.paxos.api.PaxosRole; import ch.usi.da.paxos.message.Message; import ch.usi.da.paxos.message.MessageType; import ch.usi.da.paxos.message.Value; import ch.usi.da.paxos.ring.NetworkManager; public class BufferTest { boolean preamble = true; int msize; public void test(){ ByteBuffer buffer = ByteBuffer.allocate(500); Value v = new Value("ID","Value".getBytes()); Message m = new Message(1, 2, PaxosRole.Acceptor, MessageType.Phase1, 0, 0, v); Message m2 = new Message(2, 3, PaxosRole.Learner, MessageType.Value, 0, 0, v); //System.err.println(Message.getCRC32(m)); //System.err.println(Message.getCRC32(Message.fromWire(Message.toWire(m)))); if(buffer.remaining() >= Message.length(m)+16){ buffer.putInt(NetworkManager.MAGIC_NUMBER); buffer.putInt(Message.length(m)); Message.toBuffer(buffer, m); buffer.putLong(Message.getCRC32(m)); } buffer.put(11,(byte) 0xff); buffer.putShort((short) 34); if(buffer.remaining() >= Message.length(m)+16){ buffer.putInt(NetworkManager.MAGIC_NUMBER); buffer.putInt(Message.length(m2)); Message.toBuffer(buffer, m2); buffer.putLong(Message.getCRC32(m2)); } buffer.flip(); readBuffer(buffer); /*byte[] b2 = Message.toWire(m2); buffer.put(b2,0,10); //buffer.put(b2,10,b2.length-10); buffer.flip(); readBuffer(buffer); System.out.println("3: " + buffer.position() + "," + buffer.limit() + "," + buffer.capacity()); buffer.put(b2,10,b2.length-10); buffer.flip(); System.out.println("4: " + buffer.position() + "," + buffer.limit() + "," + buffer.capacity()); readBuffer(buffer); System.out.println("5: " + buffer.position() + "," + buffer.limit() + "," + buffer.capacity()); */ } public void readBuffer(ByteBuffer buffer){ outerloop: while(buffer.hasRemaining()){ if(preamble){ if(buffer.limit()-buffer.position() >= 8){ while(buffer.getInt() != NetworkManager.MAGIC_NUMBER){ buffer.position(buffer.position()-3); if(buffer.limit()-buffer.position() < 4){ break outerloop; } } msize = buffer.getInt(); preamble = false; }else{ break; } } if(!preamble){ //System.err.println(buffer.limit()-buffer.position()); if(buffer.limit()-buffer.position() >= msize){ Message m = null; try { m = Message.fromBuffer(buffer); System.out.print(m); } catch (Exception e) { System.out.print("null"); } long crc = buffer.getLong(); if(crc == Message.getCRC32(m)){ System.out.println(" CRC OK!"); }else{ System.out.println(" CRC FAIL!"); } preamble = true; }else{ break; } } //System.out.println("in: " + buffer.position() + "," + buffer.limit() + "," + buffer.capacity()); } buffer.compact(); } /** * @param args */ public static void main(String[] args) { BufferTest test = new BufferTest(); test.test(); } }