summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2020-03-24 14:35:52 +0000
committerGeir Storli <geirst@verizonmedia.com>2020-03-24 14:35:52 +0000
commit86f42102e74045fefe744c9bff0e31ff878b99a8 (patch)
tree3b2aa6ce04fffe756acc0c4613a680e5ea574aeb /searchlib
parent4f29479b720958cba7e40e1142b379962f55c2e8 (diff)
Expose information from tensor attribute and hnsw index in state explorer for attribute.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h1
-rw-r--r--searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/tensor/hnsw_index.h2
-rw-r--r--searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h7
-rw-r--r--searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h1
-rw-r--r--searchlib/src/vespa/searchlib/tensor/nearest_neighbor_index.h3
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp37
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_attribute.h2
-rw-r--r--searchlib/src/vespa/searchlib/util/CMakeLists.txt1
-rw-r--r--searchlib/src/vespa/searchlib/util/state_explorer_utils.cpp19
-rw-r--r--searchlib/src/vespa/searchlib/util/state_explorer_utils.h19
14 files changed, 114 insertions, 11 deletions
diff --git a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp
index e6eb01596a8..97d5cb61327 100644
--- a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp
+++ b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp
@@ -141,6 +141,7 @@ public:
++_memory_usage_cnt;
return vespalib::MemoryUsage();
}
+ void get_state(const vespalib::slime::Inserter&) const override {}
std::vector<Neighbor> find_top_k(uint32_t k, vespalib::tensor::TypedCells vector, uint32_t explore_k) const override {
(void) k;
(void) vector;
diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp
index 9f127018a92..627f7f0dfa9 100644
--- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp
+++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp
@@ -4,15 +4,17 @@
#include "dense_tensor_attribute_saver.h"
#include "nearest_neighbor_index.h"
#include "tensor_attribute.hpp"
-#include <vespa/eval/tensor/tensor.h>
#include <vespa/eval/tensor/dense/mutable_dense_tensor_view.h>
+#include <vespa/eval/tensor/tensor.h>
#include <vespa/fastlib/io/bufferedfile.h>
#include <vespa/searchlib/attribute/readerbase.h>
+#include <vespa/vespalib/data/slime/inserter.h>
#include <vespa/log/log.h>
LOG_SETUP(".searchlib.tensor.dense_tensor_attribute");
using vespalib::eval::ValueType;
+using vespalib::slime::ObjectInserter;
using vespalib::tensor::MutableDenseTensorView;
using vespalib::tensor::Tensor;
@@ -217,6 +219,17 @@ DenseTensorAttribute::removeOldGenerations(generation_t first_used_gen)
}
}
+void
+DenseTensorAttribute::get_state(const vespalib::slime::Inserter& inserter) const
+{
+ auto& object = inserter.insertObject();
+ populate_state(object);
+ if (_index) {
+ ObjectInserter index_inserter(object, "nearest_neighbor_index");
+ _index->get_state(index_inserter);
+ }
+}
+
vespalib::tensor::TypedCells
DenseTensorAttribute::get_vector(uint32_t docid) const
{
diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h
index 8eba8354fbd..f0383627ea2 100644
--- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h
+++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h
@@ -41,6 +41,7 @@ public:
uint32_t getVersion() const override;
void onGenerationChange(generation_t next_gen) override;
void removeOldGenerations(generation_t first_used_gen) override;
+ void get_state(const vespalib::slime::Inserter& inserter) const override;
// Implements DocVectorAccess
vespalib::tensor::TypedCells get_vector(uint32_t docid) const override;
diff --git a/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp b/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp
index 6d48ea1a967..988264c0455 100644
--- a/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp
+++ b/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp
@@ -3,12 +3,16 @@
#include "distance_function.h"
#include "hnsw_index.h"
#include "random_level_generator.h"
+#include <vespa/searchlib/util/state_explorer_utils.h>
#include <vespa/eval/tensor/dense/typed_cells.h>
+#include <vespa/vespalib/data/slime/cursor.h>
+#include <vespa/vespalib/data/slime/inserter.h>
#include <vespa/vespalib/datastore/array_store.hpp>
#include <vespa/vespalib/util/rcuvector.hpp>
namespace search::tensor {
+using search::StateExplorerUtils;
using search::datastore::EntryRef;
namespace {
@@ -424,6 +428,13 @@ HnswIndex::memory_usage() const
return result;
}
+void
+HnswIndex::get_state(const vespalib::slime::Inserter& inserter) const
+{
+ auto& object = inserter.insertObject();
+ StateExplorerUtils::memory_usage_to_slime(memory_usage(), object.setObject("memory_usage"));
+}
+
struct NeighborsByDocId {
bool operator() (const NearestNeighborIndex::Neighbor &lhs,
const NearestNeighborIndex::Neighbor &rhs)
diff --git a/searchlib/src/vespa/searchlib/tensor/hnsw_index.h b/searchlib/src/vespa/searchlib/tensor/hnsw_index.h
index 7c0d650ab2f..8da48a21af3 100644
--- a/searchlib/src/vespa/searchlib/tensor/hnsw_index.h
+++ b/searchlib/src/vespa/searchlib/tensor/hnsw_index.h
@@ -153,6 +153,8 @@ public:
void transfer_hold_lists(generation_t current_gen) override;
void trim_hold_lists(generation_t first_used_gen) override;
vespalib::MemoryUsage memory_usage() const override;
+ void get_state(const vespalib::slime::Inserter& inserter) const override;
+
std::vector<Neighbor> find_top_k(uint32_t k, TypedCells vector, uint32_t explore_k) const override;
FurthestPriQ top_k_candidates(const TypedCells &vector, uint32_t k) const;
diff --git a/searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h
index 6c83d3caae9..520abb13d06 100644
--- a/searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h
+++ b/searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h
@@ -9,6 +9,7 @@ class MutableDenseTensorView;
class Tensor;
}
namespace vespalib::eval { class ValueType; }
+namespace vespalib::slime { struct Inserter; }
namespace search::tensor {
@@ -25,6 +26,12 @@ public:
virtual std::unique_ptr<Tensor> getEmptyTensor() const = 0;
virtual void getTensor(uint32_t docId, vespalib::tensor::MutableDenseTensorView &tensor) const = 0;
virtual vespalib::eval::ValueType getTensorType() const = 0;
+
+ /**
+ * Gets custom state for this tensor attribute by inserting it into the given Slime inserter.
+ * This function is only called by the writer thread or when the writer thread is blocked.
+ */
+ virtual void get_state(const vespalib::slime::Inserter& inserter) const = 0;
};
} // namespace search::tensor
diff --git a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp
index 8b60f0c3e8e..593330b7bd4 100644
--- a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp
+++ b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp
@@ -62,4 +62,10 @@ ImportedTensorAttributeVectorReadGuard::getTensorType() const
return _target_tensor_attribute.getTensorType();
}
+void
+ImportedTensorAttributeVectorReadGuard::get_state(const vespalib::slime::Inserter& inserter) const
+{
+ _target_tensor_attribute.get_state(inserter);
+}
+
}
diff --git a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h
index fce744503cd..74c5cd9a685 100644
--- a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h
+++ b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h
@@ -34,6 +34,7 @@ public:
virtual std::unique_ptr<Tensor> getEmptyTensor() const override;
virtual void getTensor(uint32_t docId, vespalib::tensor::MutableDenseTensorView &tensor) const override;
virtual vespalib::eval::ValueType getTensorType() const override;
+ virtual void get_state(const vespalib::slime::Inserter& inserter) const override;
};
}
diff --git a/searchlib/src/vespa/searchlib/tensor/nearest_neighbor_index.h b/searchlib/src/vespa/searchlib/tensor/nearest_neighbor_index.h
index bd98623bdd3..ccd7e614e06 100644
--- a/searchlib/src/vespa/searchlib/tensor/nearest_neighbor_index.h
+++ b/searchlib/src/vespa/searchlib/tensor/nearest_neighbor_index.h
@@ -8,6 +8,8 @@
#include <vespa/vespalib/util/generationhandler.h>
#include <vespa/vespalib/util/memoryusage.h>
+namespace vespalib::slime { struct Inserter; }
+
namespace search::tensor {
/**
@@ -30,6 +32,7 @@ public:
virtual void transfer_hold_lists(generation_t current_gen) = 0;
virtual void trim_hold_lists(generation_t first_used_gen) = 0;
virtual vespalib::MemoryUsage memory_usage() const = 0;
+ virtual void get_state(const vespalib::slime::Inserter& inserter) const = 0;
virtual std::vector<Neighbor> find_top_k(uint32_t k,
vespalib::tensor::TypedCells vector,
diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp
index acca4c3d8f1..95af9f0471b 100644
--- a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp
+++ b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp
@@ -7,21 +7,23 @@
#include <vespa/eval/tensor/dense/typed_dense_tensor_builder.h>
#include <vespa/eval/tensor/sparse/sparse_tensor.h>
#include <vespa/eval/tensor/wrapped_simple_tensor.h>
+#include <vespa/searchlib/util/state_explorer_utils.h>
+#include <vespa/vespalib/data/slime/cursor.h>
+#include <vespa/vespalib/data/slime/inserter.h>
#include <vespa/vespalib/util/rcuvector.hpp>
+using document::TensorDataType;
+using document::WrongTensorTypeException;
using vespalib::eval::SimpleTensor;
using vespalib::eval::ValueType;
+using vespalib::tensor::SparseTensor;
using vespalib::tensor::Tensor;
using vespalib::tensor::TypedDenseTensorBuilder;
-using vespalib::tensor::dispatch_0;
-using vespalib::tensor::SparseTensor;
using vespalib::tensor::WrappedSimpleTensor;
-using document::TensorDataType;
-using document::WrongTensorTypeException;
-
-namespace search {
+using vespalib::tensor::dispatch_0;
+using search::StateExplorerUtils;
-namespace tensor {
+namespace search::tensor {
namespace {
@@ -184,6 +186,16 @@ TensorAttribute::memory_usage() const
return result;
}
+void
+TensorAttribute::populate_state(vespalib::slime::Cursor& object) const
+{
+ object.setLong("compact_generation", _compactGeneration);
+ StateExplorerUtils::memory_usage_to_slime(_refVector.getMemoryUsage(),
+ object.setObject("ref_vector").setObject("memory_usage"));
+ StateExplorerUtils::memory_usage_to_slime(_tensorStore.getMemoryUsage(),
+ object.setObject("tensor_store").setObject("memory_usage"));
+}
+
Tensor::UP
TensorAttribute::getEmptyTensor() const
{
@@ -197,6 +209,13 @@ TensorAttribute::getTensorType() const
}
void
+TensorAttribute::get_state(const vespalib::slime::Inserter& inserter) const
+{
+ auto& object = inserter.insertObject();
+ populate_state(object);
+}
+
+void
TensorAttribute::clearDocs(DocId lidLow, DocId lidLimit)
{
assert(lidLow <= lidLimit);
@@ -236,6 +255,4 @@ TensorAttribute::getRefCopy() const
IMPLEMENT_IDENTIFIABLE_ABSTRACT(TensorAttribute, AttributeVector);
-} // namespace search::tensor
-
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h
index 5e65317baa2..e8efd2170c9 100644
--- a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h
+++ b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h
@@ -28,6 +28,7 @@ protected:
void checkTensorType(const Tensor &tensor);
void setTensorRef(DocId docId, EntryRef ref);
virtual vespalib::MemoryUsage memory_usage() const;
+ void populate_state(vespalib::slime::Cursor& object) const;
public:
DECLARE_IDENTIFIABLE_ABSTRACT(TensorAttribute);
@@ -44,6 +45,7 @@ public:
bool addDoc(DocId &docId) override;
std::unique_ptr<Tensor> getEmptyTensor() const override;
vespalib::eval::ValueType getTensorType() const override;
+ void get_state(const vespalib::slime::Inserter& inserter) const override;
void clearDocs(DocId lidLow, DocId lidLimit) override;
void onShrinkLidSpace() override;
uint32_t getVersion() const override;
diff --git a/searchlib/src/vespa/searchlib/util/CMakeLists.txt b/searchlib/src/vespa/searchlib/util/CMakeLists.txt
index 873f1824d04..ac5fc5f54fc 100644
--- a/searchlib/src/vespa/searchlib/util/CMakeLists.txt
+++ b/searchlib/src/vespa/searchlib/util/CMakeLists.txt
@@ -16,6 +16,7 @@ vespa_add_library(searchlib_util OBJECT
rawbuf.cpp
sigbushandler.cpp
slime_output_raw_buf_adapter.cpp
+ state_explorer_utils.cpp
statebuf.cpp
statefile.cpp
stringenum.cpp
diff --git a/searchlib/src/vespa/searchlib/util/state_explorer_utils.cpp b/searchlib/src/vespa/searchlib/util/state_explorer_utils.cpp
new file mode 100644
index 00000000000..307fc91a605
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/util/state_explorer_utils.cpp
@@ -0,0 +1,19 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "state_explorer_utils.h"
+#include <vespa/vespalib/data/slime/cursor.h>
+#include <vespa/vespalib/util/memoryusage.h>
+
+namespace search {
+
+void
+StateExplorerUtils::memory_usage_to_slime(const vespalib::MemoryUsage& usage, vespalib::slime::Cursor& object)
+{
+ object.setLong("allocated", usage.allocatedBytes());
+ object.setLong("used", usage.usedBytes());
+ object.setLong("dead", usage.deadBytes());
+ object.setLong("onHold", usage.allocatedBytesOnHold());
+}
+
+}
+
diff --git a/searchlib/src/vespa/searchlib/util/state_explorer_utils.h b/searchlib/src/vespa/searchlib/util/state_explorer_utils.h
new file mode 100644
index 00000000000..58867b426a1
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/util/state_explorer_utils.h
@@ -0,0 +1,19 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+namespace vespalib { class MemoryUsage; }
+namespace vespalib::slime { struct Cursor; }
+
+namespace search {
+
+/**
+ * Utility functions for state explorers to convert objects to slime.
+ */
+class StateExplorerUtils {
+public:
+ static void memory_usage_to_slime(const vespalib::MemoryUsage& usage, vespalib::slime::Cursor& object);
+};
+
+}
+