You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2021/11/19 08:14:59 UTC
[iotdb] branch master updated: [IOTDB-2027] Rollback invalid entry after wal writing failure (#4424)
This is an automated email from the ASF dual-hosted git repository.
haonan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 7ff968c [IOTDB-2027] Rollback invalid entry after wal writing failure (#4424)
7ff968c is described below
commit 7ff968cf43222f2dc5fe04524ce9753c55abeaa5
Author: Alan Choo <43...@users.noreply.github.com>
AuthorDate: Fri Nov 19 16:14:28 2021 +0800
[IOTDB-2027] Rollback invalid entry after wal writing failure (#4424)
---
.../org/apache/iotdb/db/mqtt/PublishHandler.java | 16 +++---
.../apache/iotdb/db/qp/physical/PhysicalPlan.java | 22 +++++++-
.../iotdb/db/qp/physical/crud/DeletePlan.java | 2 +-
.../db/qp/physical/crud/InsertMultiTabletPlan.java | 2 +-
.../iotdb/db/qp/physical/crud/InsertRowPlan.java | 2 +-
.../physical/crud/InsertRowsOfOneDevicePlan.java | 2 +-
.../iotdb/db/qp/physical/crud/InsertRowsPlan.java | 2 +-
.../db/qp/physical/crud/InsertTabletPlan.java | 2 +-
.../iotdb/db/qp/physical/crud/SelectIntoPlan.java | 2 +-
.../db/qp/physical/sys/ActivateTemplatePlan.java | 2 +-
.../db/qp/physical/sys/AppendTemplatePlan.java | 2 +-
.../iotdb/db/qp/physical/sys/AuthorPlan.java | 2 +-
.../qp/physical/sys/AutoCreateDeviceMNodePlan.java | 2 +-
.../iotdb/db/qp/physical/sys/ChangeAliasPlan.java | 2 +-
.../db/qp/physical/sys/ChangeTagOffsetPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/ClearCachePlan.java | 2 +-
.../physical/sys/CreateAlignedTimeSeriesPlan.java | 2 +-
.../qp/physical/sys/CreateContinuousQueryPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/CreateIndexPlan.java | 2 +-
.../qp/physical/sys/CreateMultiTimeSeriesPlan.java | 2 +-
.../db/qp/physical/sys/CreateSnapshotPlan.java | 2 +-
.../db/qp/physical/sys/CreateTemplatePlan.java | 2 +-
.../db/qp/physical/sys/CreateTimeSeriesPlan.java | 2 +-
.../db/qp/physical/sys/CreateTriggerPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/DataAuthPlan.java | 2 +-
.../db/qp/physical/sys/DeleteStorageGroupPlan.java | 2 +-
.../db/qp/physical/sys/DeleteTimeSeriesPlan.java | 2 +-
.../qp/physical/sys/DropContinuousQueryPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/DropIndexPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/DropTriggerPlan.java | 2 +-
.../apache/iotdb/db/qp/physical/sys/FlushPlan.java | 2 +-
.../apache/iotdb/db/qp/physical/sys/MNodePlan.java | 2 +-
.../db/qp/physical/sys/MeasurementMNodePlan.java | 2 +-
.../apache/iotdb/db/qp/physical/sys/MergePlan.java | 2 +-
.../db/qp/physical/sys/PruneTemplatePlan.java | 2 +-
.../db/qp/physical/sys/SetStorageGroupPlan.java | 2 +-
.../db/qp/physical/sys/SetSystemModePlan.java | 2 +-
.../iotdb/db/qp/physical/sys/SetTTLPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/SetTemplatePlan.java | 2 +-
.../iotdb/db/qp/physical/sys/StartTriggerPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/StopTriggerPlan.java | 2 +-
.../db/qp/physical/sys/StorageGroupMNodePlan.java | 2 +-
.../db/qp/physical/sys/UnsetTemplatePlan.java | 2 +-
.../db/writelog/node/ExclusiveWriteLogNode.java | 2 -
.../iotdb/db/qp/physical/PhysicalPlanTest.java | 61 +++++++++++-----------
45 files changed, 100 insertions(+), 83 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/mqtt/PublishHandler.java b/server/src/main/java/org/apache/iotdb/db/mqtt/PublishHandler.java
index e3c902b..ea4ae86 100644
--- a/server/src/main/java/org/apache/iotdb/db/mqtt/PublishHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/mqtt/PublishHandler.java
@@ -27,7 +27,6 @@ import org.apache.iotdb.db.qp.executor.IPlanExecutor;
import org.apache.iotdb.db.qp.executor.PlanExecutor;
import org.apache.iotdb.db.qp.physical.PhysicalPlan;
import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import io.moquette.interception.AbstractInterceptHandler;
import io.moquette.interception.messages.InterceptPublishMessage;
@@ -93,16 +92,15 @@ public class PublishHandler extends AbstractInterceptHandler {
continue;
}
- InsertRowPlan plan = new InsertRowPlan();
- plan.setTime(event.getTimestamp());
- plan.setMeasurements(event.getMeasurements().toArray(new String[0]));
- plan.setValues(event.getValues().toArray(new Object[0]));
- plan.setDataTypes(new TSDataType[event.getValues().size()]);
- plan.setNeedInferType(true);
-
boolean status = false;
try {
- plan.setDeviceId(new PartialPath(event.getDevice()));
+ PartialPath path = new PartialPath(event.getDevice());
+ InsertRowPlan plan =
+ new InsertRowPlan(
+ path,
+ event.getTimestamp(),
+ event.getMeasurements().toArray(new String[0]),
+ event.getValues().toArray(new String[0]));
status = executeNonQuery(plan);
} catch (Exception e) {
LOG.warn(
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
index 777bbfe..1951ba0 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
@@ -73,6 +73,9 @@ import org.apache.iotdb.db.qp.physical.sys.StorageGroupMNodePlan;
import org.apache.iotdb.db.qp.utils.EmptyOutputStream;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
@@ -82,6 +85,7 @@ import java.util.List;
/** This class is a abstract class for all type of PhysicalPlan. */
public abstract class PhysicalPlan {
+ private static final Logger logger = LoggerFactory.getLogger(PhysicalPlan.class);
private static final String SERIALIZATION_UNIMPLEMENTED = "serialization unimplemented";
@@ -182,11 +186,27 @@ public abstract class PhysicalPlan {
/**
* Serialize the plan into the given buffer. This is provided for WAL, so fields that can be
- * recovered will not be serialized.
+ * recovered will not be serialized. If error occurs when serializing this plan, the buffer will
+ * be reset.
*
* @param buffer
*/
public void serialize(ByteBuffer buffer) {
+ buffer.mark();
+ try {
+ serializeImpl(buffer);
+ } catch (UnsupportedOperationException e) {
+ // ignore and throw
+ throw e;
+ } catch (Exception e) {
+ logger.error(
+ "Rollback buffer entry because error occurs when serializing this physical plan.", e);
+ buffer.reset();
+ throw e;
+ }
+ }
+
+ protected void serializeImpl(ByteBuffer buffer) {
throw new UnsupportedOperationException(SERIALIZATION_UNIMPLEMENTED);
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/DeletePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/DeletePlan.java
index 286301b..046e86f 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/DeletePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/DeletePlan.java
@@ -151,7 +151,7 @@ public class DeletePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.DELETE.ordinal();
buffer.put((byte) type);
buffer.putLong(deleteStartTime);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertMultiTabletPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertMultiTabletPlan.java
index a6c54f7..07e3b85 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertMultiTabletPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertMultiTabletPlan.java
@@ -258,7 +258,7 @@ public class InsertMultiTabletPlan extends InsertPlan implements BatchPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.MULTI_BATCH_INSERT.ordinal();
buffer.put((byte) type);
buffer.putInt(insertTabletPlanList.size());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java
index 1a6316d..6be7392 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java
@@ -478,7 +478,7 @@ public class InsertRowPlan extends InsertPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.INSERT.ordinal();
buffer.put((byte) type);
subSerialize(buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsOfOneDevicePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsOfOneDevicePlan.java
index 7009429..8e5c86c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsOfOneDevicePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsOfOneDevicePlan.java
@@ -159,7 +159,7 @@ public class InsertRowsOfOneDevicePlan extends InsertPlan implements BatchPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.BATCH_INSERT_ONE_DEVICE.ordinal();
buffer.put((byte) type);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsPlan.java
index 552ece7..8ef1b86 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsPlan.java
@@ -168,7 +168,7 @@ public class InsertRowsPlan extends InsertPlan implements BatchPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.BATCH_INSERT_ROWS.ordinal();
buffer.put((byte) type);
buffer.putInt(insertRowPlanList.size());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
index 81a855e..a65c6e1 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
@@ -247,7 +247,7 @@ public class InsertTabletPlan extends InsertPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.BATCHINSERT.ordinal();
buffer.put((byte) type);
subSerialize(buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SelectIntoPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SelectIntoPlan.java
index bdb4ea3..2530e97 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SelectIntoPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SelectIntoPlan.java
@@ -68,7 +68,7 @@ public class SelectIntoPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.SELECT_INTO.ordinal());
queryPlan.serialize(buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ActivateTemplatePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ActivateTemplatePlan.java
index 9f1b27c..89bba22 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ActivateTemplatePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ActivateTemplatePlan.java
@@ -57,7 +57,7 @@ public class ActivateTemplatePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.ACTIVATE_TEMPLATE.ordinal());
ReadWriteIOUtils.write(prefixPath.getFullPath(), buffer);
buffer.putLong(index);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AppendTemplatePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AppendTemplatePlan.java
index 0c8632a..aa6bf80 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AppendTemplatePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AppendTemplatePlan.java
@@ -107,7 +107,7 @@ public class AppendTemplatePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.APPEND_TEMPLATE.ordinal());
ReadWriteIOUtils.write(name, buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AuthorPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AuthorPlan.java
index 13e6d6f..e70ae88 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AuthorPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AuthorPlan.java
@@ -325,7 +325,7 @@ public class AuthorPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = this.getPlanType(super.getOperatorType());
buffer.put((byte) type);
buffer.putInt(authorType.ordinal());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AutoCreateDeviceMNodePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AutoCreateDeviceMNodePlan.java
index e2afee3..8b434c9 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AutoCreateDeviceMNodePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/AutoCreateDeviceMNodePlan.java
@@ -61,7 +61,7 @@ public class AutoCreateDeviceMNodePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.AUTO_CREATE_DEVICE_MNODE.ordinal());
putString(buffer, path.getFullPath());
buffer.putLong(index);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ChangeAliasPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ChangeAliasPlan.java
index 55d4f18..426131e 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ChangeAliasPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ChangeAliasPlan.java
@@ -71,7 +71,7 @@ public class ChangeAliasPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.CHANGE_ALIAS.ordinal();
buffer.put((byte) type);
putString(buffer, path.getFullPath());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ChangeTagOffsetPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ChangeTagOffsetPlan.java
index 37d3f33..f00743a 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ChangeTagOffsetPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ChangeTagOffsetPlan.java
@@ -71,7 +71,7 @@ public class ChangeTagOffsetPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.CHANGE_TAG_OFFSET.ordinal();
buffer.put((byte) type);
putString(buffer, path.getFullPath());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ClearCachePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ClearCachePlan.java
index ebf10e2..9cfa70c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ClearCachePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ClearCachePlan.java
@@ -46,7 +46,7 @@ public class ClearCachePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.CLEARCACHE.ordinal());
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateAlignedTimeSeriesPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateAlignedTimeSeriesPlan.java
index 76e4369..238abd9 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateAlignedTimeSeriesPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateAlignedTimeSeriesPlan.java
@@ -173,7 +173,7 @@ public class CreateAlignedTimeSeriesPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.CREATE_ALIGNED_TIMESERIES.ordinal());
byte[] bytes = prefixPath.getFullPath().getBytes();
buffer.putInt(bytes.length);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateContinuousQueryPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateContinuousQueryPlan.java
index 82758dd..2a30b2e 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateContinuousQueryPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateContinuousQueryPlan.java
@@ -123,7 +123,7 @@ public class CreateContinuousQueryPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.CREATE_CONTINUOUS_QUERY.ordinal());
ReadWriteIOUtils.write(continuousQueryName, buffer);
ReadWriteIOUtils.write(querySql, buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateIndexPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateIndexPlan.java
index 858b8f4..0e6beab 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateIndexPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateIndexPlan.java
@@ -112,7 +112,7 @@ public class CreateIndexPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.CREATE_INDEX.ordinal();
buffer.put((byte) type);
buffer.put((byte) indexType.serialize());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java
index b499bdb..1c734d8 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java
@@ -223,7 +223,7 @@ public class CreateMultiTimeSeriesPlan extends PhysicalPlan implements BatchPlan
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.CREATE_MULTI_TIMESERIES.ordinal();
buffer.put((byte) type);
buffer.putInt(paths.size());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateSnapshotPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateSnapshotPlan.java
index f7504ef..b2e51ca 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateSnapshotPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateSnapshotPlan.java
@@ -47,7 +47,7 @@ public class CreateSnapshotPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.CREATE_SNAPSHOT.ordinal());
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTemplatePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTemplatePlan.java
index 59f1a93..9542371 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTemplatePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTemplatePlan.java
@@ -281,7 +281,7 @@ public class CreateTemplatePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.CREATE_TEMPLATE.ordinal());
ReadWriteIOUtils.write(name, buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java
index 31b0b8d..8bfd44e 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java
@@ -208,7 +208,7 @@ public class CreateTimeSeriesPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.CREATE_TIMESERIES.ordinal());
byte[] bytes = path.getFullPath().getBytes();
buffer.putInt(bytes.length);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTriggerPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTriggerPlan.java
index 1f7908b..8cc5bf2 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTriggerPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTriggerPlan.java
@@ -128,7 +128,7 @@ public class CreateTriggerPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.CREATE_TRIGGER.ordinal());
putString(buffer, triggerName);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DataAuthPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DataAuthPlan.java
index dda46b1..0e0d474 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DataAuthPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DataAuthPlan.java
@@ -65,7 +65,7 @@ public class DataAuthPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = this.getPlanType(super.getOperatorType());
buffer.put((byte) type);
buffer.putInt(users.size());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DeleteStorageGroupPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DeleteStorageGroupPlan.java
index 535685c..4ba3a3f 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DeleteStorageGroupPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DeleteStorageGroupPlan.java
@@ -60,7 +60,7 @@ public class DeleteStorageGroupPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.DELETE_STORAGE_GROUP.ordinal();
buffer.put((byte) type);
buffer.putInt(this.getPaths().size());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DeleteTimeSeriesPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DeleteTimeSeriesPlan.java
index 4e4e8a4..1ef49ac 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DeleteTimeSeriesPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DeleteTimeSeriesPlan.java
@@ -84,7 +84,7 @@ public class DeleteTimeSeriesPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.DELETE_TIMESERIES.ordinal();
buffer.put((byte) type);
buffer.putInt(deletePathList.size());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropContinuousQueryPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropContinuousQueryPlan.java
index a9fc2a3..7d60f26 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropContinuousQueryPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropContinuousQueryPlan.java
@@ -51,7 +51,7 @@ public class DropContinuousQueryPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.DROP_CONTINUOUS_QUERY.ordinal());
ReadWriteIOUtils.write(continuousQueryName, buffer);
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropIndexPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropIndexPlan.java
index 22086ee..d49ec29 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropIndexPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropIndexPlan.java
@@ -79,7 +79,7 @@ public class DropIndexPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.DROP_INDEX.ordinal();
buffer.put((byte) type);
buffer.put((byte) indexType.serialize());
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropTriggerPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropTriggerPlan.java
index 2ad38cc..f4cc22a 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropTriggerPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DropTriggerPlan.java
@@ -62,7 +62,7 @@ public class DropTriggerPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.DROP_TRIGGER.ordinal());
putString(buffer, triggerName);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/FlushPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/FlushPlan.java
index 588721e..acd9354 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/FlushPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/FlushPlan.java
@@ -148,7 +148,7 @@ public class FlushPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.FLUSH.ordinal();
buffer.put((byte) type);
if (isSeq == null) {
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MNodePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MNodePlan.java
index f84644c..6425b79 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MNodePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MNodePlan.java
@@ -70,7 +70,7 @@ public class MNodePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.MNODE.ordinal());
putString(buffer, name);
buffer.putInt(childSize);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MeasurementMNodePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MeasurementMNodePlan.java
index db4842d..efa98de 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MeasurementMNodePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MeasurementMNodePlan.java
@@ -56,7 +56,7 @@ public class MeasurementMNodePlan extends MNodePlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.MEASUREMENT_MNODE.ordinal());
putString(buffer, name);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MergePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MergePlan.java
index 5e228cb..b219209 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MergePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MergePlan.java
@@ -50,7 +50,7 @@ public class MergePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.MERGE.ordinal());
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/PruneTemplatePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/PruneTemplatePlan.java
index 5750b63..1902908 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/PruneTemplatePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/PruneTemplatePlan.java
@@ -59,7 +59,7 @@ public class PruneTemplatePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.PRUNE_TEMPLATE.ordinal());
ReadWriteIOUtils.write(name, buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetStorageGroupPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetStorageGroupPlan.java
index a0665f1..5f6f24c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetStorageGroupPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetStorageGroupPlan.java
@@ -64,7 +64,7 @@ public class SetStorageGroupPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.SET_STORAGE_GROUP.ordinal());
putString(buffer, path.getFullPath());
buffer.putLong(index);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetSystemModePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetSystemModePlan.java
index bd01dc7..c435b6f 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetSystemModePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetSystemModePlan.java
@@ -62,7 +62,7 @@ public class SetSystemModePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.SET_SYSTEM_MODE.ordinal());
ReadWriteIOUtils.write(isReadOnly, buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTTLPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTTLPlan.java
index c125fce..4c09325 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTTLPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTTLPlan.java
@@ -67,7 +67,7 @@ public class SetTTLPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
int type = PhysicalPlanType.TTL.ordinal();
buffer.put((byte) type);
buffer.putLong(dataTTL);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTemplatePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTemplatePlan.java
index 76b1f64..c1db1fe 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTemplatePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTemplatePlan.java
@@ -65,7 +65,7 @@ public class SetTemplatePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.SET_TEMPLATE.ordinal());
ReadWriteIOUtils.write(templateName, buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StartTriggerPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StartTriggerPlan.java
index 22a90d4..bf6ecf6 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StartTriggerPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StartTriggerPlan.java
@@ -62,7 +62,7 @@ public class StartTriggerPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.START_TRIGGER.ordinal());
putString(buffer, triggerName);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StopTriggerPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StopTriggerPlan.java
index 1a94a74..78b44e9 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StopTriggerPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StopTriggerPlan.java
@@ -62,7 +62,7 @@ public class StopTriggerPlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.STOP_TRIGGER.ordinal());
putString(buffer, triggerName);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StorageGroupMNodePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StorageGroupMNodePlan.java
index 0949ea2..95a138c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StorageGroupMNodePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/StorageGroupMNodePlan.java
@@ -67,7 +67,7 @@ public class StorageGroupMNodePlan extends MNodePlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.STORAGE_GROUP_MNODE.ordinal());
putString(buffer, name);
buffer.putLong(dataTTL);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/UnsetTemplatePlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/UnsetTemplatePlan.java
index 2d18d66..ca77ced 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/UnsetTemplatePlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/UnsetTemplatePlan.java
@@ -67,7 +67,7 @@ public class UnsetTemplatePlan extends PhysicalPlan {
}
@Override
- public void serialize(ByteBuffer buffer) {
+ public void serializeImpl(ByteBuffer buffer) {
buffer.put((byte) PhysicalPlanType.UNSET_TEMPLATE.ordinal());
ReadWriteIOUtils.write(prefixPath, buffer);
diff --git a/server/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java b/server/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
index 2eecdab..5b281c6 100644
--- a/server/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
@@ -126,11 +126,9 @@ public class ExclusiveWriteLogNode implements WriteLogNode, Comparable<Exclusive
}
private void putLog(PhysicalPlan plan) {
- logBufferWorking.mark();
try {
plan.serialize(logBufferWorking);
} catch (BufferOverflowException e) {
- logBufferWorking.reset();
sync();
plan.serialize(logBufferWorking);
}
diff --git a/server/src/test/java/org/apache/iotdb/db/qp/physical/PhysicalPlanTest.java b/server/src/test/java/org/apache/iotdb/db/qp/physical/PhysicalPlanTest.java
index 3f92d00..c63d50a 100644
--- a/server/src/test/java/org/apache/iotdb/db/qp/physical/PhysicalPlanTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/qp/physical/PhysicalPlanTest.java
@@ -28,34 +28,8 @@ import org.apache.iotdb.db.exception.runtime.SQLParserException;
import org.apache.iotdb.db.metadata.path.PartialPath;
import org.apache.iotdb.db.qp.Planner;
import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
-import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
-import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
-import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
-import org.apache.iotdb.db.qp.physical.crud.GroupByTimeFillPlan;
-import org.apache.iotdb.db.qp.physical.crud.GroupByTimePlan;
-import org.apache.iotdb.db.qp.physical.crud.LastQueryPlan;
-import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
-import org.apache.iotdb.db.qp.physical.crud.RawDataQueryPlan;
-import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
-import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
-import org.apache.iotdb.db.qp.physical.sys.CreateContinuousQueryPlan;
-import org.apache.iotdb.db.qp.physical.sys.CreateFunctionPlan;
-import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
-import org.apache.iotdb.db.qp.physical.sys.CreateTriggerPlan;
-import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
-import org.apache.iotdb.db.qp.physical.sys.DropContinuousQueryPlan;
-import org.apache.iotdb.db.qp.physical.sys.DropFunctionPlan;
-import org.apache.iotdb.db.qp.physical.sys.DropTriggerPlan;
-import org.apache.iotdb.db.qp.physical.sys.LoadConfigurationPlan;
-import org.apache.iotdb.db.qp.physical.sys.OperateFilePlan;
-import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
-import org.apache.iotdb.db.qp.physical.sys.ShowContinuousQueriesPlan;
-import org.apache.iotdb.db.qp.physical.sys.ShowFunctionsPlan;
-import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
-import org.apache.iotdb.db.qp.physical.sys.ShowPlan.ShowContentType;
-import org.apache.iotdb.db.qp.physical.sys.ShowTriggersPlan;
-import org.apache.iotdb.db.qp.physical.sys.StartTriggerPlan;
-import org.apache.iotdb.db.qp.physical.sys.StopTriggerPlan;
+import org.apache.iotdb.db.qp.physical.crud.*;
+import org.apache.iotdb.db.qp.physical.sys.*;
import org.apache.iotdb.db.query.executor.fill.LinearFill;
import org.apache.iotdb.db.query.executor.fill.PreviousFill;
import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
@@ -80,6 +54,7 @@ import org.junit.Test;
import java.io.File;
import java.io.IOException;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -1211,7 +1186,7 @@ public class PhysicalPlanTest {
ShowTriggersPlan plan = (ShowTriggersPlan) processor.parseSQLToPhysicalPlan(sql);
Assert.assertTrue(plan.isQuery());
- Assert.assertEquals(ShowContentType.TRIGGERS, plan.getShowContentType());
+ Assert.assertEquals(ShowPlan.ShowContentType.TRIGGERS, plan.getShowContentType());
}
@Test
@@ -1424,7 +1399,7 @@ public class PhysicalPlanTest {
ShowFunctionsPlan plan = (ShowFunctionsPlan) processor.parseSQLToPhysicalPlan(sql);
Assert.assertTrue(plan.isQuery());
- Assert.assertEquals(ShowContentType.FUNCTIONS, plan.getShowContentType());
+ Assert.assertEquals(ShowPlan.ShowContentType.FUNCTIONS, plan.getShowContentType());
}
@Test
@@ -1450,4 +1425,30 @@ public class PhysicalPlanTest {
new SingleSeriesExpression(new Path("root.vehicle.d5", "s1"), ValueFilter.like("string*"));
assertEquals(expect.toString(), queryFilter.toString());
}
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testSerializationError() {
+ ShowDevicesPlan plan = new ShowDevicesPlan();
+
+ ByteBuffer byteBuffer = ByteBuffer.allocate(10);
+ plan.serialize(byteBuffer);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void testSerializationRollback() {
+ InsertRowPlan plan = new InsertRowPlan();
+ // only serialize time
+ plan.setTime(0L);
+
+ ByteBuffer byteBuffer = ByteBuffer.allocate(10000);
+ byteBuffer.putInt(0);
+ long position = byteBuffer.position();
+
+ try {
+ plan.serialize(byteBuffer);
+ } catch (NullPointerException e) {
+ Assert.assertEquals(position, byteBuffer.position());
+ throw e;
+ }
+ }
}