blob: d676cfd3f680501bc0e51eeeb0654638bb9eb56a [file] [log] [blame]
/*
* 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]");
}
}