@Override public ByteBuffer newBuffer(final int size, final int limit) { return factory.newBuffer(limit); }
@Override public ByteBuffer newBuffer(final int size, final int limit) { return factory.newBuffer(limit); }
private static ByteBuffer allocateAlignedBlock(int blockSize, SequentialFileFactory factory) { final ByteBuffer bufferBlock = factory.newBuffer(blockSize); final byte[] block = new byte[bufferBlock.remaining()]; Arrays.fill(block, (byte) 't'); bufferBlock.put(block); bufferBlock.position(0); return bufferBlock; }
private static ByteBuffer allocateAlignedBlock(int blockSize, SequentialFileFactory factory) { final ByteBuffer bufferBlock = factory.newBuffer(blockSize); final byte[] block = new byte[bufferBlock.remaining()]; Arrays.fill(block, (byte) 't'); bufferBlock.put(block); bufferBlock.position(0); return bufferBlock; }
@Override protected ByteBuffer newBuffer(int size, int limit) { size = factory.calculateBlockSize(size); limit = factory.calculateBlockSize(limit); ByteBuffer buffer = factory.newBuffer(size); buffer.limit(limit); return buffer; }
protected ByteBuffer newBuffer(int size, int limit) { size = factory.calculateBlockSize(size); limit = factory.calculateBlockSize(limit); ByteBuffer buffer = factory.newBuffer(size); buffer.limit(limit); return buffer; }
protected ByteBuffer newBuffer(int size, int limit) { size = factory.calculateBlockSize(size); limit = factory.calculateBlockSize(limit); ByteBuffer buffer = factory.newBuffer(size); buffer.limit(limit); return buffer; }
@Override protected ByteBuffer newBuffer(int size, int limit) { size = factory.calculateBlockSize(size); limit = factory.calculateBlockSize(limit); ByteBuffer buffer = factory.newBuffer(size); buffer.limit(limit); return buffer; }
@Override public void write(final EncodingSupport bytes, final boolean sync, final IOCallback callback) { if (timedBuffer != null) { timedBuffer.addBytes(bytes, sync, callback); } else { final int encodedSize = bytes.getEncodeSize(); ByteBuffer buffer = factory.newBuffer(encodedSize); ActiveMQBuffer outBuffer = ActiveMQBuffers.wrappedBuffer(buffer); bytes.encode(outBuffer); buffer.clear(); buffer.limit(encodedSize); writeDirect(buffer, sync, callback); } }
@Override public void write(final EncodingSupport bytes, final boolean sync, final IOCallback callback) { if (timedBuffer != null) { timedBuffer.addBytes(bytes, sync, callback); } else { final int encodedSize = bytes.getEncodeSize(); ByteBuffer buffer = factory.newBuffer(encodedSize); ActiveMQBuffer outBuffer = ActiveMQBuffers.wrappedBuffer(buffer); bytes.encode(outBuffer); buffer.clear(); buffer.limit(encodedSize); writeDirect(buffer, sync, callback); } }
/** * @param file * @return * @throws Exception */ private JournalFileImpl readFileHeader(final SequentialFile file) throws Exception { ByteBuffer bb = fileFactory.newBuffer(JournalImpl.SIZE_HEADER); file.read(bb); int journalVersion = bb.getInt(); if (journalVersion != JournalImpl.FORMAT_VERSION) { boolean isCompatible = false; for (int v : JournalImpl.COMPATIBLE_VERSIONS) { if (v == journalVersion) { isCompatible = true; } } if (!isCompatible) { throw ActiveMQJournalBundle.BUNDLE.journalFileMisMatch(); } } int readUserVersion = bb.getInt(); if (readUserVersion != userVersion) { throw ActiveMQJournalBundle.BUNDLE.journalDifferentVersion(); } long fileID = bb.getLong(); fileFactory.releaseBuffer(bb); bb = null; return new JournalFileImpl(file, fileID, journalVersion); }
private void readFromSequentialFile(StorageManager storage, List<PagedMessage> messages) throws Exception { final int fileSize = (int) file.size(); //doesn't need to be a direct buffer: that case is covered using the MMAP read final ByteBuffer buffer = this.fileFactory.newBuffer(fileSize); try { file.position(0); file.read(buffer); buffer.rewind(); assert (buffer.limit() == fileSize) : "buffer doesn't contains the whole file"; ChannelBufferWrapper activeMQBuffer = wrapBuffer(fileSize, buffer); read(storage, activeMQBuffer, messages); } finally { this.fileFactory.releaseBuffer(buffer); } }
/** * @param fileID * @param sequentialFile * @throws Exception */ public static int initFileHeader(final SequentialFileFactory fileFactory, final SequentialFile sequentialFile, final int userVersion, final long fileID) throws Exception { // We don't need to release buffers while writing. ByteBuffer bb = fileFactory.newBuffer(JournalImpl.SIZE_HEADER); ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(bb); try { JournalImpl.writeHeader(buffer, userVersion, fileID); bb.rewind(); int bufferSize = bb.limit(); sequentialFile.position(0); sequentialFile.writeDirect(bb, true); return bufferSize; } finally { // release it by first unwrap the unreleasable buffer and then release it. buffer.byteBuf().unwrap().release(); } }
@Override public void write(final ActiveMQBuffer bytes, final boolean sync, final IOCallback callback) throws IOException { if (timedBuffer != null) { bytes.setIndex(0, bytes.capacity()); timedBuffer.addBytes(bytes, sync, callback); } else { final int readableBytes = bytes.readableBytes(); final ByteBuffer buffer = factory.newBuffer(readableBytes); //factory::newBuffer doesn't necessary return a buffer with limit == readableBytes!! buffer.limit(readableBytes); bytes.getBytes(bytes.readerIndex(), buffer); buffer.flip(); writeDirect(buffer, sync, callback); } }
/** * @param fileID * @param sequentialFile * @throws Exception */ public static int initFileHeader(final SequentialFileFactory fileFactory, final SequentialFile sequentialFile, final int userVersion, final long fileID) throws Exception { // We don't need to release buffers while writing. ByteBuffer bb = fileFactory.newBuffer(JournalImpl.SIZE_HEADER); ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(bb); try { JournalImpl.writeHeader(buffer, userVersion, fileID); bb.rewind(); int bufferSize = bb.limit(); sequentialFile.position(0); sequentialFile.writeDirect(bb, true); return bufferSize; } finally { // release it by first unwrap the unreleasable buffer and then release it. buffer.byteBuf().unwrap().release(); } }
@Override public void write(final ActiveMQBuffer bytes, final boolean sync, final IOCallback callback) throws IOException { if (timedBuffer != null) { bytes.setIndex(0, bytes.capacity()); timedBuffer.addBytes(bytes, sync, callback); } else { final int readableBytes = bytes.readableBytes(); final ByteBuffer buffer = factory.newBuffer(readableBytes); //factory::newBuffer doesn't necessary return a buffer with limit == readableBytes!! buffer.limit(readableBytes); bytes.getBytes(bytes.readerIndex(), buffer); buffer.flip(); writeDirect(buffer, sync, callback); } }
private void testBuffer(final SequentialFileFactory factory) { factory.start(); ByteBuffer buffer = factory.newBuffer(100); try { for (byte b = 0; b < 100; b++) { buffer.put(b); } buffer.rewind(); for (byte b = 0; b < 100; b++) { Assert.assertEquals(b, buffer.get()); } buffer.limit(10); factory.clearBuffer(buffer); buffer.limit(100); buffer.rewind(); for (byte b = 0; b < 100; b++) { if (b < 10) { Assert.assertEquals(0, buffer.get()); } else { Assert.assertEquals(b, buffer.get()); } } } finally { factory.releaseBuffer(buffer); factory.stop(); } }
public synchronized void write(final PagedMessage message) throws Exception { if (!file.isOpen()) { throw ActiveMQMessageBundle.BUNDLE.cannotWriteToClosedFile(file); } final int messageEncodedSize = message.getEncodeSize(); final int bufferSize = messageEncodedSize + Page.SIZE_RECORD; final ByteBuffer buffer = fileFactory.newBuffer(bufferSize); ChannelBufferWrapper activeMQBuffer = wrapBuffer(bufferSize, buffer); activeMQBuffer.clear(); activeMQBuffer.writeByte(Page.START_BYTE); activeMQBuffer.writeInt(messageEncodedSize); message.encode(activeMQBuffer); activeMQBuffer.writeByte(Page.END_BYTE); assert (activeMQBuffer.readableBytes() == bufferSize) : "messageEncodedSize is different from expected"; //buffer limit and position are the same assert (buffer.remaining() == bufferSize) : "buffer position or limit are changed"; file.writeDirect(buffer, false); if (pageCache != null) { pageCache.addLiveMessage(message); } //lighter than addAndGet when single writer numberOfMessages.lazySet(numberOfMessages.get() + 1); size.lazySet(size.get() + bufferSize); storageManager.pageWrite(message, pageId); }
@Test public void testBuffer() throws Exception { SequentialFile file = factory.createSequentialFile("filtetmp.log"); file.open(); ByteBuffer buff = factory.newBuffer(10); Assert.assertEquals(factory.getAlignment(), buff.limit()); file.close(); factory.releaseBuffer(buff); }
protected void checkFill(final SequentialFileFactory factory, final SequentialFile file, final int size) throws Exception { file.fill(size); file.close(); file.open(); file.position(0); ByteBuffer bb = factory.newBuffer(size); int bytesRead = file.read(bb); Assert.assertEquals(calculateRecordSize(size, factory.getAlignment()), bytesRead); for (int i = 0; i < size; i++) { // log.debug(" i is " + i); Assert.assertEquals(0, bb.get(i)); } }