blob: 966361857f594074a8e41b262b1c4a48870dcbdf [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.iotdb.db.storageengine.dataregion.wal.buffer;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertTabletNode;
import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALMode;
import java.util.Objects;
/** This entry class stores info for persistence. */
public class WALInfoEntry extends WALEntry {
private static final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
// wal entry type 1 byte, memTable id 8 bytes
public static final int FIXED_SERIALIZED_SIZE = Byte.BYTES + Long.BYTES;
// extra info for InsertTablet type value
private TabletInfo tabletInfo;
public WALInfoEntry(long memTableId, WALEntryValue value, boolean wait) {
super(memTableId, value, wait);
}
public WALInfoEntry(long memTableId, WALEntryValue value) {
this(memTableId, value, config.getWalMode() == WALMode.SYNC);
if (value instanceof InsertTabletNode) {
tabletInfo = new TabletInfo(0, ((InsertTabletNode) value).getRowCount());
}
}
public WALInfoEntry(long memTableId, InsertTabletNode value, int tabletStart, int tabletEnd) {
this(memTableId, value, config.getWalMode() == WALMode.SYNC);
tabletInfo = new TabletInfo(tabletStart, tabletEnd);
}
WALInfoEntry(WALEntryType type, long memTableId, WALEntryValue value) {
super(type, memTableId, value, false);
if (value instanceof InsertTabletNode) {
tabletInfo = new TabletInfo(0, ((InsertTabletNode) value).getRowCount());
}
}
@Override
public int serializedSize() {
return FIXED_SERIALIZED_SIZE + (value == null ? 0 : value.serializedSize());
}
@Override
public void serialize(IWALByteBufferView buffer) {
buffer.put(type.getCode());
buffer.putLong(memTableId);
switch (type) {
case INSERT_TABLET_NODE:
((InsertTabletNode) value)
.serializeToWAL(buffer, tabletInfo.tabletStart, tabletInfo.tabletEnd);
break;
case INSERT_ROW_NODE:
case INSERT_ROWS_NODE:
case DELETE_DATA_NODE:
case MEMORY_TABLE_SNAPSHOT:
value.serializeToWAL(buffer);
break;
case MEMORY_TABLE_CHECKPOINT:
throw new RuntimeException("Cannot serialize checkpoint to wal files.");
default:
throw new RuntimeException("Unsupported wal entry type " + type);
}
}
private static class TabletInfo {
// start row of insert tablet
private final int tabletStart;
// end row of insert tablet
private final int tabletEnd;
public TabletInfo(int tabletStart, int tabletEnd) {
this.tabletStart = tabletStart;
this.tabletEnd = tabletEnd;
}
@Override
public int hashCode() {
return Objects.hash(tabletStart, tabletEnd);
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof TabletInfo)) {
return false;
}
TabletInfo other = (TabletInfo) obj;
return this.tabletStart == other.tabletStart && this.tabletEnd == other.tabletEnd;
}
}
@Override
public boolean isSignal() {
return false;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), tabletInfo);
}
@Override
public boolean equals(Object obj) {
if (!super.equals(obj)) {
return false;
}
WALInfoEntry other = (WALInfoEntry) obj;
return Objects.equals(this.tabletInfo, other.tabletInfo);
}
}