/** * Check {@code tagsCode} is address of extend file or tags code. */ public boolean isExtAddr(long tagsCode) { return ConsumeQueueExt.isExtAddr(tagsCode); } }
/** * Transform {@code address}(decorated by {@link #decorate}) to offset in mapped file. * <p> * if {@code address} is less than 0, return {@code address} - {@link java.lang.Long#MIN_VALUE}; * else, just return {@code address} * </p> */ public long unDecorate(final long address) { if (isExtAddr(address)) { return address - Long.MIN_VALUE; } return address; }
/** * Decorate {@code offset} from mapped file, in order to distinguish with tagsCode(saved in cq originally). * <p> * if {@code offset} is greater than or equal to 0, then return {@code offset} + {@link java.lang.Long#MIN_VALUE}; * else, just return {@code offset} * </p> * * @return ext address(value is less than 0) */ public long decorate(final long offset) { if (!isExtAddr(offset)) { return offset + Long.MIN_VALUE; } return offset; }
/** * Delete files before {@code minAddress}. * * @param minAddress less than 0 */ public void truncateByMinAddress(final long minAddress) { if (!isExtAddr(minAddress)) { return; } log.info("Truncate consume queue ext by min {}.", minAddress); List<MappedFile> willRemoveFiles = new ArrayList<MappedFile>(); List<MappedFile> mappedFiles = this.mappedFileQueue.getMappedFiles(); final long realOffset = unDecorate(minAddress); for (MappedFile file : mappedFiles) { long fileTailOffset = file.getFileFromOffset() + this.mappedFileSize; if (fileTailOffset < realOffset) { log.info("Destroy consume queue ext by min: file={}, fileTailOffset={}, minOffset={}", file.getFileName(), fileTailOffset, realOffset); if (file.destroy(1000)) { willRemoveFiles.add(file); } } } this.mappedFileQueue.deleteExpiredFile(willRemoveFiles); }
/** * Delete files after {@code maxAddress}, and reset wrote/commit/flush position to last file. * * @param maxAddress less than 0 */ public void truncateByMaxAddress(final long maxAddress) { if (!isExtAddr(maxAddress)) { return; } log.info("Truncate consume queue ext by max {}.", maxAddress); CqExtUnit cqExtUnit = get(maxAddress); if (cqExtUnit == null) { log.error("[BUG] address {} of consume queue extend not found!", maxAddress); return; } final long realOffset = unDecorate(maxAddress); this.mappedFileQueue.truncateDirtyFiles(realOffset + cqExtUnit.getSize()); }
/** * Get data from buffer, and set to {@code cqExtUnit} * * @param address less than 0 */ public boolean get(final long address, final CqExtUnit cqExtUnit) { if (!isExtAddr(address)) { return false; } final int mappedFileSize = this.mappedFileSize; final long realOffset = unDecorate(address); MappedFile mappedFile = this.mappedFileQueue.findMappedFileByOffset(realOffset, realOffset == 0); if (mappedFile == null) { return false; } int pos = (int) (realOffset % mappedFileSize); SelectMappedBufferResult bufferResult = mappedFile.selectMappedBuffer(pos); if (bufferResult == null) { log.warn("[BUG] Consume queue extend unit({}) is not found!", realOffset); return false; } boolean ret = false; try { ret = cqExtUnit.read(bufferResult.getByteBuffer()); } finally { bufferResult.release(); } return ret; }
/** * Check {@code tagsCode} is address of extend file or tags code. */ public boolean isExtAddr(long tagsCode) { return ConsumeQueueExt.isExtAddr(tagsCode); } }
/** * Transform {@code address}(decorated by {@link #decorate}) to offset in mapped file. * <p> * if {@code address} is less than 0, return {@code address} - {@link java.lang.Long#MIN_VALUE}; * else, just return {@code address} * </p> */ public long unDecorate(final long address) { if (isExtAddr(address)) { return address - Long.MIN_VALUE; } return address; }
/** * Decorate {@code offset} from mapped file, in order to distinguish with tagsCode(saved in cq originally). * <p> * if {@code offset} is greater than or equal to 0, then return {@code offset} + {@link java.lang.Long#MIN_VALUE}; * else, just return {@code offset} * </p> * * @return ext address(value is less than 0) */ public long decorate(final long offset) { if (!isExtAddr(offset)) { return offset + Long.MIN_VALUE; } return offset; }
/** * Delete files after {@code maxAddress}, and reset wrote/commit/flush position to last file. * * @param maxAddress less than 0 */ public void truncateByMaxAddress(final long maxAddress) { if (!isExtAddr(maxAddress)) { return; } log.info("Truncate consume queue ext by max {}.", maxAddress); CqExtUnit cqExtUnit = get(maxAddress); if (cqExtUnit == null) { log.error("[BUG] address {} of consume queue extend not found!", maxAddress); return; } final long realOffset = unDecorate(maxAddress); this.mappedFileQueue.truncateDirtyFiles(realOffset + cqExtUnit.getSize()); }
/** * Delete files before {@code minAddress}. * * @param minAddress less than 0 */ public void truncateByMinAddress(final long minAddress) { if (!isExtAddr(minAddress)) { return; } log.info("Truncate consume queue ext by min {}.", minAddress); List<MappedFile> willRemoveFiles = new ArrayList<MappedFile>(); List<MappedFile> mappedFiles = this.mappedFileQueue.getMappedFiles(); final long realOffset = unDecorate(minAddress); for (MappedFile file : mappedFiles) { long fileTailOffset = file.getFileFromOffset() + this.mappedFileSize; if (fileTailOffset < realOffset) { log.info("Destroy consume queue ext by min: file={}, fileTailOffset={}, minOffset={}", file.getFileName(), fileTailOffset, realOffset); if (file.destroy(1000)) { willRemoveFiles.add(file); } } } this.mappedFileQueue.deleteExpiredFile(willRemoveFiles); }
/** * Get data from buffer, and set to {@code cqExtUnit} * * @param address less than 0 */ public boolean get(final long address, final CqExtUnit cqExtUnit) { if (!isExtAddr(address)) { return false; } final int mappedFileSize = this.mappedFileSize; final long realOffset = unDecorate(address); MappedFile mappedFile = this.mappedFileQueue.findMappedFileByOffset(realOffset, realOffset == 0); if (mappedFile == null) { return false; } int pos = (int) (realOffset % mappedFileSize); SelectMappedBufferResult bufferResult = mappedFile.selectMappedBuffer(pos); if (bufferResult == null) { log.warn("[BUG] Consume queue extend unit({}) is not found!", realOffset); return false; } boolean ret = false; try { ret = cqExtUnit.read(bufferResult.getByteBuffer()); } finally { bufferResult.release(); } return ret; }
/** * Check {@code tagsCode} is address of extend file or tags code. */ public boolean isExtAddr(long tagsCode) { return ConsumeQueueExt.isExtAddr(tagsCode); } }
/** * Transform {@code address}(decorated by {@link #decorate}) to offset in mapped file. * <p> * if {@code address} is less than 0, return {@code address} - {@link java.lang.Long#MIN_VALUE}; * else, just return {@code address} * </p> */ public long unDecorate(final long address) { if (isExtAddr(address)) { return address - Long.MIN_VALUE; } return address; }
/** * Decorate {@code offset} from mapped file, in order to distinguish with tagsCode(saved in cq originally). * <p> * if {@code offset} is greater than or equal to 0, then return {@code offset} + {@link java.lang.Long#MIN_VALUE}; * else, just return {@code offset} * </p> * * @return ext address(value is less than 0) */ public long decorate(final long offset) { if (!isExtAddr(offset)) { return offset + Long.MIN_VALUE; } return offset; }
/** * Delete files before {@code minAddress}. * * @param minAddress less than 0 */ public void truncateByMinAddress(final long minAddress) { if (!isExtAddr(minAddress)) { return; } log.info("Truncate consume queue ext by min {}.", minAddress); List<MappedFile> willRemoveFiles = new ArrayList<MappedFile>(); List<MappedFile> mappedFiles = this.mappedFileQueue.getMappedFiles(); final long realOffset = unDecorate(minAddress); for (MappedFile file : mappedFiles) { long fileTailOffset = file.getFileFromOffset() + this.mappedFileSize; if (fileTailOffset < realOffset) { log.info("Destroy consume queue ext by min: file={}, fileTailOffset={}, minOffset={}", file.getFileName(), fileTailOffset, realOffset); if (file.destroy(1000)) { willRemoveFiles.add(file); } } } this.mappedFileQueue.deleteExpiredFile(willRemoveFiles); }
/** * Delete files after {@code maxAddress}, and reset wrote/commit/flush position to last file. * * @param maxAddress less than 0 */ public void truncateByMaxAddress(final long maxAddress) { if (!isExtAddr(maxAddress)) { return; } log.info("Truncate consume queue ext by max {}.", maxAddress); CqExtUnit cqExtUnit = get(maxAddress); if (cqExtUnit == null) { log.error("[BUG] address {} of consume queue extend not found!", maxAddress); return; } final long realOffset = unDecorate(maxAddress); this.mappedFileQueue.truncateDirtyFiles(realOffset + cqExtUnit.getSize()); }
/** * Get data from buffer, and set to {@code cqExtUnit} * * @param address less than 0 */ public boolean get(final long address, final CqExtUnit cqExtUnit) { if (!isExtAddr(address)) { return false; } final int mappedFileSize = this.mappedFileSize; final long realOffset = unDecorate(address); MappedFile mappedFile = this.mappedFileQueue.findMappedFileByOffset(realOffset, realOffset == 0); if (mappedFile == null) { return false; } int pos = (int) (realOffset % mappedFileSize); SelectMappedBufferResult bufferResult = mappedFile.selectMappedBuffer(pos); if (bufferResult == null) { log.warn("[BUG] Consume queue extend unit({}) is not found!", realOffset); return false; } boolean ret = false; try { ret = cqExtUnit.read(bufferResult.getByteBuffer()); } finally { bufferResult.release(); } return ret; }