diff --git a/internal/core/src/query/ExprImpl.h b/internal/core/src/query/ExprImpl.h
index 50f9b8fbfd5c1b477e3c51494a46c35363270770..ca24c8ddabe79efbd99f6861f66cc8b66102df7c 100644
--- a/internal/core/src/query/ExprImpl.h
+++ b/internal/core/src/query/ExprImpl.h
@@ -13,11 +13,12 @@
 #include "Expr.h"
 #include <tuple>
 #include <vector>
+#include <boost/container/vector.hpp>
 
 namespace milvus::query {
 template <typename T>
 struct TermExprImpl : TermExpr {
-    std::vector<T> terms_;
+    boost::container::vector<T> terms_;
 };
 
 template <typename T>
diff --git a/internal/core/src/query/visitors/ShowExprVisitor.cpp b/internal/core/src/query/visitors/ShowExprVisitor.cpp
index ac9b3915e482d11c8aee231ba17bbc39079ef846..79ae412c7a140c1041d0ad3b727b8f4dfc746a95 100644
--- a/internal/core/src/query/visitors/ShowExprVisitor.cpp
+++ b/internal/core/src/query/visitors/ShowExprVisitor.cpp
@@ -115,6 +115,8 @@ ShowExprVisitor::visit(TermExpr& expr) {
     Assert(field_is_vector(expr.data_type_) == false);
     auto terms = [&] {
         switch (expr.data_type_) {
+            case DataType::BOOL:
+                return TermExtract<bool>(expr);
             case DataType::INT8:
                 return TermExtract<int8_t>(expr);
             case DataType::INT16:
diff --git a/internal/core/src/segcore/ConcurrentVector.h b/internal/core/src/segcore/ConcurrentVector.h
index 9f475aff1e897bef262b0bb3b0c8e7e69a84b40f..1293bb843b76e8f2d1cd5920678775740467dfb2 100644
--- a/internal/core/src/segcore/ConcurrentVector.h
+++ b/internal/core/src/segcore/ConcurrentVector.h
@@ -25,33 +25,6 @@
 
 namespace milvus::segcore {
 
-// we don't use std::array because capacity of concurrent_vector wastes too much memory
-// template <typename Type>
-// class FixedVector : public std::vector<Type> {
-// public:
-//    // This is a stupid workaround for tbb API to avoid memory copy
-//    explicit FixedVector(int64_t size) : placeholder_size_(size) {
-//    }
-//    FixedVector(const FixedVector<Type>& placeholder_vec)
-//        : std::vector<Type>(placeholder_vec.placeholder_size_), is_placeholder_(false) {
-//        // Assert(placeholder_vec.is_placeholder_);
-//    }
-//    FixedVector(FixedVector<Type>&&) = delete;
-//
-//    FixedVector&
-//    operator=(FixedVector<Type>&&) = delete;
-//
-//    FixedVector&
-//    operator=(const FixedVector<Type>&) = delete;
-//
-//    bool is_placeholder() {
-//        return is_placeholder_;
-//    }
-// private:
-//    bool is_placeholder_ = true;
-//    int placeholder_size_ = 0;
-//};
-
 template <typename Type>
 using FixedVector = boost::container::vector<Type>;
 
diff --git a/internal/core/src/segcore/IndexingEntry.cpp b/internal/core/src/segcore/IndexingEntry.cpp
index bc40622f7be4a19050a4a310096d4aefa21090c0..f6d0aeaf94069c4194232196e3c3d6b79fadbdd9 100644
--- a/internal/core/src/segcore/IndexingEntry.cpp
+++ b/internal/core/src/segcore/IndexingEntry.cpp
@@ -111,6 +111,8 @@ CreateIndex(const FieldMeta& field_meta, int64_t chunk_size) {
         }
     }
     switch (field_meta.get_data_type()) {
+        case DataType::BOOL:
+            return std::make_unique<ScalarIndexingEntry<bool>>(field_meta, chunk_size);
         case DataType::INT8:
             return std::make_unique<ScalarIndexingEntry<int8_t>>(field_meta, chunk_size);
         case DataType::INT16:
diff --git a/internal/core/src/segcore/InsertRecord.cpp b/internal/core/src/segcore/InsertRecord.cpp
index 6494d03271ebd01fcb6519c2579e89274b371daf..775ad569502886102af1f9bc3b831f7fe74ccd90 100644
--- a/internal/core/src/segcore/InsertRecord.cpp
+++ b/internal/core/src/segcore/InsertRecord.cpp
@@ -27,6 +27,10 @@ InsertRecord::InsertRecord(const Schema& schema, int64_t chunk_size) : uids_(1),
             }
         }
         switch (field.get_data_type()) {
+            case DataType::BOOL: {
+                entity_vec_.emplace_back(std::make_shared<ConcurrentVector<bool>>(chunk_size));
+                break;
+            }
             case DataType::INT8: {
                 entity_vec_.emplace_back(std::make_shared<ConcurrentVector<int8_t>>(chunk_size));
                 break;
diff --git a/internal/kv/etcd/etcd_kv.go b/internal/kv/etcd/etcd_kv.go
index 5e17a77d4e41cba2ea8e0695bdb08f6f2fa09c62..1345bd735b6681d2bbf2658bc0d651e108421162 100644
--- a/internal/kv/etcd/etcd_kv.go
+++ b/internal/kv/etcd/etcd_kv.go
@@ -68,18 +68,6 @@ func (kv *EtcdKV) Load(key string) (string, error) {
 	return string(resp.Kvs[0].Value), nil
 }
 
-func (kv *EtcdKV) GetCount(key string) (int64, error) {
-	key = path.Join(kv.rootPath, key)
-	ctx, cancel := context.WithTimeout(context.TODO(), RequestTimeout)
-	defer cancel()
-	resp, err := kv.client.Get(ctx, key)
-	if err != nil {
-		return -1, err
-	}
-
-	return resp.Count, nil
-}
-
 func (kv *EtcdKV) MultiLoad(keys []string) ([]string, error) {
 	ops := make([]clientv3.Op, 0, len(keys))
 	for _, keyLoad := range keys {
diff --git a/internal/querynode/flow_graph_filter_dm_node.go b/internal/querynode/flow_graph_filter_dm_node.go
index 08288285f82b27aa71593d8d23e1d128ee6e488d..ceddaeab0b95a1a1b1880def7689ee3278a20e3a 100644
--- a/internal/querynode/flow_graph_filter_dm_node.go
+++ b/internal/querynode/flow_graph_filter_dm_node.go
@@ -70,10 +70,10 @@ func (fdmNode *filterDmNode) filterInvalidInsertMessage(msg *msgstream.InsertMsg
 		return msg
 	}
 
-	// If the last record is drop type, all insert requests are invalid.
-	if !records[len(records)-1].createOrDrop {
-		return nil
-	}
+	// TODO: If the last record is drop type, all insert requests are invalid.
+	//if !records[len(records)-1].createOrDrop {
+	//	return nil
+	//}
 
 	// Filter insert requests before last record.
 	if len(msg.RowIDs) != len(msg.Timestamps) || len(msg.RowIDs) != len(msg.RowData) {
diff --git a/internal/writenode/client/client.go b/internal/writenode/client/client.go
index a966ff8862e21d5c0d701d84eb5507be1881ef76..3b67c4a90b237b1022ac20053195457b5a9c5e2f 100644
--- a/internal/writenode/client/client.go
+++ b/internal/writenode/client/client.go
@@ -6,7 +6,6 @@ import (
 	"github.com/golang/protobuf/proto"
 	"go.etcd.io/etcd/clientv3"
 
-	"github.com/zilliztech/milvus-distributed/internal/errors"
 	"github.com/zilliztech/milvus-distributed/internal/kv"
 	etcdkv "github.com/zilliztech/milvus-distributed/internal/kv/etcd"
 	"github.com/zilliztech/milvus-distributed/internal/msgstream"
@@ -80,21 +79,6 @@ func (c *Client) DescribeSegment(segmentID UniqueID) (*SegmentDescription, error
 	}
 
 	key := c.kvPrefix + strconv.FormatInt(segmentID, 10)
-
-	etcdKV, ok := c.kvClient.(*etcdkv.EtcdKV)
-	if !ok {
-		return nil, errors.New("type assertion failed for etcd kv")
-	}
-	count, err := etcdKV.GetCount(key)
-	if err != nil {
-		return nil, err
-	}
-
-	if count <= 0 {
-		ret.IsClosed = false
-		return ret, nil
-	}
-
 	value, err := c.kvClient.Load(key)
 	if err != nil {
 		return ret, err
diff --git a/internal/writenode/flow_graph_filter_dm_node.go b/internal/writenode/flow_graph_filter_dm_node.go
index 9bac1b46ecdf9146f5d0df5b2667f7c83873ad08..98e9ec0bc4cc5fb596c93a2725ef2bd521da911e 100644
--- a/internal/writenode/flow_graph_filter_dm_node.go
+++ b/internal/writenode/flow_graph_filter_dm_node.go
@@ -81,10 +81,10 @@ func (fdmNode *filterDmNode) filterInvalidInsertMessage(msg *msgstream.InsertMsg
 		return msg
 	}
 
-	// If the last record is drop type, all insert requests are invalid.
-	if !records[len(records)-1].createOrDrop {
-		return nil
-	}
+	// TODO: If the last record is drop type, all insert requests are invalid.
+	//if !records[len(records)-1].createOrDrop {
+	//	return nil
+	//}
 
 	// Filter insert requests before last record.
 	if len(msg.RowIDs) != len(msg.Timestamps) || len(msg.RowIDs) != len(msg.RowData) {