| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.ignite.internal.processors.cache.persistence.tree.io; |
| |
| import java.nio.ByteBuffer; |
| import org.apache.ignite.IgniteCheckedException; |
| import org.apache.ignite.internal.pagemem.PageUtils; |
| import org.apache.ignite.internal.util.GridStringBuilder; |
| import org.jetbrains.annotations.NotNull; |
| |
| /** |
| * |
| */ |
| public class PageMetaIO extends PageIO { |
| /** */ |
| private static final int TREE_ROOT_OFF = PageIO.COMMON_HEADER_END + 8; |
| |
| /** */ |
| private static final int REUSE_LIST_ROOT_OFF = TREE_ROOT_OFF + 8; |
| |
| /** Last successful snapshot id offset. */ |
| private static final int LAST_SUCCESSFUL_SNAPSHOT_ID_OFF = REUSE_LIST_ROOT_OFF + 8; |
| |
| /** Last successful full snapshot id offset. */ |
| private static final int LAST_SUCCESSFUL_FULL_SNAPSHOT_ID_OFF = LAST_SUCCESSFUL_SNAPSHOT_ID_OFF + 8; |
| |
| /** Next snapshot id offset. */ |
| private static final int NEXT_SNAPSHOT_TAG_OFF = LAST_SUCCESSFUL_FULL_SNAPSHOT_ID_OFF + 8; |
| |
| /** Last successful full snapshot tag offset. */ |
| private static final int LAST_SUCCESSFUL_FULL_SNAPSHOT_TAG_OFF = NEXT_SNAPSHOT_TAG_OFF + 8; |
| |
| /** Last allocated pages count offset. */ |
| private static final int LAST_PAGE_COUNT_OFF = LAST_SUCCESSFUL_FULL_SNAPSHOT_TAG_OFF + 8; |
| |
| /** Candidate allocated page count offset. */ |
| private static final int CANDIDATE_PAGE_COUNT_OFF = LAST_PAGE_COUNT_OFF + 4; |
| |
| /** End of page meta. */ |
| static final int END_OF_PAGE_META = CANDIDATE_PAGE_COUNT_OFF + 4; |
| |
| /** */ |
| public static final IOVersions<PageMetaIO> VERSIONS = new IOVersions<>( |
| new PageMetaIO(1) |
| ); |
| |
| /** |
| * @param ver Page format version. |
| */ |
| public PageMetaIO(int ver) { |
| super(PageIO.T_META, ver); |
| } |
| |
| /** |
| * @param type Type. |
| * @param ver Version. |
| */ |
| protected PageMetaIO(int type, int ver) { |
| super(type, ver); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override public void initNewPage(long pageAddr, long pageId, int pageSize) { |
| super.initNewPage(pageAddr, pageId, pageSize); |
| |
| setTreeRoot(pageAddr, 0); |
| setReuseListRoot(pageAddr, 0); |
| setLastSuccessfulFullSnapshotId(pageAddr, 0); |
| setLastSuccessfulSnapshotId(pageAddr, 0); |
| setNextSnapshotTag(pageAddr, 1); |
| setLastSuccessfulSnapshotTag(pageAddr, 0); |
| setLastAllocatedPageCount(pageAddr, 0); |
| setCandidatePageCount(pageAddr, 0); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| * @return Tree root page. |
| */ |
| public long getTreeRoot(long pageAddr) { |
| return PageUtils.getLong(pageAddr, TREE_ROOT_OFF); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| * @param treeRoot Tree root |
| */ |
| public void setTreeRoot(long pageAddr, long treeRoot) { |
| PageUtils.putLong(pageAddr, TREE_ROOT_OFF, treeRoot); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| * @return Reuse list root page. |
| */ |
| public long getReuseListRoot(long pageAddr) { |
| return PageUtils.getLong(pageAddr, REUSE_LIST_ROOT_OFF); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| * @param pageId Root page ID. |
| */ |
| public void setReuseListRoot(long pageAddr, long pageId) { |
| PageUtils.putLong(pageAddr, REUSE_LIST_ROOT_OFF, pageId); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| * @param lastSuccessfulSnapshotId Last successful snapshot id. |
| */ |
| public void setLastSuccessfulSnapshotId(long pageAddr, long lastSuccessfulSnapshotId) { |
| PageUtils.putLong(pageAddr, LAST_SUCCESSFUL_SNAPSHOT_ID_OFF, lastSuccessfulSnapshotId); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| */ |
| public long getLastSuccessfulSnapshotId(long pageAddr) { |
| return PageUtils.getLong(pageAddr, LAST_SUCCESSFUL_SNAPSHOT_ID_OFF); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| * @param lastSuccessfulFullSnapshotId Last successful full snapshot id. |
| */ |
| public void setLastSuccessfulFullSnapshotId(long pageAddr, long lastSuccessfulFullSnapshotId) { |
| PageUtils.putLong(pageAddr, LAST_SUCCESSFUL_FULL_SNAPSHOT_ID_OFF, lastSuccessfulFullSnapshotId); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| */ |
| public long getLastSuccessfulFullSnapshotId(long pageAddr) { |
| return PageUtils.getLong(pageAddr, LAST_SUCCESSFUL_FULL_SNAPSHOT_ID_OFF); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| * @param nextSnapshotTag Next snapshot tag. |
| */ |
| public void setNextSnapshotTag(long pageAddr, long nextSnapshotTag) { |
| PageUtils.putLong(pageAddr, NEXT_SNAPSHOT_TAG_OFF, nextSnapshotTag); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| */ |
| public long getLastSuccessfulSnapshotTag(long pageAddr) { |
| return PageUtils.getLong(pageAddr, LAST_SUCCESSFUL_FULL_SNAPSHOT_TAG_OFF); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| * @param lastSuccessfulSnapshotTag Last successful snapshot tag. |
| */ |
| public void setLastSuccessfulSnapshotTag(long pageAddr, long lastSuccessfulSnapshotTag) { |
| PageUtils.putLong(pageAddr, LAST_SUCCESSFUL_FULL_SNAPSHOT_TAG_OFF, lastSuccessfulSnapshotTag); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| */ |
| public long getNextSnapshotTag(long pageAddr) { |
| return PageUtils.getLong(pageAddr, NEXT_SNAPSHOT_TAG_OFF); |
| } |
| |
| /** |
| * Sets last allocated pages count, used to save and observe previous allocated count |
| * |
| * @param pageAddr Meta Page address. |
| * @param pageCnt Last allocated pages count to set |
| */ |
| public void setLastAllocatedPageCount(final long pageAddr, final int pageCnt) { |
| PageUtils.putInt(pageAddr, LAST_PAGE_COUNT_OFF, pageCnt); |
| } |
| |
| /** |
| * Gets last allocated pages count from given buffer |
| * |
| * @param buf Buffer to read data from. |
| */ |
| public int getLastAllocatedPageCount(@NotNull final ByteBuffer buf) { |
| return buf.getInt(LAST_PAGE_COUNT_OFF); |
| } |
| |
| /** |
| * Gets last allocated pages count by provided address |
| * |
| * @param pageAddr Meta page address. |
| * @return Last allocated page count |
| */ |
| public int getLastAllocatedPageCount(final long pageAddr) { |
| return PageUtils.getInt(pageAddr, LAST_PAGE_COUNT_OFF); |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| * @param pageCnt Last page count. |
| */ |
| public boolean setCandidatePageCount(long pageAddr, int pageCnt) { |
| if (getCandidatePageCount(pageAddr) == pageCnt) |
| return false; |
| |
| PageUtils.putInt(pageAddr, CANDIDATE_PAGE_COUNT_OFF, pageCnt); |
| |
| return true; |
| } |
| |
| /** |
| * @param pageAddr Page address. |
| */ |
| public int getCandidatePageCount(long pageAddr) { |
| return PageUtils.getInt(pageAddr, CANDIDATE_PAGE_COUNT_OFF); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override protected void printPage(long addr, int pageSize, GridStringBuilder sb) throws IgniteCheckedException { |
| sb.a("PageMeta[\n\ttreeRoot=").a(getReuseListRoot(addr)) |
| .a(",\n\tlastSuccessfulFullSnapshotId=").a(getLastSuccessfulFullSnapshotId(addr)) |
| .a(",\n\tlastSuccessfulSnapshotId=").a(getLastSuccessfulSnapshotId(addr)) |
| .a(",\n\tnextSnapshotTag=").a(getNextSnapshotTag(addr)) |
| .a(",\n\tlastSuccessfulSnapshotTag=").a(getLastSuccessfulSnapshotTag(addr)) |
| .a(",\n\tlastAllocatedPageCount=").a(getLastAllocatedPageCount(addr)) |
| .a(",\n\tcandidatePageCount=").a(getCandidatePageCount(addr)) |
| .a("\n]"); |
| } |
| } |