Skip to content

Commit

Permalink
Merge branch 'main' into v2
Browse files Browse the repository at this point in the history
  • Loading branch information
lalinsky committed Feb 25, 2024
2 parents a847817 + bebb433 commit 6ce116d
Show file tree
Hide file tree
Showing 12 changed files with 129 additions and 5 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ set(tests_SOURCES
src/util/tests.cpp
src/server/session_test.cpp
src/server/http_test.cpp
src/server/grpc/service_test.cpp
)

install(
Expand Down
24 changes: 23 additions & 1 deletion src/index/multi_index.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,21 @@ void MultiIndex::setThreadPool(QThreadPool *threadPool) {
m_threadPool = threadPool;
}

bool MultiIndex::indexExists(const QString &name) {
QStringList MultiIndex::listIndexes() {
QMutexLocker locker(&m_mutex);
QStringList indexes;
if (checkIndex(ROOT_INDEX_NAME)) {
indexes.push_back(ROOT_INDEX_NAME);
}
for (auto subDir: m_dir->listDirectories()) {
if (checkIndex(subDir)) {
indexes.push_back(subDir);
}
}
return indexes;
}

bool MultiIndex::checkIndex(const QString &name) {
if (m_indexes.contains(name)) {
return true;
}
Expand All @@ -38,6 +51,11 @@ bool MultiIndex::indexExists(const QString &name) {
return Index::exists(subDir);
}

bool MultiIndex::indexExists(const QString &name) {
QMutexLocker locker(&m_mutex);
return checkIndex(name);
}

QSharedPointer<Index> MultiIndex::getRootIndex(bool create) {
return getIndex(ROOT_INDEX_NAME, create);
}
Expand All @@ -59,6 +77,10 @@ QSharedPointer<Index> MultiIndex::getIndex(const QString &name, bool create) {
return index;
}

void MultiIndex::createRootIndex() {
getRootIndex(true);
}

void MultiIndex::createIndex(const QString &name) {
if (name == ROOT_INDEX_NAME) {
throw NotImplemented("Changing the legacy root index is not supported");
Expand Down
7 changes: 7 additions & 0 deletions src/index/multi_index.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <QSharedPointer>
#include <QThreadPool>
#include <QString>
#include <vector>

#include "index.h"
#include "store/directory.h"
Expand All @@ -26,15 +27,21 @@ class MultiIndex {

QSharedPointer<Directory> dir() const { return m_dir; }

QStringList listIndexes();

bool indexExists(const QString &name);
QSharedPointer<Index> getRootIndex(bool create = false);
QSharedPointer<Index> getIndex(const QString &name, bool create = false);
void createRootIndex();
void createIndex(const QString &name);
void deleteIndex(const QString &name);


constexpr static const char* ROOT_INDEX_NAME = "_root";

private:
bool checkIndex(const QString &name);

QMutex m_mutex;
QSharedPointer<Directory> m_dir;
QMap<QString, QSharedPointer<Index>> m_indexes;
Expand Down
9 changes: 5 additions & 4 deletions src/server/grpc/proto/index.proto
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ package fpindex;

import "google/api/annotations.proto";

message IndexInfo {
message IndexStatus {
string name = 1;
bool ready = 2;
}

message GetAttributeRequest {
Expand Down Expand Up @@ -67,15 +68,15 @@ message GetIndexRequest {
};

message GetIndexResponse {
IndexInfo index = 1;
IndexStatus index = 1;
};

message CreateIndexRequest {
string index_name = 1;
};

message CreateIndexResponse {
IndexInfo index = 1;
IndexStatus index = 1;
};

message DeleteIndexRequest {
Expand All @@ -89,7 +90,7 @@ message ListIndexesRequest {
};

message ListIndexesResponse {
repeated IndexInfo indexes = 1;
repeated IndexStatus indexes = 1;
};

service Index {
Expand Down
11 changes: 11 additions & 0 deletions src/server/grpc/service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,17 @@ static inline int remainingTime(std::chrono::system_clock::time_point deadline)
return std::chrono::duration_cast<std::chrono::milliseconds>(deadline - std::chrono::system_clock::now()).count();
}

grpc::Status IndexServiceImpl::ListIndexes(grpc::ServerContext* context, const fpindex::ListIndexesRequest* request,
fpindex::ListIndexesResponse* response) {
qDebug() << "[gRPC] ListIndexes";
auto indexNames = m_indexes->listIndexes();
for (const auto& indexName : indexNames) {
auto status = response->add_indexes();
status->set_name(indexName.toStdString());
}
return grpc::Status::OK;
}

grpc::Status IndexServiceImpl::GetIndex(grpc::ServerContext* context, const fpindex::GetIndexRequest* request,
fpindex::GetIndexResponse* response) {
auto indexName = QString::fromStdString(request->index_name());
Expand Down
3 changes: 3 additions & 0 deletions src/server/grpc/service.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ class IndexServiceImpl final : public fpindex::Index::Service {
public:
IndexServiceImpl(QSharedPointer<MultiIndex> indexes, QSharedPointer<Metrics> metrics);

virtual ::grpc::Status ListIndexes(::grpc::ServerContext* context, const fpindex::ListIndexesRequest* request,
fpindex::ListIndexesResponse* response) override;

virtual ::grpc::Status GetIndex(::grpc::ServerContext* context, const fpindex::GetIndexRequest* request,
fpindex::GetIndexResponse* response) override;

Expand Down
66 changes: 66 additions & 0 deletions src/server/grpc/service_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#include <gtest/gtest.h>

#include "server/grpc/service.h"
#include "store/ram_directory.h"

using namespace Acoustid;
using namespace Acoustid::Server;

using namespace fpindex;

class IndexService : public ::testing::Test {
protected:
void SetUp() override {
dir = QSharedPointer<RAMDirectory>::create();
indexes = QSharedPointer<MultiIndex>::create(dir);
metrics = QSharedPointer<Metrics>::create();
service = QSharedPointer<IndexServiceImpl>::create(indexes, metrics);
}

void TearDown() override {}

protected:
QSharedPointer<RAMDirectory> dir;
QSharedPointer<MultiIndex> indexes;
QSharedPointer<Metrics> metrics;
QSharedPointer<IndexServiceImpl> service;
};

TEST_F(IndexService, ListIndexes_Empty) {
ListIndexesRequest request;
ListIndexesResponse response;
grpc::ServerContext context;

auto status = service->ListIndexes(&context, &request, &response);
EXPECT_TRUE(status.ok());
EXPECT_EQ(0, response.indexes_size());
}

TEST_F(IndexService, ListIndexes_OneIndex) {
ListIndexesRequest request;
ListIndexesResponse response;
grpc::ServerContext context;

indexes->createIndex("test");

auto status = service->ListIndexes(&context, &request, &response);
EXPECT_TRUE(status.ok());
EXPECT_EQ(1, response.indexes_size());
EXPECT_EQ("test", response.indexes(0).name());
}

TEST_F(IndexService, ListIndexes_LegacyIndex) {
ListIndexesRequest request;
ListIndexesResponse response;
grpc::ServerContext context;

indexes->createIndex("test");
indexes->createRootIndex();

auto status = service->ListIndexes(&context, &request, &response);
EXPECT_TRUE(status.ok());
EXPECT_EQ(2, response.indexes_size());
EXPECT_EQ(MultiIndex::ROOT_INDEX_NAME, response.indexes(0).name());
EXPECT_EQ("test", response.indexes(1).name());
}

1 change: 1 addition & 0 deletions src/store/directory.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class Directory {
virtual InputStream *openFile(const QString &name) = 0;
virtual void renameFile(const QString &oldName, const QString &newName) = 0;
virtual QStringList listFiles() = 0;
virtual QStringList listDirectories() = 0;
virtual bool fileExists(const QString &name);

virtual Directory *openDirectory(const QString &name) = 0;
Expand Down
6 changes: 6 additions & 0 deletions src/store/fs_directory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,12 @@ QStringList FSDirectory::listFiles() {
return dir.entryList(QStringList(), QDir::Files);
}

QStringList FSDirectory::listDirectories() {
QMutexLocker locker(&m_mutex);
QDir dir(m_path);
return dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
}

bool FSDirectory::fileExists(const QString &name) {
QMutexLocker locker(&m_mutex);
return QFile::exists(filePath(name));
Expand Down
1 change: 1 addition & 0 deletions src/store/fs_directory.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class FSDirectory : public Directory {
virtual InputStream *openFile(const QString &name);
virtual void renameFile(const QString &oldName, const QString &newName);
QStringList listFiles();
QStringList listDirectories();
bool fileExists(const QString &name);
virtual void sync(const QStringList &names);

Expand Down
4 changes: 4 additions & 0 deletions src/store/ram_directory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,7 @@ SQLiteDatabase RAMDirectory::openDatabase(const QString &name) {
auto fileName = QString("file:%1?mode=memory&cache=shared").arg(m_dbPrefix + name);
return SQLiteDatabase(fileName);
}

QStringList RAMDirectory::listDirectories() {
return m_data->directories.keys();
}
1 change: 1 addition & 0 deletions src/store/ram_directory.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class RAMDirectory : public Directory {
virtual InputStream *openFile(const QString &name);
virtual void renameFile(const QString &oldName, const QString &newName);
QStringList listFiles();
QStringList listDirectories();
bool fileExists(const QString &name);

virtual SQLiteDatabase openDatabase(const QString &name) override;
Expand Down

0 comments on commit 6ce116d

Please sign in to comment.