public void checkSelf() { mappedFileQueue.checkSelf(); if (isExtReadEnable()) { this.consumeQueueExt.checkSelf(); } }
public void destroy() { this.maxPhysicOffset = -1; this.minLogicOffset = 0; this.mappedFileQueue.destroy(); if (isExtReadEnable()) { this.consumeQueueExt.destroy(); } }
/** * 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); }
fullFillToEnd(mappedFile, wrotePosition); log.info("No enough space(need:{}, has:{}) of file {}, so fill to end", size, blankSize, mappedFile.getFileName()); return decorate(wrotePosition + mappedFile.getFileFromOffset());
public ConsumeQueueExt.CqExtUnit getExt(final long offset) { if (isExtReadEnable()) { return this.consumeQueueExt.get(offset); } return null; }
/** * 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; }
public boolean flush(final int flushLeastPages) { boolean result = this.mappedFileQueue.flush(flushLeastPages); if (isExtReadEnable()) { result = result & this.consumeQueueExt.flush(flushLeastPages); } return result; }
public boolean load() { boolean result = this.mappedFileQueue.load(); log.info("load consume queue " + this.topic + "-" + this.queueId + " " + (result ? "OK" : "Failed")); if (isExtReadEnable()) { result &= this.consumeQueueExt.load(); } return result; }
public ConsumeQueue( final String topic, final int queueId, final String storePath, final int mappedFileSize, final DefaultMessageStore defaultMessageStore) { this.storePath = storePath; this.mappedFileSize = mappedFileSize; this.defaultMessageStore = defaultMessageStore; this.topic = topic; this.queueId = queueId; String queueDir = this.storePath + File.separator + topic + File.separator + queueId; this.mappedFileQueue = new MappedFileQueue(queueDir, mappedFileSize, null); this.byteBufferIndex = ByteBuffer.allocate(CQ_STORE_UNIT_SIZE); if (defaultMessageStore.getMessageStoreConfig().isEnableConsumeQueueExt()) { this.consumeQueueExt = new ConsumeQueueExt( topic, queueId, StorePathConfigHelper.getStorePathConsumeQueueExt(defaultMessageStore.getMessageStoreConfig().getStorePathRootDir()), defaultMessageStore.getMessageStoreConfig().getMappedFileSizeConsumeQueueExt(), defaultMessageStore.getMessageStoreConfig().getBitMapLengthConsumeQueueExt() ); } }
cqExtUnit.setTagsCode(request.getTagsCode()); long extAddr = this.consumeQueueExt.put(cqExtUnit); if (isExtAddr(extAddr)) { tagsCode = extAddr;
/** * 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; }
fullFillToEnd(mappedFile, wrotePosition); log.info("No enough space(need:{}, has:{}) of file {}, so fill to end", size, blankSize, mappedFile.getFileName()); return decorate(wrotePosition + mappedFile.getFileFromOffset());
public boolean getExt(final long offset, ConsumeQueueExt.CqExtUnit cqExtUnit) { if (isExtReadEnable()) { return this.consumeQueueExt.get(offset, cqExtUnit); } return false; }
/** * Check {@code tagsCode} is address of extend file or tags code. */ public boolean isExtAddr(long tagsCode) { return ConsumeQueueExt.isExtAddr(tagsCode); } }
public boolean flush(final int flushLeastPages) { boolean result = this.mappedFileQueue.flush(flushLeastPages); if (isExtReadEnable()) { result = result & this.consumeQueueExt.flush(flushLeastPages); } return result; }
public boolean load() { boolean result = this.mappedFileQueue.load(); log.info("load consume queue " + this.topic + "-" + this.queueId + " " + (result ? "OK" : "Failed")); if (isExtReadEnable()) { result &= this.consumeQueueExt.load(); } return result; }
public ConsumeQueue( final String topic, final int queueId, final String storePath, final int mappedFileSize, final DefaultMessageStore defaultMessageStore) { this.storePath = storePath; this.mappedFileSize = mappedFileSize; this.defaultMessageStore = defaultMessageStore; this.topic = topic; this.queueId = queueId; String queueDir = this.storePath + File.separator + topic + File.separator + queueId; this.mappedFileQueue = new MappedFileQueue(queueDir, mappedFileSize, null); this.byteBufferIndex = ByteBuffer.allocate(CQ_STORE_UNIT_SIZE); if (defaultMessageStore.getMessageStoreConfig().isEnableConsumeQueueExt()) { this.consumeQueueExt = new ConsumeQueueExt( topic, queueId, StorePathConfigHelper.getStorePathConsumeQueueExt(defaultMessageStore.getMessageStoreConfig().getStorePathRootDir()), defaultMessageStore.getMessageStoreConfig().getMappedFileSizeConsumeQueueExt(), defaultMessageStore.getMessageStoreConfig().getBitMapLengthConsumeQueueExt() ); } }