From ca2e86c650c6c75238d199090197af40d074a32c Mon Sep 17 00:00:00 2001 From: Egor Bitochkin <bigcubecat@yandex.ru> Date: Thu, 6 Feb 2025 17:03:24 +0000 Subject: [PATCH 1/5] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D0=BE=D0=B2?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clouddb/src/clouddb/CMakeLists.txt | 49 ++-- clouddb/src/clouddb/clouddb--1.0.sql | 140 +++++++++ clouddb/src/clouddb/clouddb.c | 2 +- clouddb/src/clouddb/cpp.cpp | 2 +- .../cas_transaction_command.cpp | 181 ++++++++++-- .../cas_transaction_command.h | 21 +- .../src/clouddb/facade/command/command.cpp | 35 ++- clouddb/src/clouddb/facade/command/command.h | 18 +- .../facade/command/itransaction_command.h | 15 +- .../cassandra_driver/cassandra_driver.cpp | 276 +++++++++++++----- .../cassandra_driver/cassandra_driver.h | 17 +- clouddb/src/clouddb/facade/drivers/idriver.h | 4 +- clouddb/src/clouddb/facade/query_builder.cpp | 136 ++++++++- clouddb/src/clouddb/facade/query_builder.h | 11 +- clouddb/src/clouddb/facade/session.cpp | 5 +- clouddb/src/clouddb/facade/utils/metadata.h | 1 + clouddb/src/clouddb/facade/utils/utils.cpp | 10 + clouddb/src/clouddb/facade/utils/utils.h | 9 + clouddb/src/clouddb/iam/iam.c | 47 +++ clouddb/src/clouddb/iam/iam.h | 53 ++++ clouddb/src/clouddb/tam/all_tam.h | 110 ++++++- .../src/clouddb/tam/include/index_scan_tam.h | 1 + clouddb/src/clouddb/tam/src/index_scan_tam.c | 48 ++- clouddb/src/clouddb/tam/src/mod_tuple_tam.c | 79 ++++- .../src/clouddb/tam/src/non_mod_tuple_tam.c | 5 +- clouddb/src/clouddb/tam/src/scan_func_tam.c | 5 +- clouddb/src/clouddb/utils/utils.c | 11 +- clouddb/src/clouddb/utils/utils.h | 1 + clouddb/test.sql | 13 +- test/test.sql | 157 +++++++++- 30 files changed, 1280 insertions(+), 182 deletions(-) create mode 100644 clouddb/src/clouddb/facade/utils/utils.cpp create mode 100644 clouddb/src/clouddb/facade/utils/utils.h create mode 100644 clouddb/src/clouddb/iam/iam.c create mode 100644 clouddb/src/clouddb/iam/iam.h diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt index 550a492057f..a92292c4226 100644 --- a/clouddb/src/clouddb/CMakeLists.txt +++ b/clouddb/src/clouddb/CMakeLists.txt @@ -1,30 +1,39 @@ -set(target_source facade/query_builder.cpp - utils/utils.c - facade/drivers/cassandra_driver/cassandra_driver.cpp - facade/session.cpp - facade/command/cassandra_command/cas_transaction_command.cpp - facade/command/command.cpp - tam/src/ddl_func_tam.c - tam/src/index_scan_tam.c - tam/src/misc_func_tam.c - tam/src/mod_tuple_tam.c - tam/src/non_mod_tuple_tam.c - tam/src/parallel_scan_tam.c - tam/src/scan_func_tam.c - tam/src/slot_func_tam.c - tam/tam.c - cpp.cpp - hooks/src/hook.c - clouddb.c) +set(cpp_sources + facade/query_builder.cpp + facade/drivers/cassandra_driver/cassandra_driver.cpp + facade/session.cpp + facade/command/cassandra_command/cas_transaction_command.cpp + facade/command/command.cpp + facade/utils/utils.cpp + cpp.cpp +) + +set(c_sources + utils/utils.c + tam/src/ddl_func_tam.c + tam/src/index_scan_tam.c + tam/src/misc_func_tam.c + tam/src/mod_tuple_tam.c + tam/src/non_mod_tuple_tam.c + tam/src/parallel_scan_tam.c + tam/src/scan_func_tam.c + tam/src/slot_func_tam.c + tam/tam.c + iam/iam.c + iam/src/scan_func_iam.c + iam/src/mod_func_iam.c + hooks/src/hook.c + clouddb.c +) add_postgresql_extension( clouddb VERSION 1.0 - SOURCES ${target_source} + SOURCES ${cpp_sources} ${c_sources} SCRIPTS clouddb--1.0.sql REGRESS basic ) link_directories("/usr/local/pgsql/lib/") -target_link_libraries(clouddb cassandra) +target_link_libraries(clouddb cassandra pq) \ No newline at end of file diff --git a/clouddb/src/clouddb/clouddb--1.0.sql b/clouddb/src/clouddb/clouddb--1.0.sql index 49e5f785e4f..44186934c38 100644 --- a/clouddb/src/clouddb/clouddb--1.0.sql +++ b/clouddb/src/clouddb/clouddb--1.0.sql @@ -15,3 +15,143 @@ LANGUAGE C STRICT; -- Register access method CREATE ACCESS METHOD clouddb TYPE TABLE HANDLER clouddb_table_handler; + +-- Create the SQL function +CREATE OR REPLACE FUNCTION clouddb_index_handler(internal) +RETURNS index_am_handler AS '$libdir/clouddb' +LANGUAGE C STRICT; + +-- Register access method +CREATE ACCESS METHOD clouddb_index TYPE INDEX HANDLER clouddb_index_handler; + + +-- Создаем операторный класс для типа данных integer +CREATE OPERATOR CLASS clouddb_integer_ops + DEFAULT FOR TYPE integer USING clouddb_index AS + OPERATOR 1 < (integer, integer), + OPERATOR 2 <= (integer, integer), + OPERATOR 3 = (integer, integer), + OPERATOR 4 >= (integer, integer), + OPERATOR 5 > (integer, integer); + +-- Создаем операторный класс для типа данных text +CREATE OPERATOR CLASS clouddb_text_ops + DEFAULT FOR TYPE text USING clouddb_index AS + OPERATOR 1 < (text, text), + OPERATOR 2 <= (text, text), + OPERATOR 3 = (text, text), + OPERATOR 4 >= (text, text), + OPERATOR 5 > (text, text); + +-- Создаем операторный класс для типа данных smallint +CREATE OPERATOR CLASS clouddb_smallint_ops + DEFAULT FOR TYPE smallint USING clouddb_index AS + OPERATOR 1 < (smallint, smallint), + OPERATOR 2 <= (smallint, smallint), + OPERATOR 3 = (smallint, smallint), + OPERATOR 4 >= (smallint, smallint), + OPERATOR 5 > (smallint, smallint); + +-- Создаем операторный класс для типа данных bigint +CREATE OPERATOR CLASS clouddb_bigint_ops + DEFAULT FOR TYPE bigint USING clouddb_index AS + OPERATOR 1 < (bigint, bigint), + OPERATOR 2 <= (bigint, bigint), + OPERATOR 3 = (bigint, bigint), + OPERATOR 4 >= (bigint, bigint), + OPERATOR 5 > (bigint, bigint); + +-- Создаем операторный класс для типа данных real +CREATE OPERATOR CLASS clouddb_real_ops + DEFAULT FOR TYPE real USING clouddb_index AS + OPERATOR 1 < (real, real), + OPERATOR 2 <= (real, real), + OPERATOR 3 = (real, real), + OPERATOR 4 >= (real, real), + OPERATOR 5 > (real, real); + +-- Создаем операторный класс для типа данных double precision +CREATE OPERATOR CLASS clouddb_double_precision_ops + DEFAULT FOR TYPE double precision USING clouddb_index AS + OPERATOR 1 < (double precision, double precision), + OPERATOR 2 <= (double precision, double precision), + OPERATOR 3 = (double precision, double precision), + OPERATOR 4 >= (double precision, double precision), + OPERATOR 5 > (double precision, double precision); + +-- Создаем операторный класс для типа данных date +CREATE OPERATOR CLASS clouddb_date_ops + DEFAULT FOR TYPE date USING clouddb_index AS + OPERATOR 1 < (date, date), + OPERATOR 2 <= (date, date), + OPERATOR 3 = (date, date), + OPERATOR 4 >= (date, date), + OPERATOR 5 > (date, date); + +-- Создаем операторный класс для типа данных date +CREATE OPERATOR CLASS clouddb_boolean_ops + DEFAULT FOR TYPE boolean USING clouddb_index AS + OPERATOR 1 = (boolean, boolean); + +-- Создаем операторный класс для типа данных timestamp +CREATE OPERATOR CLASS clouddb_timestamp_ops + DEFAULT FOR TYPE timestamp USING clouddb_index AS + OPERATOR 1 < (timestamp, timestamp), + OPERATOR 2 <= (timestamp, timestamp), + OPERATOR 3 = (timestamp, timestamp), + OPERATOR 4 >= (timestamp, timestamp), + OPERATOR 5 > (timestamp, timestamp); + +-- Создаем операторный класс для типа данных char +CREATE OPERATOR CLASS clouddb_char_ops + DEFAULT FOR TYPE char USING clouddb_index AS + OPERATOR 1 < (char, char), + OPERATOR 2 <= (char, char), + OPERATOR 3 = (char, char), + OPERATOR 4 >= (char, char), + OPERATOR 5 > (char, char); + +-- Создаем операторный класс для типа данных bytea +CREATE OPERATOR CLASS clouddb_bytea_ops + DEFAULT FOR TYPE bytea USING clouddb_index AS + OPERATOR 1 < (bytea, bytea), + OPERATOR 2 <= (bytea, bytea), + OPERATOR 3 = (bytea, bytea), + OPERATOR 4 >= (bytea, bytea), + OPERATOR 5 > (bytea, bytea); + +-- Создаем операторный класс для типа данных bit +CREATE OPERATOR CLASS bit_ops + DEFAULT FOR TYPE bit USING clouddb_index AS + OPERATOR 1 < (bit, bit), + OPERATOR 2 <= (bit, bit), + OPERATOR 3 = (bit, bit), + OPERATOR 4 >= (bit, bit), + OPERATOR 5 > (bit, bit); + +-- Создаем операторный класс для типа данных bit varying +CREATE OPERATOR CLASS bit_varying_ops + DEFAULT FOR TYPE bit varying USING clouddb_index AS + OPERATOR 1 < (bit varying, bit varying), + OPERATOR 2 <= (bit varying, bit varying), + OPERATOR 3 = (bit varying, bit varying), + OPERATOR 4 >= (bit varying, bit varying), + OPERATOR 5 > (bit varying, bit varying); + +-- Создаем операторный класс для типа данных numeric +CREATE OPERATOR CLASS numeric_ops + DEFAULT FOR TYPE numeric USING clouddb_index AS + OPERATOR 1 < (numeric, numeric), + OPERATOR 2 <= (numeric, numeric), + OPERATOR 3 = (numeric, numeric), + OPERATOR 4 >= (numeric, numeric), + OPERATOR 5 > (numeric, numeric); + +-- Создаем операторный класс для типа данных time +CREATE OPERATOR CLASS time_ops + DEFAULT FOR TYPE time USING clouddb_index AS + OPERATOR 1 < (time, time), + OPERATOR 2 <= (time, time), + OPERATOR 3 = (time, time), + OPERATOR 4 >= (time, time), + OPERATOR 5 > (time, time); \ No newline at end of file diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c index 338d3f7f8b4..e0627b75b50 100644 --- a/clouddb/src/clouddb/clouddb.c +++ b/clouddb/src/clouddb/clouddb.c @@ -14,7 +14,7 @@ void _PG_init() { char *m = "hello"; some *some2 = &(some){.message = 6}; some2 = create_class(some2); - printf("%d\n", getInClass(some2)); + // printf("%d\n", getInClass(some2)); hook_init(); } diff --git a/clouddb/src/clouddb/cpp.cpp b/clouddb/src/clouddb/cpp.cpp index 202641f15c8..37703b5295e 100644 --- a/clouddb/src/clouddb/cpp.cpp +++ b/clouddb/src/clouddb/cpp.cpp @@ -11,7 +11,7 @@ char *some::getMessa() { return this->messa; } EXPORT_C some *create_class(some *some2) { some some1; - std::cout << ((struct some_copy *)(some2))->message << "\n"; + // std::cout << ((struct some_copy *)(some2))->message << "\n"; some2 = &some1; return some2; } diff --git a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp index 18c2e2554cf..a5e3aee27ec 100644 --- a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp +++ b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp @@ -1,4 +1,7 @@ #include "cas_transaction_command.h" +#include "../command.h" + +#include "../../../utils/utils.h" #include <access/xact.h> #include <utils/rel.h> @@ -7,6 +10,7 @@ #include <iostream> #include <memory> + namespace { std::vector<std::string> convertToVector(char **charArray, int size) { std::vector<std::string> result; @@ -38,7 +42,12 @@ int CasTransactionCommand::execute() { if (this->operation == CREATE_TABLE) { driver->execCqlQuery(this->builder.buildCreateTable( this->tableName, this->fieldName, this->driver->getKeyspace())); - } else if (this->operation == INSERT_VALUE) { + } + else if (this->operation == CREATE_TABLE_INDEX) { + driver->execCqlQuery(this->builder.buildCreateTableIndex( + this->tableName, this->fieldName, this->driver->getKeyspace())); + } + else if (this->operation == INSERT_VALUE) { // 9 всего полей для заполнения метаданными, 8 поля tuple + метаданные без // key_name driver->execCqlQuery( @@ -46,17 +55,30 @@ int CasTransactionCommand::execute() { this->fieldName, this->fieldName.size() + 8), this->fieldData, this->fieldSize, this->metadata, this->fieldName.size() + 9); - } else if (this->operation == BEGIN_SCAN) { + } + else if (this->operation == INSERT_INDEX_VALUE) { + // 9 всего полей для заполнения метаданными, 8 поля tuple + метаданные без + // key_name + driver->execCqlQueryIndex( + this->builder.buildInsertIndex(driver->getKeyspace(), this->tableName, + this->fieldName, this->fieldName.size() + 9), + this->fieldData, this->fieldSize, this->metadata, + this->fieldName.size() + 10); + } + else if (this->operation == BEGIN_SCAN) { driver->beginScan(relation, snapshot, nkeys, key, parallel_scan, flags, id); - } else if (this->operation == SELECT_DATA) { - return driver->selectData(snapshot); - } else if (this->operation == DELETE_SLOT) { + } + else if (this->operation == SELECT_DATA) { + return driver->selectData(snapshot, this->metadataCount); + } + else if (this->operation == DELETE_SLOT) { driver->execCqlQuery( - this->builder.buildDeleteSlot(driver->getKeyspace(), this->tableName), + this->builder.buildDeleteSlot(driver->getKeyspace(), this->tableName, this->isIndex), this->metadata, 4); - } else if (this->operation == UPDATE_SLOT) { + } + else if (this->operation == UPDATE_SLOT) { driver->execCqlQuery( - this->builder.buildDeleteSlot(driver->getKeyspace(), this->tableName), + this->builder.buildDeleteSlot(driver->getKeyspace(), this->tableName, this->isIndex), this->metadata, 4); this->metadata.xmax = 0; this->metadata.xmax_commited = false; @@ -66,15 +88,18 @@ int CasTransactionCommand::execute() { this->fieldName, this->fieldName.size() + 8), this->fieldData, this->fieldSize, this->metadata, this->fieldName.size() + 9); - } else if (this->operation == VACUUM_TABLE) { + } + else if (this->operation == VACUUM_TABLE) { CassFuture *future = driver->execCqlQueryWithRes(this->builder.buildSelectVacuum( driver->getKeyspace(), this->tableName, this->id)); driver->vacuum(this->tableName, future, this->tableName, this->id); - } else if (this->operation == DROP_TABLE) { + } + else if (this->operation == DROP_TABLE) { driver->execCqlQuery( this->builder.buildDropTable(driver->getKeyspace(), this->tableName)); - } else if (this->operation == TRUNCATE_TABLE) { + } + else if (this->operation == TRUNCATE_TABLE) { driver->execCqlQuery(this->builder.buildTruncateTable(driver->getKeyspace(), this->tableName)); } @@ -101,6 +126,18 @@ ITransactionCommand *CasTransactionCommand::createCreateTableCommand( return this; } +ITransactionCommand *CasTransactionCommand::createCreateTableIndexCommand( + Session *session, Relation rel) { + this->operation = CREATE_TABLE_INDEX; + + this->tableName = std::string(RelationGetRelationName(rel)); + for (int i = 0; i < RelationGetNumberOfAttributes(rel); i++) { + Form_pg_attribute attr = TupleDescAttr(rel->rd_att, i); + this->fieldName.push_back(strdup(NameStr(attr->attname))); + } + return this; +} + ITransactionCommand *CasTransactionCommand::createInsertCommand( Session *session, Relation relation, TupleTableSlot *slot, CommandId cid, int options, BulkInsertState bistate) { @@ -111,7 +148,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation)); int *fieldSize = (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation)); - // std::cout << "size: " << RelationGetNumberOfAttributes(relation) << std::endl; TupleDesc desc = slot->tts_tupleDescriptor; for (int i = 0; i < desc->natts; i++) { @@ -134,7 +170,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( this->operation = INSERT_VALUE; this->tableName = RelationGetRelationName(relation); - // std::cout << this->tableName << " tableName" << std::endl; this->fieldData = convertToVector(fieldData, RelationGetNumberOfAttributes(relation)); free(fieldData); @@ -149,8 +184,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver()); slot->tts_tid = driver->getNewPointer( std::string(RelationGetRelationName(relation)), driver->getKeyspace()); - // std::cout << slot->tts_tid.ip_blkid.bi_hi << slot->tts_tid.ip_blkid.bi_lo - // << slot->tts_tid.ip_posid << std::endl; this->metadata.xmin = GetCurrentTransactionId(); this->metadata.xmin_commited = true; @@ -159,6 +192,66 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( return this; } +ITransactionCommand *CasTransactionCommand::createInsertIndexCommand(Session *session, + Relation index, + Datum *values, + bool *isnull, + ItemPointer ht_ctid, + Relation heapRel, + struct IndexInfo *indexInfo) { + TupleDesc tupdesc = RelationGetDescr(index); + int len = tupdesc->natts; + + char **fieldData = + (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(index)); + int *fieldSize = + (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(index)); + + for (int i = 0; i < len; i++) { + if (isnull[i]) { + fieldData[i] = NULL; + fieldSize[i] = -1; + continue; + } + Oid outFunc; + bool typIsVarlena; + Form_pg_attribute attr = TupleDescAttr(index->rd_att, i); + // Получаем функцию вывода для типа данных + getTypeOutputInfo(attr->atttypid, &outFunc, &typIsVarlena); + // Преобразуем значение РІ строку + fieldData[i] = + OidOutputFunctionCall(outFunc, values[i]); + fieldSize[i] = strlen(fieldData[i]); + this->fieldName.push_back(strdup(NameStr(attr->attname))); + } + this->operation = INSERT_INDEX_VALUE; + + this->tableName = RelationGetRelationName(index); + this->fieldData = + convertToVector(fieldData, RelationGetNumberOfAttributes(index)); + free(fieldData); + this->fieldSize = + convertToVector(fieldSize, RelationGetNumberOfAttributes(index)); + free(fieldSize); + + // for (int i = 0; i < RelationGetNumberOfAttributes(index); i++) { + // Form_pg_attribute attr = TupleDescAttr(index->rd_att, i); + // this->fieldName.push_back(strdup(NameStr(attr->attname))); + // } + + auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver()); + auto ctid = driver->getNewPointer( + std::string(RelationGetRelationName(index)), driver->getKeyspace()); + + this->metadata.xmin = GetCurrentTransactionId(); + this->metadata.xmin_commited = true; + this->metadata.ctid = ctid; + this->metadata.t_ctid = ctid; + this->metadata.ref_tid = *ht_ctid; + + return this; +} + ITransactionCommand *CasTransactionCommand::beginScanCommand( Session *session, Relation relation, Snapshot snapshot, int nkeys, struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags, @@ -175,8 +268,9 @@ ITransactionCommand *CasTransactionCommand::beginScanCommand( } ITransactionCommand *CasTransactionCommand::selectDataCommand( - Session *session, Snapshot snapshot) { + Session *session, Snapshot snapshot, size_t metadataCount) { this->snapshot = snapshot; + this->metadataCount = metadataCount; this->operation = SELECT_DATA; return this; } @@ -184,7 +278,7 @@ ITransactionCommand *CasTransactionCommand::selectDataCommand( ITransactionCommand *CasTransactionCommand::createDeleteSlotCommand( Session *session, TransactionId id, ItemPointer newtid, Relation relation, ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, - bool wait, TM_FailureData *tmfd, bool changingPart) { + bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex) { this->operation = DELETE_SLOT; this->metadata.xmax = id; this->metadata.mask.set(5); @@ -195,6 +289,54 @@ ITransactionCommand *CasTransactionCommand::createDeleteSlotCommand( this->metadata.mask.set(6); this->tableName = RelationGetRelationName(relation); + this->isIndex = isIndex; + return this; +} + +ITransactionCommand *CasTransactionCommand::update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, + Relation heapRelation) { + size_t len = indexInfo->ii_NumIndexAttrs; + char **fieldData = + (char **)malloc(sizeof(char *) * len); + int *fieldSize = + (int *)malloc(sizeof(int) * len); + + for (int i = 0; i < len; i++) { + if (slot->tts_isnull[i]) { + fieldData[i] = NULL; + fieldSize[i] = -1; + continue; + } + Oid outFunc; + bool typIsVarlena; + Form_pg_attribute attr = TupleDescAttr(heapRelation->rd_att, (indexInfo->ii_IndexAttrNumbers)[i] - 1); + // Получаем функцию вывода для типа данных + getTypeOutputInfo(attr->atttypid, &outFunc, &typIsVarlena); + // Преобразуем значение РІ строку + fieldData[i] = OidOutputFunctionCall(outFunc, slot->tts_values[(indexInfo->ii_IndexAttrNumbers)[i] - 1]); + fieldSize[i] = strlen(fieldData[i]); + this->fieldName.push_back(strdup(NameStr(attr->attname))); + } + + this->operation = INSERT_INDEX_VALUE; + this->tableName = RelationGetRelationName(indexRelation); + this->fieldData = + convertToVector(fieldData, len); + free(fieldData); + this->fieldSize = + convertToVector(fieldSize, len); + free(fieldSize); + + auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver()); + auto ctid = driver->getNewPointer( + std::string(RelationGetRelationName(indexRelation)), driver->getKeyspace()); + + this->metadata.xmin = GetCurrentTransactionId(); + this->metadata.xmin_commited = true; + this->metadata.ctid = ctid; + this->metadata.t_ctid = ctid; + this->metadata.ref_tid = slot->tts_tid; + return this; } @@ -207,7 +349,6 @@ ITransactionCommand *CasTransactionCommand::createUpdateSlotCommand( (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation)); int *fieldSize = (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation)); - // std::cout << "size: " << RelationGetNumberOfAttributes(relation) << std::endl; TupleDesc desc = slot->tts_tupleDescriptor; for (int i = 0; i < desc->natts; i++) { @@ -247,11 +388,13 @@ ITransactionCommand *CasTransactionCommand::createUpdateSlotCommand( auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver()); this->metadata.t_ctid = driver->getNewPointer( std::string(RelationGetRelationName(relation)), driver->getKeyspace()); + slot->tts_tid = this->metadata.t_ctid; this->metadata.mask.set(1); this->metadata.xmax_commited = true; this->metadata.mask.set(6); this->tableName = RelationGetRelationName(relation); + return this; } @@ -276,4 +419,4 @@ ITransactionCommand *CasTransactionCommand::createTruncateTable( this->operation = TRUNCATE_TABLE; this->tableName = std::string(relName); return this; -} +} \ No newline at end of file diff --git a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.h b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.h index cf1658d867b..1873e273fcb 100644 --- a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.h +++ b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.h @@ -18,7 +18,9 @@ enum TransactionOperation { UPDATE_SLOT, VACUUM_TABLE, TRUNCATE_TABLE, - DROP_TABLE + DROP_TABLE, + INSERT_INDEX_VALUE, + CREATE_TABLE_INDEX }; class CasTransactionCommand : public ITransactionCommand { @@ -31,6 +33,8 @@ class CasTransactionCommand : public ITransactionCommand { TransactionOperation operation; std::shared_ptr<CassandraDriver> driver; Metadata metadata; + size_t metadataCount; + bool isIndex = false; // scan data Relation relation; @@ -47,10 +51,19 @@ class CasTransactionCommand : public ITransactionCommand { int execute() override; ITransactionCommand *createCreateTableCommand(Session *session, Relation rel) override; + ITransactionCommand *createCreateTableIndexCommand(Session *session, + Relation rel) override; ITransactionCommand *createInsertCommand(Session *session, Relation relation, TupleTableSlot *slot, CommandId cid, int options, BulkInsertState bistate) override; + ITransactionCommand *createInsertIndexCommand(Session *session, + Relation index, + Datum *values, + bool *isnull, + ItemPointer ht_ctid, + Relation heapRel, + struct IndexInfo *indexInfo) override; ITransactionCommand *beginScanCommand(Session *session, Relation relation, Snapshot snapshot, int nkeys, struct ScanKeyData *key, @@ -58,12 +71,12 @@ class CasTransactionCommand : public ITransactionCommand { uint32 flags, TransactionId id) override; ITransactionCommand *selectDataCommand(Session *session, - Snapshot snapshot) override; + Snapshot snapshot, size_t metadataCount) override; ITransactionCommand *createDeleteSlotCommand( Session *session, TransactionId id, ItemPointer newtid, Relation relation, ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, - bool wait, TM_FailureData *tmfd, bool changingPart) override; + bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex) override; ITransactionCommand *createUpdateSlotCommand( Session *session, TransactionId id, Relation relation, ItemPointer otid, @@ -80,6 +93,8 @@ class CasTransactionCommand : public ITransactionCommand { ITransactionCommand *createTruncateTable(Session *session, char *relName) override; + ITransactionCommand *update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, + Relation heapRelation) override; }; #endif // !__cplusplus diff --git a/clouddb/src/clouddb/facade/command/command.cpp b/clouddb/src/clouddb/facade/command/command.cpp index 8292d556057..4f2a1095e94 100644 --- a/clouddb/src/clouddb/facade/command/command.cpp +++ b/clouddb/src/clouddb/facade/command/command.cpp @@ -9,7 +9,6 @@ ITransactionCommand *createTransactionCommand(std::shared_ptr<IDriver> driver) { // return YDBTransactionCommand( // std::dynamic_pointer_cast<YDBDriver>(driver)); // } - return nullptr; } @@ -20,6 +19,13 @@ EXPORT_C ITransactionCommand *createCreateTableCommand(Session *session, return command; } +EXPORT_C ITransactionCommand *createCreateTableIndexCommand(Session *session, + Relation rel) { + ITransactionCommand *command = createTransactionCommand(session->getDriver()); + command = command->createCreateTableIndexCommand(session, rel); + return command; +} + EXPORT_C ITransactionCommand *createInsertCommand(Session *session, Relation relation, TupleTableSlot *slot, @@ -31,6 +37,18 @@ EXPORT_C ITransactionCommand *createInsertCommand(Session *session, return command; } +EXPORT_C ITransactionCommand *createInsertIndexCommand(Session *session, + Relation index, + Datum *values, + bool *isnull, + ItemPointer ht_ctid, + Relation heapRel, + struct IndexInfo *indexInfo) { + ITransactionCommand *command = createTransactionCommand(session->getDriver()); + command = command->createInsertIndexCommand(session, index, values, isnull, ht_ctid, heapRel, indexInfo); + return command; +} + EXPORT_C ITransactionCommand *beginScanCommand( Session *session, Relation relation, Snapshot snapshot, int nkeys, struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags, @@ -42,20 +60,20 @@ EXPORT_C ITransactionCommand *beginScanCommand( } EXPORT_C ITransactionCommand *selectDataCommand(Session *session, - Snapshot snapshot) { + Snapshot snapshot, size_t metadataCount) { ITransactionCommand *command = createTransactionCommand(session->getDriver()); - command = command->selectDataCommand(session, snapshot); + command = command->selectDataCommand(session, snapshot, metadataCount); return command; } EXPORT_C ITransactionCommand *createDeleteSlotCommand( Session *session, TransactionId id, ItemPointer newtid, Relation relation, ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, - bool wait, TM_FailureData *tmfd, bool changingPart) { + bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex) { ITransactionCommand *command = createTransactionCommand(session->getDriver()); command = command->createDeleteSlotCommand(session, id, newtid, relation, tid, cid, snapshot, crosscheck, wait, - tmfd, changingPart); + tmfd, changingPart, isIndex); return command; } @@ -92,3 +110,10 @@ EXPORT_C ITransactionCommand *createTruncateTable(Session *session, command = command->createTruncateTable(session, relName); return command; } + +EXPORT_C ITransactionCommand *update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, + Relation heapRelation) { + ITransactionCommand *command = createTransactionCommand(session->getDriver()); + command = command->update_tuple_to_index(session, slot, indexInfo, indexRelation, heapRelation); + return command; +} \ No newline at end of file diff --git a/clouddb/src/clouddb/facade/command/command.h b/clouddb/src/clouddb/facade/command/command.h index 0cf2c840db8..4e9a8d2c28c 100644 --- a/clouddb/src/clouddb/facade/command/command.h +++ b/clouddb/src/clouddb/facade/command/command.h @@ -20,11 +20,21 @@ ITransactionCommand *createTransactionCommand(std::shared_ptr<IDriver> driver); EXPORT_C ITransactionCommand *createCreateTableCommand(Session *session, Relation rel); +EXPORT_C ITransactionCommand *createCreateTableIndexCommand(Session *session, + Relation rel); + EXPORT_C ITransactionCommand *createInsertCommand(Session *session, Relation relation, TupleTableSlot *slot, CommandId cid, int options, BulkInsertState bistate); +EXPORT_C ITransactionCommand *createInsertIndexCommand(Session *session, + Relation index, + Datum *values, + bool *isnull, + ItemPointer ht_ctid, + Relation heapRel, + struct IndexInfo *indexInfo); EXPORT_C ITransactionCommand *beginScanCommand( Session *session, Relation relation, Snapshot snapshot, int nkeys, @@ -32,12 +42,12 @@ EXPORT_C ITransactionCommand *beginScanCommand( TransactionId id); EXPORT_C ITransactionCommand *selectDataCommand(Session *session, - Snapshot snapshot); + Snapshot snapshot, size_t metadataCount); EXPORT_C ITransactionCommand *createDeleteSlotCommand( Session *session, TransactionId id, ItemPointer newtid, Relation relation, ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, - bool wait, TM_FailureData *tmfd, bool changingPart); + bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex); EXPORT_C ITransactionCommand *createUpdateSlotCommand( Session *session, TransactionId id, Relation relation, ItemPointer otid, @@ -53,5 +63,7 @@ EXPORT_C ITransactionCommand *createDropTable(Session *session, char *relName); EXPORT_C ITransactionCommand *createTruncateTable(Session *session, char *relName); +EXPORT_C ITransactionCommand *update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, + Relation heapRelation); -#endif +#endif \ No newline at end of file diff --git a/clouddb/src/clouddb/facade/command/itransaction_command.h b/clouddb/src/clouddb/facade/command/itransaction_command.h index 43770ecba27..4c3a01fa452 100644 --- a/clouddb/src/clouddb/facade/command/itransaction_command.h +++ b/clouddb/src/clouddb/facade/command/itransaction_command.h @@ -24,23 +24,32 @@ class ITransactionCommand : public ICommand { // field fil) = 0; virtual ITransactionCommand *createCreateTableCommand(Session *session, Relation rel) = 0; + virtual ITransactionCommand *createCreateTableIndexCommand(Session *session, + Relation rel) = 0; virtual ITransactionCommand *createInsertCommand(Session *session, Relation relation, TupleTableSlot *slot, CommandId cid, int options, BulkInsertState bistate) = 0; + virtual ITransactionCommand *createInsertIndexCommand(Session *session, + Relation index, + Datum *values, + bool *isnull, + ItemPointer ht_ctid, + Relation heapRel, + struct IndexInfo *indexInfo) = 0; virtual ITransactionCommand *beginScanCommand( Session *session, Relation relation, Snapshot snapshot, int nkeys, struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags, TransactionId id) = 0; virtual ITransactionCommand *selectDataCommand(Session *session, - Snapshot snapshot) = 0; + Snapshot snapshot, size_t metadataCount) = 0; virtual ITransactionCommand *createDeleteSlotCommand( Session *session, TransactionId id, ItemPointer newtid, Relation relation, ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, - bool wait, TM_FailureData *tmfd, bool changingPart) = 0; + bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex) = 0; virtual ITransactionCommand *createUpdateSlotCommand( Session *session, TransactionId id, Relation relation, ItemPointer otid, @@ -57,6 +66,8 @@ class ITransactionCommand : public ICommand { virtual ITransactionCommand *createTruncateTable(Session *session, char *relName) = 0; + virtual ITransactionCommand *update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, + Relation heapRelation) = 0; }; #else diff --git a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp index 3f602931171..acfbbc26379 100644 --- a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp +++ b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp @@ -8,6 +8,7 @@ #include <cstring> #include <iostream> #include <unordered_map> +#include <cstdio> namespace { union convert { @@ -20,26 +21,48 @@ void bindMetadataInStatement(CassStatement *statement, Metadata metadata, convert data = {.data = metadata.t_ctid}; cass_statement_bind_bytes(statement, 0, (cass_byte_t *)data.a, 6); cass_statement_bind_uint32(statement, start, metadata.state); - // cass_statement_bind_uint32(statement, start, 10); cass_statement_bind_uint32(statement, start + 1, metadata.xmin); - // cass_statement_bind_uint32(statement, start + 1, 11); cass_statement_bind_bool(statement, start + 2, (cass_bool_t)metadata.xmin_commited); - // cass_statement_bind_bool(statement, start + 2, (cass_bool_t)1); cass_statement_bind_bool(statement, start + 3, (cass_bool_t)metadata.xmin_aborted); - // cass_statement_bind_bool(statement, start + 3, (cass_bool_t)1); cass_statement_bind_uint32(statement, start + 4, metadata.xmax); - // cass_statement_bind_uint32(statement, start + 4, 12); cass_statement_bind_bool(statement, start + 5, (cass_bool_t)metadata.xmax_commited); - // cass_statement_bind_bool(statement, start + 5, (cass_bool_t)1); cass_statement_bind_bool(statement, start + 6, (cass_bool_t)metadata.xmax_aborted); - // cass_statement_bind_bool(statement, start + 6, (cass_bool_t)1); + + cass_statement_bind_bytes( + statement, start + 7, + (cass_byte_t *)data.a, // TODO: Рто ТОЧНО будет работать? + 6); +} + +void bindMetadataInStatementWithIndex(CassStatement *statement, Metadata metadata, + int start) { + convert data = {.data = metadata.t_ctid}; + cass_statement_bind_bytes(statement, 0, (cass_byte_t *)data.a, 6); + + convert data_ref = {.data = metadata.ref_tid}; + cass_statement_bind_bytes(statement, 1, (cass_byte_t *)data_ref.a, 6); + + cass_statement_bind_uint32(statement, start, metadata.state); + + cass_statement_bind_uint32(statement, start + 1, metadata.xmin); + + cass_statement_bind_bool(statement, start + 2, + (cass_bool_t)metadata.xmin_commited); + cass_statement_bind_bool(statement, start + 3, + (cass_bool_t)metadata.xmin_aborted); + cass_statement_bind_uint32(statement, start + 4, metadata.xmax); + + cass_statement_bind_bool(statement, start + 5, + (cass_bool_t)metadata.xmax_commited); + cass_statement_bind_bool(statement, start + 6, + (cass_bool_t)metadata.xmax_aborted); cass_statement_bind_bytes( statement, start + 7, @@ -58,39 +81,32 @@ void bindPartMetadataInStatement(CassStatement *statement, Metadata metadata) { cass_statement_bind_bytes(statement, i, (cass_byte_t *)data.a, 6); i++; } - // cass_statement_bind_uint32(statement, start, 10); if (metadata.mask.test(2)) { cass_statement_bind_uint32(statement, i, metadata.xmin); i++; } - // cass_statement_bind_uint32(statement, start + 1, 11); if (metadata.mask.test(3)) { cass_statement_bind_bool(statement, i, (cass_bool_t)metadata.xmin_commited); i++; } - // cass_statement_bind_bool(statement, start + 2, (cass_bool_t)1); if (metadata.mask.test(4)) { cass_statement_bind_bool(statement, i, (cass_bool_t)metadata.xmin_aborted); i++; } - // cass_statement_bind_bool(statement, start + 3, (cass_bool_t)1); if (metadata.mask.test(5)) { cass_statement_bind_uint32(statement, i, metadata.xmax); i++; } - // cass_statement_bind_uint32(statement, start + 4, 12); if (metadata.mask.test(6)) { cass_statement_bind_bool(statement, i, (cass_bool_t)metadata.xmax_commited); i++; } - // cass_statement_bind_bool(statement, start + 5, (cass_bool_t)1); if (metadata.mask.test(7)) { cass_statement_bind_bool(statement, i, (cass_bool_t)metadata.xmax_aborted); i++; } - // cass_statement_bind_bool(statement, start + 6, (cass_bool_t)1); if (metadata.mask.test(8)) { cass_statement_bind_bytes( @@ -135,7 +151,6 @@ CassandraDriver::CassandraDriver( std::string query = this->builder.buildKeyspace(this->keyspace, this->replicationFactor); - // std::cout << query << std::endl; execCqlQuery(query); } @@ -163,14 +178,9 @@ void CassandraDriver::execCqlQuery(std::string query, Metadata metadata, int var) { CassError rc = CASS_OK; CassFuture *future = NULL; - // std::cout << query << std::endl; - // std::cout << metadata.mask << std::endl; CassStatement *statement = cass_statement_new(query.data(), var); convert data = {.data = metadata.ctid}; - // std::cout << metadata.t_ctid.ip_blkid.bi_hi << " " - // << metadata.t_ctid.ip_blkid.bi_lo << " " << - // metadata.t_ctid.ip_posid - // << std::endl; + cass_statement_bind_bytes(statement, var - 1, (cass_byte_t *)data.a, 6); bindPartMetadataInStatement(statement, metadata); @@ -194,13 +204,10 @@ void CassandraDriver::execCqlQuery(std::string query, CassError rc = CASS_OK; CassFuture *future = NULL; CassStatement *statement = cass_statement_new(query.data(), var); - // std::cout << "\n\n\n"; for (int i = 0; i < fields.size(); ++i) { char *a = const_cast<char *>(fields[i].c_str()); convert b; strncpy(b.a, a, 6); - // std::cout << b.data.ip_blkid.bi_hi << " " << b.data.ip_blkid.bi_lo << " " - // << b.data.ip_posid << " vlaue" << std::endl; cass_statement_bind_bytes(statement, i, (const cass_byte_t *)fields[i].c_str(), 6); @@ -228,11 +235,8 @@ void CassandraDriver::execCqlQuery(std::string query, CassError rc = CASS_OK; CassFuture *future = NULL; CassStatement *statement = cass_statement_new(query.data(), var); - // std::cout << query << std::endl; - // std::cout << fieldData.size() << std::endl; for (int i = 0; i < fieldData.size(); ++i) { - // std::cout << fieldData[i] << " vlaue" << std::endl; if (fieldData[i] == "") { cass_statement_bind_null(statement, i + 1); continue; @@ -259,6 +263,41 @@ void CassandraDriver::execCqlQuery(std::string query, cass_statement_free(statement); } +void CassandraDriver::execCqlQueryIndex(std::string query, + std::vector<std::string> fieldData, + std::vector<size_t> fieldSize, + Metadata metadata, int var) { + CassError rc = CASS_OK; + CassFuture *future = NULL; + CassStatement *statement = cass_statement_new(query.data(), var); + + for (int i = 0; i < fieldData.size(); ++i) { + if (fieldData[i] == "") { + cass_statement_bind_null(statement, i + 2); + continue; + } + + cass_statement_bind_bytes(statement, i + 2, + (const cass_byte_t *)fieldData[i].c_str(), + fieldSize[i]); + } + bindMetadataInStatementWithIndex(statement, metadata, fieldData.size() + 2); + + future = cass_session_execute(this->sessionPtr, statement); + // cass_future_wait(future); + + // rc = cass_future_error_code(future); + // if (rc != CASS_OK) { + // const char *message; + // size_t message_length; + // cass_future_error_message(future, &message, &message_length); + // std::cerr << "Connection error: " << std::string(message, message_length) + // << std::endl; + // } + cass_future_free(future); + cass_statement_free(statement); +} + CassFuture *CassandraDriver::execCqlQueryWithRes(std::string query) { CassError rc = CASS_OK; CassFuture *future = NULL; @@ -286,7 +325,7 @@ ItemPointerData CassandraDriver::getNewPointer(std::string tableName, if (data.ip_posid < UINT16_MAX) { data.ip_posid++; } else { - data.ip_posid = 1; + // data.ip_posid = 0; if (data.ip_blkid.bi_lo < UINT16_MAX) { data.ip_blkid.bi_lo++; } else { @@ -310,7 +349,6 @@ ItemPointerData CassandraDriver::getLastPointer(const std::string &tableName, } std::string query = builder.buildGetLastPointer(key, tableName); - // std::cout << "query last pointer: " << query << std::endl; CassFuture *future = execCqlQueryWithRes(query); ItemPointerData last = {}; @@ -346,13 +384,11 @@ void CassandraDriver::beginScan(Relation relation, Snapshot snapshot, int nkeys, ParallelTableScanDesc parallel_scan, uint32 flags, TransactionId id) { this->iterator.current.fieldNames.clear(); - // this->iterator.current.fieldNames; + for (int i = 0; i < RelationGetNumberOfAttributes(relation); i++) { Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i); this->iterator.current.fieldNames.push_back(NameStr(attr->attname)); } - // std::cout << "begin scan: " << this->iterator.current.fieldNames.size() - // << std::endl; std::string query = builder.buildSelectAll( keyspace, std::string(RelationGetRelationName(relation)), id); @@ -376,14 +412,13 @@ int inVisibilityArea(Metadata metadata, Snapshot snapshot, int64_t id) { return true; } -CassError loadMetadata(CassRow *row, Metadata &metadata) { +CassError loadMetadata(const CassRow *row, Metadata &metadata) { CassError error = CASS_OK; cass_bool_t tmpBool; error = cass_value_get_bool(cass_row_get_column_by_name(row, "xmax_aborted"), &tmpBool); if (error != CASS_OK) { - // pgLog(WARNING, "cannot read xmax_aborted"); } else { metadata.xmax_aborted = tmpBool; } @@ -391,7 +426,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) { error = cass_value_get_bool(cass_row_get_column_by_name(row, "xmin_aborted"), &tmpBool); if (error != CASS_OK) { - // pgLog(WARNING, "cannot read xmin_aborted"); } else { metadata.xmin_aborted = tmpBool; } @@ -399,7 +433,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) { error = cass_value_get_bool(cass_row_get_column_by_name(row, "xmin_commited"), &tmpBool); if (error != CASS_OK) { - // pgLog(WARNING, "cannot read xmin_commited"); } else { metadata.xmin_commited = tmpBool; } @@ -407,7 +440,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) { error = cass_value_get_bool(cass_row_get_column_by_name(row, "xmax_commited"), &tmpBool); if (error != CASS_OK) { - // pgLog(WARNING, "cannot read xmax_commited"); } else { metadata.xmax_commited = tmpBool; } @@ -416,7 +448,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) { error = cass_value_get_int32(cass_row_get_column_by_name(row, "state"), &tmpInt); if (error != CASS_OK) { - // pgLog(WARNING, "cannot read state %d", error); } else { metadata.state = tmpInt; } @@ -424,7 +455,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) { error = cass_value_get_int32(cass_row_get_column_by_name(row, "xmin"), &tmpInt); if (error != CASS_OK) { - // pgLog(WARNING, "cannot read xmin %d", error); } else { metadata.xmin = tmpInt; } @@ -432,57 +462,59 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) { error = cass_value_get_int32(cass_row_get_column_by_name(row, "xmax"), &tmpInt); if (error != CASS_OK) { - // pgLog(WARNING, "cannot read xmax %d", error); } else { metadata.xmax = tmpInt; } const cass_byte_t *bytes; size_t size; - error = cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"), + error = cass_value_get_bytes(cass_row_get_column_by_name(row, KEY_NAME), &bytes, &size); if (error != CASS_OK) { - // pgLog(WARNING, "cannot read ItemPointerData"); } else { convert data; memcpy(&data, bytes, sizeof(data)); metadata.ctid = data.data; } + error = cass_value_get_bytes(cass_row_get_column_by_name(row, REF_NAME), + &bytes, &size); + if (error != CASS_OK) { + } else { + convert data; + memcpy(&data, bytes, sizeof(data)); + metadata.ref_tid = data.data; + } + error = cass_value_get_bytes(cass_row_get_column_by_name(row, "t_ctid"), &bytes, &size); if (error != CASS_OK) { - // pgLog(WARNING, "cannot read ItemPointerData"); } else { convert data; memcpy(&data, bytes, sizeof(data)); metadata.t_ctid = data.data; } - // if (size != KEY_SIZE) { - // // pgLog(WARNING, "invalid key size: %ld", size); - // } return CASS_OK; } -int CassandraDriver::selectData(Snapshot snapshot) { +int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) { if (cass_iterator_next(this->iterator.iter)) { CassRow *row = const_cast<CassRow *>(cass_iterator_get_row(this->iterator.iter)); CassError error = loadMetadata(row, metadata); - // std::cout << metadata.xmin << " " << metadata.xmax << " select" - // << std::endl; - if (!inVisibilityArea(metadata, snapshot, ReadNextTransactionId() - 1)) { - return selectData(snapshot); // надо пофиксить - } + this->iterator.row.value.clear(); this->iterator.row.size.clear(); + if (!inVisibilityArea(metadata, snapshot, ReadNextTransactionId() - 1) || row == NULL) { + return selectData(snapshot, metadataCount); // надо пофиксить + } + size_t size; - for (int i = 0; i < this->iterator.columnCount - 9; i++) { - const cass_byte_t *bytes; - const CassValue *casValue = cass_row_get_column_by_name( - row, this->iterator.current.fieldNames[i].data()); - if (cass_value_is_null(casValue)) { + for (int i = 0; i + metadataCount < this->iterator.columnCount; i++) { + const cass_byte_t *bytes; + const CassValue *casValue = cass_row_get_column_by_name(row, this->iterator.current.fieldNames[i].data()); + if (cass_value_is_null(casValue)) { this->iterator.row.value.push_back(NULL); this->iterator.row.size.push_back(-1); continue; @@ -491,12 +523,7 @@ int CassandraDriver::selectData(Snapshot snapshot) { cass_value_get_bytes(casValue, &bytes, &size); this->iterator.row.value.push_back(bytes); this->iterator.row.size.push_back(size); - } - const cass_byte_t *bytes; - cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"), &bytes, - &size); - // std::cout << "select data: " << this->iterator.row.value[0] << " " - // << this->iterator.row.size.size() << std::endl; + } return 1; } return 0; @@ -506,11 +533,16 @@ char **CassandraDriver::getValue() { char **res = (char **)malloc(sizeof(char *) * this->iterator.row.value.size()); for (int i = 0; i < this->iterator.row.value.size(); i++) { - res[i] = const_cast<char *>( + if (this->iterator.row.value[i] == NULL) { + res[i] = NULL; + } + else { + res[i] = const_cast<char *>( reinterpret_cast<const char *>(this->iterator.row.value[i])); + } } - this->iterator.row.value.clear(); - this->iterator.row.size.clear(); + // this->iterator.row.value.clear(); + // this->iterator.row.size.clear(); return res; } @@ -522,10 +554,18 @@ ItemPointerData CassandraDriver::getTid() { return metadata.t_ctid; } +ItemPointerData CassandraDriver::getRefTid() { + return metadata.ref_tid; +} + ItemPointerData getTidForScan(IDriver *driver) { return driver->getTid(); } +ItemPointerData getRefTidForScan(IDriver* driver) { + return driver->getRefTid(); +} + void CassandraDriver::vacuum(std::string query, CassFuture *future, std::string tableName, TransactionId id) { this->iterator.res = cass_future_get_result(future); @@ -542,10 +582,9 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future, CassRow *row = const_cast<CassRow *>(cass_iterator_get_row(this->iterator.iter)); loadMetadata(row, metadata); - cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"), &bytes, + cass_value_get_bytes(cass_row_get_column_by_name(row, KEY_NAME), &bytes, &size); - // std::cout << metadata.xmax << " xmax metadata and id - " << id - // << std::endl; + if (metadata.xmax == 0) { continue; } @@ -568,20 +607,105 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future, if (keysInBatch > 0) { std::vector<std::string> keysV; for (int i = 0; i < keysInBatch; i++) { - // std::cout << keys[i].data.ip_blkid.bi_hi << " " - // << keys[i].data.ip_blkid.bi_lo << " " << - // keys[i].data.ip_posid - // << std::endl; keysV.emplace_back(keys[i].a, 6); char *a = const_cast<char *>(keysV[i].c_str()); convert b; memcpy(b.a, a, 6); - // std::cout << b.data.ip_blkid.bi_hi << " " << b.data.ip_blkid.bi_lo << " - // " - // << b.data.ip_posid << std::endl; } execCqlQuery(builder.buildDropTuple(keyspace, tableName, keysInBatch), keysV, keysInBatch); } } + + +const CassRow* CassandraDriver::getRow(const char *tableName, ItemPointer tid) { + convert utid = {.data = *tid}; + std::string query = this->builder.buildGetRow(this->getKeyspace(), tableName); + + CassStatement* statement = cass_statement_new(query.data(), 1); + + cass_statement_bind_bytes(statement, 0, (cass_byte_t*)utid.a, 6); + + CassFuture *future = cass_session_execute(this->sessionPtr, statement); + cass_future_wait(future); + // Проверяем успешность выполнения запроса + CassError rc = cass_future_error_code(future); + if (rc != CASS_OK) { + const char *message; + size_t message_length; + cass_future_error_message(future, &message, &message_length); + std::cerr << "Connection error: " << std::string(message, message_length) + << std::endl; + return NULL; + } + + if (cass_future_error_code(future) == CASS_OK) { + // Получение результата + const CassResult* result = cass_future_get_result(future); + const CassRow* row = cass_result_first_row(result); + return row; + } + cass_future_free(future); + cass_statement_free(statement); + return NULL; +} + +bool CassandraDriver::getVisibleValueRowArray(ItemPointer tid, const char *tableName, TupleDesc tupdesc, unsigned char** values, + unsigned char* nulls, Snapshot snapshot, TransactionId transactionId) { + unsigned char** values_d = (unsigned char**)this->getValue(); + + if (values_d == NULL) return false; + + int index = 0; + + for (int i = 0; i < tupdesc->natts; i++) { + char *column_name = NameStr(tupdesc->attrs[i].attname); + + if (index < this->iterator.current.fieldNames.size() && strcmp(this->iterator.current.fieldNames[index].data(), column_name) == 0) { + auto c = values_d[index]; + values[i] = (unsigned char*)malloc(this->iterator.current.fieldNames[index].length() + 1); + strcpy((char*)values[i], (char*)c); + index++; + nulls[i] = 0; + } + else { + values[i] = NULL; + nulls[i] = 1; + } + + // const CassRow *row = getRow(tableName, tid); + // if (row == NULL) return false; + + // Metadata metadata; + // CassError error = loadMetadata(row, metadata); + // if (!inVisibilityArea(metadata, snapshot, transactionId)) { + // return false; + // } + + // for (int i = 0; i < tupdesc->natts; i++) { + // char *column_name = NameStr(tupdesc->attrs[i].attname); + + // size_t size; + // const cass_byte_t *bytes; + // const CassValue *casValue = cass_row_get_column_by_name(row, column_name); + + // if (cass_value_is_null(casValue)) { + // values[i] = NULL; + // nulls[i] = 1; + // continue; + // } + + // cass_value_get_bytes(casValue, &bytes, &size); + + // values[i] = (unsigned char*)malloc(size + 1); + // memcpy(values[i], bytes, size); + // values[i][size] = '\0'; + // nulls[i] = 0; + // } + // return true; + + } + return true; +} + diff --git a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.h b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.h index 3ec434775bb..315e2a623cd 100644 --- a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.h +++ b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.h @@ -65,25 +65,40 @@ class CassandraDriver : public IDriver { ~CassandraDriver() override = default; CassandraDriver(std::unordered_map<std::string, std::string> config); void execCqlQuery(std::string query); + void execCqlQuery(std::string query, Metadata metadata, int var); + void execCqlQuery(std::string query, std::vector<std::string> fields, int var); + void execCqlQuery(std::string query, std::vector<std::string> fieldData, std::vector<size_t> fieldSize, Metadata metadata, int var); + + void execCqlQueryIndex(std::string query, std::vector<std::string> fieldData, + std::vector<size_t> fieldSize, Metadata metadata, int var); + CassFuture *execCqlQueryWithRes(std::string query); + std::string getKeyspace() { return this->keyspace; } + ItemPointerData getNewPointer(std::string tableName, std::string key); void beginScan(Relation relation, Snapshot snapshot, int nkeys, struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags, TransactionId id) override; - int selectData(Snapshot snapshot) override; + int selectData(Snapshot snapshot, size_t metadataCount) override; + char **getValue() override; ItemPointerData getTid() override; + ItemPointerData getRefTid() override; + void vacuum(std::string query, CassFuture *future, std::string tableName, TransactionId id); friend char **getValueForScan(IDriver *driver); friend ItemPointerData getTidForScan(IDriver *driver); + const CassRow* getRow(const char *tableName, ItemPointer tid); + bool getVisibleValueRowArray(ItemPointer tid, const char *tableName, TupleDesc tupdesc, unsigned char** values, + unsigned char* nulls, Snapshot snapshot, TransactionId transactionId); }; #endif // diff --git a/clouddb/src/clouddb/facade/drivers/idriver.h b/clouddb/src/clouddb/facade/drivers/idriver.h index 78eb3b56314..e5a2b85270f 100644 --- a/clouddb/src/clouddb/facade/drivers/idriver.h +++ b/clouddb/src/clouddb/facade/drivers/idriver.h @@ -27,9 +27,10 @@ class IDriver { struct ScanKeyData* key, ParallelTableScanDesc parallel_scan, uint32 flags, TransactionId id) = 0; - virtual int selectData(Snapshot snapshot) = 0; + virtual int selectData(Snapshot snapshot, size_t metadataCount) = 0; virtual char** getValue() = 0; virtual ItemPointerData getTid() = 0; + virtual ItemPointerData getRefTid() = 0; }; #else typedef struct IDriver IDriver; @@ -37,5 +38,6 @@ typedef struct IDriver IDriver; EXPORT_C char** getValueForScan(IDriver* driver); EXPORT_C ItemPointerData getTidForScan(IDriver* driver); +EXPORT_C ItemPointerData getRefTidForScan(IDriver* driver); #endif // !IDRIVER_H diff --git a/clouddb/src/clouddb/facade/query_builder.cpp b/clouddb/src/clouddb/facade/query_builder.cpp index 51674489527..d969304ef4a 100644 --- a/clouddb/src/clouddb/facade/query_builder.cpp +++ b/clouddb/src/clouddb/facade/query_builder.cpp @@ -12,8 +12,6 @@ std::string CassandraBuilder::buildKeyspace(std::string keyspace, dest += "'replication_factor': '"; dest += std::to_string(replication_factor); dest += "' };"; - - // std::cout << dest << std::endl; return dest; } @@ -26,7 +24,7 @@ std::string CassandraBuilder::buildCreateTable( query += "."; query += tableName; query += " ("; - query += "key_name"; + query += KEY_NAME; query += " blob, "; for (auto &field : fieldName) { query += field; @@ -50,10 +48,49 @@ std::string CassandraBuilder::buildCreateTable( query += " blob, "; query += " PRIMARY KEY ("; - query += "key_name"; + query += KEY_NAME; query += ") );"; - // std::cout << query << std::endl; + return query; +} + +std::string CassandraBuilder::buildCreateTableIndex( + std::string tableName, std::vector<std::string> fieldName, + std::string keyspace) { + std::string query = ""; + query += "CREATE TABLE "; + query += keyspace; + query += "."; + query += tableName; + query += " ("; + query += KEY_NAME; + query += " blob, "; + query += REF_NAME; + query += " blob, "; + for (auto &field : fieldName) { + query += field; + query += " blob, "; + } + query += "state"; + query += " int, "; + query += "xmin"; + query += " int, "; + query += "xmin_commited"; + query += " boolean, "; + query += "xmin_aborted"; + query += " boolean, "; + query += "xmax"; + query += " int, "; + query += "xmax_commited"; + query += " boolean, "; + query += "xmax_aborted"; + query += " boolean, "; + query += "t_ctid"; + query += " blob, "; + + query += " PRIMARY KEY ("; + query += REF_NAME; + query += ") );"; return query; } @@ -61,12 +98,13 @@ std::string CassandraBuilder::buildGetLastPointer(std::string key, std::string tableName) { std::string query = ""; query += "SELECT MAX("; - query += "key_name"; + query += KEY_NAME; query += ") FROM "; query += key; query += "."; query += tableName; query += ";"; + // std::cout << query << std::endl; return query; } @@ -74,10 +112,11 @@ std::string CassandraBuilder::buildGetLastPointer(std::string key, std::string CassandraBuilder::buildMaxKey() { std::string query = ""; query += "system.max("; - query += "key_name"; + query += KEY_NAME; query += ")"; // std::cout << query << std::endl; + return query; } @@ -91,7 +130,52 @@ std::string CassandraBuilder::buildInsert(std::string keyspace, query += "."; query += tableName; query += " ("; - query += "key_name"; + query += KEY_NAME; + query += ", "; + for (auto field : fieldNames) { + query += field; + query += ", "; + } + query += "state"; + query += ", "; + query += "xmin"; + query += ", "; + query += "xmin_commited"; + query += ", "; + query += "xmin_aborted"; + query += ", "; + query += "xmax"; + query += ", "; + query += "xmax_commited"; + query += ", "; + query += "xmax_aborted"; + query += ", "; + query += "t_ctid"; + query += " ) VALUES ("; + for (int i = 0; i < var; i++) { + query += "?, "; + } + query += "?);"; + + // std::cout << query << std::endl; + + return query; +} + + +std::string CassandraBuilder::buildInsertIndex(std::string keyspace, + std::string tableName, + std::vector<std::string> fieldNames, + int var) { + std::string query = ""; + query += "INSERT INTO "; + query += keyspace; + query += "."; + query += tableName; + query += " ("; + query += KEY_NAME; + query += ", "; + query += REF_NAME; query += ", "; for (auto field : fieldNames) { query += field; @@ -119,6 +203,7 @@ std::string CassandraBuilder::buildInsert(std::string keyspace, query += "?);"; // std::cout << query << std::endl; + return query; } @@ -135,12 +220,14 @@ std::string CassandraBuilder::buildSelectAll(std::string keyspace, query += " <= "; query += std::to_string(id); query += " ALLOW FILTERING;"; - std::cout << query << std::endl; + + // std::cout << query << std::endl; + return query; } std::string CassandraBuilder::buildDeleteSlot(std::string keyspace, - std::string tableName) { + std::string tableName, bool isIndex) { std::string query = ""; query += "UPDATE "; query += keyspace; @@ -154,8 +241,12 @@ std::string CassandraBuilder::buildDeleteSlot(std::string keyspace, query += "xmax_commited"; query += " = ? "; query += " WHERE "; - query += "key_name"; + if (isIndex) query += REF_NAME; + else query += KEY_NAME; query += " = ?;"; + + // std::cout << query << std::endl; + return query; } @@ -163,7 +254,7 @@ std::string CassandraBuilder::buildSelectVacuum(std::string keyspace, std::string tableName, int id) { std::string query = ""; query += "SELECT "; - query += "key_name"; + query += KEY_NAME; query += ", "; query += "xmax"; query += " FROM "; @@ -177,6 +268,9 @@ std::string CassandraBuilder::buildSelectVacuum(std::string keyspace, query += " AND "; query += "xmax"; query += " > 0 ALLOW FILTERING;"; + + // std::cout << query << std::endl; + return query; } @@ -187,11 +281,15 @@ std::string CassandraBuilder::buildDropTuple(std::string keyspace, query += keyspace; query += "."; query += tableName; - query += " WHERE key_name IN ("; + query += " WHERE "; + query += KEY_NAME; + query += " IN ("; for (int i = 0; i < count - 1; i++) { query += "?, "; } query += "? );"; + + // std::cout << query << std::endl; return query; } @@ -203,6 +301,18 @@ std::string CassandraBuilder::buildDropTable(std::string keyspace, query += "."; query += tableName; query += ";"; + // std::cout << query << std::endl; + return query; +} + +std::string CassandraBuilder::buildGetRow(std::string keyspace, std::string tableName) { + std::string query = "SELECT * FROM "; + query += keyspace; + query += "."; + query += tableName; + query += " WHERE "; + query += KEY_NAME; + query += " = ?;"; return query; } diff --git a/clouddb/src/clouddb/facade/query_builder.h b/clouddb/src/clouddb/facade/query_builder.h index c8a8d699c42..d0b9181f09d 100644 --- a/clouddb/src/clouddb/facade/query_builder.h +++ b/clouddb/src/clouddb/facade/query_builder.h @@ -5,6 +5,9 @@ #include <string> #include <vector> +#define KEY_NAME "key_name" +#define REF_NAME "ref_name" + class IQueryBuilder { public: // necessary crud @@ -33,14 +36,19 @@ class CassandraBuilder { std::string buildCreateTable(std::string tableName, std::vector<std::string> fieldName, std::string keyspace); + std::string buildCreateTableIndex(std::string tableName, + std::vector<std::string> fieldName, + std::string keyspace); std::string buildGetLastPointer(std::string key, std::string tableName); std::string buildMaxKey(); std::string buildInsert(std::string keyspace, std::string tableName, std::vector<std::string> fieldNames, int var); + std::string buildInsertIndex(std::string keyspace, std::string tableName, + std::vector<std::string> fieldNames, int var); std::string buildSelectAll(std::string keyspace, std::string tableName, unsigned int id); - std::string buildDeleteSlot(std::string keyspace, std::string tableName); + std::string buildDeleteSlot(std::string keyspace, std::string tableName, bool isIndex); std::string buildSelectVacuum(std::string keyspace, std::string tableName, int id); @@ -49,6 +57,7 @@ class CassandraBuilder { std::string buildDropTable(std::string keyspace, std::string tableName); std::string buildTruncateTable(std::string keyspace, std::string tableName); + std::string buildGetRow(std::string keyspace, std::string tableName); }; #endif diff --git a/clouddb/src/clouddb/facade/session.cpp b/clouddb/src/clouddb/facade/session.cpp index 5938c8dac63..6216efe3d40 100644 --- a/clouddb/src/clouddb/facade/session.cpp +++ b/clouddb/src/clouddb/facade/session.cpp @@ -13,7 +13,8 @@ std::unordered_map<std::string, std::string> parseConfig(char **config) { map["driver"] = config[0]; return map; } -} // namespace +} +// namespace Session::Session(std::unordered_map<std::string, std::string> config) { if (config["driver"] == "cassandra") { @@ -51,4 +52,4 @@ EXPORT_C int executeCommand(Session *session, ICommand *command) { EXPORT_C IDriver *getDriver(Session *session) { return session->getDriver().get(); -} +} \ No newline at end of file diff --git a/clouddb/src/clouddb/facade/utils/metadata.h b/clouddb/src/clouddb/facade/utils/metadata.h index e7b427c169b..4ae018cae0c 100644 --- a/clouddb/src/clouddb/facade/utils/metadata.h +++ b/clouddb/src/clouddb/facade/utils/metadata.h @@ -28,6 +28,7 @@ class Metadata { bool xmax_commited; bool xmax_aborted; ItemPointerData ctid; + ItemPointerData ref_tid; std::bitset<9> mask; }; diff --git a/clouddb/src/clouddb/facade/utils/utils.cpp b/clouddb/src/clouddb/facade/utils/utils.cpp new file mode 100644 index 00000000000..29bf7df889a --- /dev/null +++ b/clouddb/src/clouddb/facade/utils/utils.cpp @@ -0,0 +1,10 @@ +#include "utils.h" + +EXPORT_C bool getVisibleValueRows(ItemPointer tid, const char *tableName, TupleDesc tupdesc, unsigned char** values, + unsigned char* nulls, Snapshot snapshot, TransactionId transactionId) { + Session *session = getSessionInstance(NULL); + auto driver = std::dynamic_pointer_cast<CassandraDriver>(session->getDriver()); + + return driver->getVisibleValueRowArray(tid, tableName, tupdesc, values, + nulls, snapshot, transactionId); +} \ No newline at end of file diff --git a/clouddb/src/clouddb/facade/utils/utils.h b/clouddb/src/clouddb/facade/utils/utils.h new file mode 100644 index 00000000000..d2e647d45f4 --- /dev/null +++ b/clouddb/src/clouddb/facade/utils/utils.h @@ -0,0 +1,9 @@ +#ifndef UTILSCPP_H +#define UTILSCPP_H + +#include "../../tam/all_tam.h" + +EXPORT_C bool getVisibleValueRows(ItemPointer tid, const char *tableName, TupleDesc tupdesc, unsigned char** values, + unsigned char* nulls, Snapshot snapshot, TransactionId transactionId); + +#endif \ No newline at end of file diff --git a/clouddb/src/clouddb/iam/iam.c b/clouddb/src/clouddb/iam/iam.c new file mode 100644 index 00000000000..a67098309c4 --- /dev/null +++ b/clouddb/src/clouddb/iam/iam.c @@ -0,0 +1,47 @@ +#include "include/scan_func_iam.h" +#include "include/mod_func_iam.h" + +PG_FUNCTION_INFO_V1(clouddb_index_handler); + +Datum clouddb_index_handler(PG_FUNCTION_ARGS) { + IndexAmRoutine *clouddb_methods_index = makeNode(IndexAmRoutine); + clouddb_methods_index->type = T_IndexAmRoutine; + + clouddb_methods_index->amcanorder = false; + clouddb_methods_index->amcanorderbyop = false; + clouddb_methods_index->amcanbackward = false; + clouddb_methods_index->amcanmulticol = true; + + clouddb_methods_index->ambuild = clouddb_ambuild; + clouddb_methods_index->ambuildempty = clouddb_ambuildempty; + clouddb_methods_index->aminsert = clouddb_aminsert; + clouddb_methods_index->ambeginscan = clouddb_ambeginscan; + clouddb_methods_index->amrescan = clouddb_amrescan; + clouddb_methods_index->amgettuple = clouddb_amgettuple; + clouddb_methods_index->amgetbitmap = clouddb_amgetbitmap; + clouddb_methods_index->amendscan = clouddb_amendscan; + clouddb_methods_index->ammarkpos = clouddb_ammarkpos; + clouddb_methods_index->amrestrpos = clouddb_amrestrpos; + clouddb_methods_index->ambulkdelete = clouddb_ambulkdelete; + clouddb_methods_index->amvacuumcleanup = clouddb_amvacuumcleanup_v2; + clouddb_methods_index->amcanreturn = clouddb_amcanreturn; + clouddb_methods_index->amcostestimate = clouddb_amcostestimate; + clouddb_methods_index->amoptions = clouddb_amoptions; + + char *host = GetConfigOption("cassandra.host", false, false); + char *keyspace = GetConfigOption("cassandra.keyspace", false, false); + char *replicationFactor = + GetConfigOption("cassandra.replication_factor", false, false); + + char **config = (char **)malloc(sizeof(char *) * 7); + config[0] = "cassandra"; + config[1] = "cassandra.host"; + config[2] = host; + config[3] = "cassandra.keyspace"; + config[4] = keyspace; + config[5] = "cassandra.replication_factor"; + config[6] = replicationFactor; + Session *session = getSessionInstance(config); + + PG_RETURN_POINTER(clouddb_methods_index); +} diff --git a/clouddb/src/clouddb/iam/iam.h b/clouddb/src/clouddb/iam/iam.h new file mode 100644 index 00000000000..28c90f81d7c --- /dev/null +++ b/clouddb/src/clouddb/iam/iam.h @@ -0,0 +1,53 @@ +#ifndef IAM_H +#define IAM_H + +#include "../tam/include/scan_func_tam.h" + +#include <postgres.h> + +#include "access/amapi.h" +#include "access/genam.h" +#include "access/relscan.h" +#include "catalog/index.h" +#include "catalog/pg_type.h" +#include "commands/vacuum.h" +#include "miscadmin.h" +#include "storage/bufmgr.h" +#include "utils/memutils.h" +#include "nodes/pathnodes.h" + +#include <access/heapam.h> +#include <access/htup_details.h> +#include <access/relation.h> +#include <access/tableam.h> +#include <cassandra.h> +#include <catalog/index.h> +#include <commands/vacuum.h> +#include <executor/executor.h> +#include <executor/spi.h> +#include <executor/tuptable.h> +#include <fmgr.h> +#include <miscadmin.h> +#include <nodes/execnodes.h> +#include <postmaster/bgworker.h> +#include <postmaster/interrupt.h> +#include <stdlib.h> +#include <storage/ipc.h> +#include <storage/lwlock.h> +#include <storage/shmem.h> +#include <string.h> +#include <tcop/tcopprot.h> +#include <utils/builtins.h> +#include <utils/guc.h> +#include <utils/lsyscache.h> +#include <utils/rel.h> /* ... and relations */ +#include <utils/snapmgr.h> +#include "access/amapi.h" + +/*! + * Структура, содержащая ссылки РЅР° access methods для clouddb + */ +// static IndexAmRoutine clouddb_methods_index; +extern const IndexAmRoutine clouddb_methods_index; + +#endif diff --git a/clouddb/src/clouddb/tam/all_tam.h b/clouddb/src/clouddb/tam/all_tam.h index 33b466c366b..43134944a91 100644 --- a/clouddb/src/clouddb/tam/all_tam.h +++ b/clouddb/src/clouddb/tam/all_tam.h @@ -16,6 +16,114 @@ #include "../facade/command/command.h" #include "../utils/utils.h" +#include "access/hio.h" +#include "access/multixact.h" +#include "access/relscan.h" +#include "access/sysattr.h" +#include "access/transam.h" +#include "access/valid.h" +#include "access/visibilitymap.h" +#include "access/xact.h" +#include "access/xlogutils.h" +#include "catalog/catalog.h" +#include "catalog/namespace.h" +#include "miscadmin.h" +#include "pgstat.h" +#include "storage/bufmgr.h" +#include "storage/freespace.h" +#include "storage/lmgr.h" +#include "storage/procarray.h" +#include "storage/smgr.h" +#include "storage/standby.h" +#include "utils/datum.h" +#include "utils/inval.h" +#include "utils/snapmgr.h" +#include "utils/syscache.h" + + +#include "access/genam.h" +#include "access/table.h" +#include "catalog/indexing.h" +#include "catalog/objectaddress.h" +#include "catalog/pg_description.h" +#include "catalog/pg_shdescription.h" +#include "commands/comment.h" +#include "commands/dbcommands.h" +#include "utils/fmgroids.h" +#include "catalog/pg_index.h" +#include "catalog/pg_class.h" +#include "catalog/pg_namespace.h" +#include "utils/relcache.h" +#include "utils/varbit.h" +#include "commands/sequence.h" + + +#include <access/heapam.h> +#include <access/htup_details.h> +#include <access/relation.h> +#include <access/tableam.h> +#include <cassandra.h> +#include <catalog/index.h> +#include <commands/vacuum.h> +#include <executor/executor.h> +#include <executor/spi.h> +#include <executor/tuptable.h> +#include <fmgr.h> +#include <miscadmin.h> +#include <nodes/execnodes.h> +#include <postmaster/bgworker.h> +#include <postmaster/interrupt.h> +#include <stdlib.h> +#include <storage/ipc.h> +#include <storage/lwlock.h> +#include <storage/shmem.h> +#include <string.h> +#include <tcop/tcopprot.h> +#include <utils/builtins.h> +#include <utils/guc.h> +#include <utils/lsyscache.h> +#include <utils/rel.h> /* ... and relations */ +#include <utils/snapmgr.h> + +#include "access/amapi.h" +#include "access/genam.h" +#include "access/relscan.h" +#include "catalog/index.h" +#include "catalog/pg_type.h" +#include "commands/vacuum.h" +#include "miscadmin.h" +#include "storage/bufmgr.h" +#include "utils/memutils.h" +#include "nodes/pathnodes.h" + +#include <access/heapam.h> +#include <access/htup_details.h> +#include <access/relation.h> +#include <access/tableam.h> +#include <cassandra.h> +#include <catalog/index.h> +#include <commands/vacuum.h> +#include <executor/executor.h> +#include <executor/spi.h> +#include <executor/tuptable.h> +#include <fmgr.h> +#include <miscadmin.h> +#include <nodes/execnodes.h> +#include <postmaster/bgworker.h> +#include <postmaster/interrupt.h> +#include <stdlib.h> +#include <storage/ipc.h> +#include <storage/lwlock.h> +#include <storage/shmem.h> +#include <string.h> +#include <tcop/tcopprot.h> +#include <utils/builtins.h> +#include <utils/guc.h> +#include <utils/lsyscache.h> +#include <utils/rel.h> /* ... and relations */ +#include <utils/snapmgr.h> +#include "access/amapi.h" + extern const TableAmRoutine clouddb_methods; -#endif // ALL_TAM_H +#endif diff --git a/clouddb/src/clouddb/tam/include/index_scan_tam.h b/clouddb/src/clouddb/tam/include/index_scan_tam.h index 9e1f2d4f070..ee9fafc9395 100644 --- a/clouddb/src/clouddb/tam/include/index_scan_tam.h +++ b/clouddb/src/clouddb/tam/include/index_scan_tam.h @@ -2,6 +2,7 @@ #define INDEX_SCAN_TAM_H #include "../all_tam.h" +#include "../../facade/utils/utils.h" IndexFetchTableData *clouddb_index_fetch_begin(Relation rel); void clouddb_index_fetch_reset(IndexFetchTableData *scan); diff --git a/clouddb/src/clouddb/tam/src/index_scan_tam.c b/clouddb/src/clouddb/tam/src/index_scan_tam.c index 71b6bf2e397..419e155888c 100644 --- a/clouddb/src/clouddb/tam/src/index_scan_tam.c +++ b/clouddb/src/clouddb/tam/src/index_scan_tam.c @@ -1,7 +1,9 @@ #include "../include/index_scan_tam.h" IndexFetchTableData *clouddb_index_fetch_begin(Relation rel) { - return NULL; + IndexFetchTableData* scan = (IndexFetchTableData*)malloc(sizeof(IndexFetchTableData)); + scan->rel = rel; + return scan; } void clouddb_index_fetch_reset(IndexFetchTableData *scan) {} @@ -12,5 +14,47 @@ bool clouddb_index_fetch_tuple(struct IndexFetchTableData *scan, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot, bool *call_again, bool *all_dead) { - return false; + ExecClearTuple(slot); + + TupleDesc tupdesc = RelationGetDescr(scan->rel); + + unsigned char** values = malloc(sizeof(unsigned char*) * tupdesc->natts); + unsigned char* nulls = malloc(tupdesc->natts); + + /* + + Важно допущение! + + Учитывая особенности работы СЃ кассандрой, возвращаются только значения столбцов, являющихся индексируемыми. + Рто сделано РёР· соображений, что РїСЂРё переходе РёР· РѕРґРЅРѕР№ таблицы РІ РґСЂСѓРіСѓСЋ для проверки видимости(это нужно, РєРѕРіРґР° запрашиваем данные + РЅРµ имеются РІ индексной таблице), тратится время, значительно больше, чем РїСЂРё последовательном сканировании. + Р’ таком сценарии использование индексов РЅРµ имеет смысл. + + РџСЂРё работе СЃ кассандрой для оптимальной работы нужно создавать РґСЂСѓРіРѕР№ индекс СЃ нужными столбцами или использовать последовательное сканирование. + + РџСЂРё работе СЃ РґСЂСѓРіРёРј хранилищем, реализация должна отличаться - нужна другая структура хранения индексов(РЅРµ таблица). + + */ + + if(!getVisibleValueRows(tid, NameStr(scan->rel->rd_rel->relname), tupdesc, values, nulls, snapshot, GetCurrentTransactionId())) { + return false; + } + + for (int i = 0; i < tupdesc->natts; i++) { + if (values[i] == NULL) { + slot->tts_values[i] = (Datum)0; + slot->tts_isnull[i] = true; + continue; + } + Oid func; + Oid typioparam; + Form_pg_attribute attr = TupleDescAttr(tupdesc, i); + getTypeInputInfo(attr->atttypid, &func, &typioparam); + slot->tts_values[i] = + OidInputFunctionCall(func, values[i], typioparam, 0); + slot->tts_isnull[i] = false; + } + + ExecStoreVirtualTuple(slot); + return true; } diff --git a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c index 3659f505b82..4a7c40cf7a8 100644 --- a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c +++ b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c @@ -7,8 +7,6 @@ void clouddb_tuple_insert(Relation relation, TupleTableSlot *slot, Session *session = getSessionInstance(NULL); executeCommand(session, createInsertCommand(session, relation, slot, cid, options, bistate)); - // printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo, - // slot->tts_tid.ip_blkid.bi_hi); } void clouddb_tuple_insert_speculative(Relation relation, TupleTableSlot *slot, @@ -22,7 +20,6 @@ void clouddb_tuple_complete_speculative(Relation relation, TupleTableSlot *slot, void clouddb_multi_insert(Relation relation, TupleTableSlot **slots, int ntuples, CommandId cid, int options, BulkInsertState bistate) { - printf("multi_insert\n"); } TM_Result clouddb_tuple_delete(Relation relation, ItemPointer tid, @@ -34,11 +31,84 @@ TM_Result clouddb_tuple_delete(Relation relation, ItemPointer tid, int status = executeCommand( session, createDeleteSlotCommand(session, id, NULL, relation, tid, cid, snapshot, - crosscheck, wait, tmfd, changingPart)); + crosscheck, wait, tmfd, changingPart, false)); + + ///////////////////////////////// + Oid relid = RelationGetRelid(relation); + + // Получаем кортежи индексов для данной таблицы + HeapTuple indexTuple; + Relation pg_index_rel = table_open(IndexRelationId, AccessShareLock); + char* tt = RelationGetRelationName(pg_index_rel); + + ScanKeyData key; + SysScanDesc scan; + int numIndexes = 0; + + // // Устанавливаем сканирующий ключ + + ScanKeyInit(&key, Anum_pg_index_indrelid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(relid)); + scan = systable_beginscan(pg_index_rel, IndexIndrelidIndexId, true, NULL, 1, &key); + + // РћР±С…РѕРґРёРј индексы + + while (HeapTupleIsValid(indexTuple = systable_getnext(scan))) { + Form_pg_index pgIndexForm = (Form_pg_index) GETSTRUCT(indexTuple); + Oid indexOid = pgIndexForm->indexrelid; + + Relation indexRel = index_open(indexOid, AccessShareLock); + + int status = executeCommand( + session, + createDeleteSlotCommand(session, id, NULL, indexRel, tid, cid, snapshot, + crosscheck, wait, tmfd, changingPart, true)); + + index_close(indexRel, AccessShareLock); + numIndexes++; + } + + systable_endscan(scan); + table_close(pg_index_rel, AccessShareLock); return (TM_Result)status; } +void clouddb_index_update(Relation table_rel, TupleTableSlot *slot, ItemPointer otid) { + List *index_list; + ListCell *lc; + + // Получаем СЃРїРёСЃРѕРє индексов, связанных СЃ таблицей + index_list = RelationGetIndexList(table_rel); + + // РџСЂРѕС…РѕРґРёРј РїРѕ СЃРїРёСЃРєСѓ индексов + foreach(lc, index_list) + { + Oid index_oid = lfirst_oid(lc); + Relation index_rel = index_open(index_oid, AccessShareLock); + IndexInfo *index_info = BuildIndexInfo(index_rel); + + EState *estate = CreateExecutorState(); + ExprContext *econtext = GetPerTupleExprContext(estate); + econtext->ecxt_scantuple = slot; + ExprState *predicate = ExecPrepareQual(index_info->ii_Predicate, estate); + + MemoryContextReset(econtext->ecxt_per_tuple_memory); + + if (predicate != NULL && !ExecQual(predicate, econtext)) + { + continue; + } + + Session *session = getSessionInstance(NULL); + executeCommand(session, update_tuple_to_index(session, slot, index_info, index_rel, table_rel)); + + executeCommand(session, createDeleteSlotCommand(session, GetCurrentTransactionId(), NULL, index_rel, otid, 0, NULL, + NULL, false, NULL, false, true)); + + index_close(index_rel, AccessShareLock); + } +} + TM_Result clouddb_tuple_update(Relation relation, ItemPointer otid, TupleTableSlot *slot, CommandId cid, Snapshot snapshot, Snapshot crosscheck, @@ -53,6 +123,7 @@ TM_Result clouddb_tuple_update(Relation relation, ItemPointer otid, session, createUpdateSlotCommand(session, id, relation, otid, slot, cid, snapshot, crosscheck, wait, tmfd, lockmode, update_indexes)); + clouddb_index_update(relation, slot, otid); return (TM_Result)(status); } diff --git a/clouddb/src/clouddb/tam/src/non_mod_tuple_tam.c b/clouddb/src/clouddb/tam/src/non_mod_tuple_tam.c index fd93d99b6ef..45bcacf3aee 100644 --- a/clouddb/src/clouddb/tam/src/non_mod_tuple_tam.c +++ b/clouddb/src/clouddb/tam/src/non_mod_tuple_tam.c @@ -10,7 +10,7 @@ bool clouddb_fetch_row_version(Relation relation, ItemPointer tid, bool found = false; IDriver *driver = getDriver(session); ItemPointerData foundtiddata; - while (executeCommand(session, selectDataCommand(session, snapshot)) != 0) { + while (executeCommand(session, selectDataCommand(session, snapshot, 9)) != 0) { foundtiddata = getTidForScan(driver); ItemPointer foundtid = &foundtiddata; bool is = ItemPointerEquals(tid, foundtid); @@ -26,11 +26,8 @@ bool clouddb_fetch_row_version(Relation relation, ItemPointer tid, char **values = getValueForScan(driver); slot->tts_tid = foundtiddata; - printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo, - slot->tts_tid.ip_blkid.bi_hi); TupleDesc desc = RelationGetDescr(relation); - printf("%s\n", values[0]); for (int i = 0; i < desc->natts; ++i) { char *curValue = values[i]; diff --git a/clouddb/src/clouddb/tam/src/scan_func_tam.c b/clouddb/src/clouddb/tam/src/scan_func_tam.c index ada234a135f..b7a9878899a 100644 --- a/clouddb/src/clouddb/tam/src/scan_func_tam.c +++ b/clouddb/src/clouddb/tam/src/scan_func_tam.c @@ -35,7 +35,7 @@ bool clouddb_getnextslot(TableScanDesc sscan, ScanDirection direction, ExecClearTuple(slot); Session *session = getSessionInstance(NULL); - if (executeCommand(session, selectDataCommand(session, sscan->rs_snapshot)) == + if (executeCommand(session, selectDataCommand(session, sscan->rs_snapshot, 9)) == 0) { return false; } @@ -43,11 +43,8 @@ bool clouddb_getnextslot(TableScanDesc sscan, ScanDirection direction, char **values = getValueForScan(driver); slot->tts_tid = getTidForScan(driver); - printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo, - slot->tts_tid.ip_blkid.bi_hi); TupleDesc desc = RelationGetDescr(sscan->rs_rd); - printf("%s\n", values[0]); for (int i = 0; i < desc->natts; ++i) { char *curValue = values[i]; diff --git a/clouddb/src/clouddb/utils/utils.c b/clouddb/src/clouddb/utils/utils.c index 8f6f7e67f4a..b4d4f54c321 100644 --- a/clouddb/src/clouddb/utils/utils.c +++ b/clouddb/src/clouddb/utils/utils.c @@ -1,21 +1,22 @@ #include "utils.h" +#include "../facade/session.h" uint32 get_event_horizont_xmin() { uint32 xmin = 0; char query[256]; - snprintf(query, sizeof(query), - "SELECT backend_xmin FROM pg_stat_activity WHERE pid = " - "pg_backend_pid();"); + // snprintf(query, sizeof(query), + // "SELECT backend_xmin FROM pg_stat_activity WHERE pid = " + // "pg_backend_pid();"); int ret = SPI_connect(); if (ret != SPI_OK_CONNECT) { - elog(ERROR, "SPI_connect failed: error code %d", ret); + // elog(ERROR, "SPI_connect failed: error code %d", ret); } // Выполняем запрос ret = SPI_execute(query, true, 0); if (ret != SPI_OK_SELECT) { - elog(ERROR, "SPI_execute failed: error code %d", ret); + // elog(ERROR, "SPI_execute failed: error code %d", ret); } // Проверка результатов diff --git a/clouddb/src/clouddb/utils/utils.h b/clouddb/src/clouddb/utils/utils.h index 843ef602ae8..92105310125 100644 --- a/clouddb/src/clouddb/utils/utils.h +++ b/clouddb/src/clouddb/utils/utils.h @@ -2,6 +2,7 @@ #define UTILS_H #include "postgres.h" + // #include "executor/spi.h" diff --git a/clouddb/test.sql b/clouddb/test.sql index 0a697587778..9e47b3a4102 100644 --- a/clouddb/test.sql +++ b/clouddb/test.sql @@ -1,9 +1,14 @@ -DROP EXTENSION IF EXISTS clouddb CASCADE; +DROP EXTENSION IF EXISTS clouddb; CREATE EXTENSION clouddb; + CREATE TABLE x(a INT) USING clouddb; + CREATE TABLE y(b INT) USING clouddb; + INSERT INTO x VALUES (23), (101); -SELECT a FROM x; -SELECT a + 100 FROM x WHERE a = 23; -SELECT a, COUNT(1) FROM x GROUP BY a ORDER BY COUNT(1) DESC; + +INSERT INTO y VALUES (23), (101); + SELECT b FROM y; + +SELECT a FROM x; \ No newline at end of file diff --git a/test/test.sql b/test/test.sql index af6bdfd057c..0d8e9bd3fbe 100644 --- a/test/test.sql +++ b/test/test.sql @@ -1,17 +1,154 @@ -drop extension clouddb cascade; -create extension clouddb; +-- drop extension clouddb cascade; +-- create extension clouddb; -CREATE TABLE users(id serial PRIMARY KEY, name text, password text) USING clouddb; +-- DROP INDEX IF EXISTS pkey_pg; -INSERT INTO users (name, password) VALUES ('egor', '123'); -INSERT INTO users (name, password) VALUES ('dima', '_'); +-- DROP TABLE test_table_pg22222222; -UPDATE users SET password = 'qwerty' WHERE id = 2; -UPDATE users SET password = 'qwer' WHERE id = 1; +-- DROP TABLE IF EXISTS test_table_pg2222222; +-- DROP TABLE IF EXISTS test_table_pg222222; +-- DROP TABLE IF EXISTS test_table_pg22222; +-- DROP TABLE IF EXISTS test_table_pg2222; +-- DROP TABLE IF EXISTS test_table_pg222; +-- DROP TABLE IF EXISTS test_table_pg22; +-- DROP TABLE IF EXISTS test_table_pg2; +-- DROP TABLE IF EXISTS test_table_pg222222222 CASCADE; -SELECT * FROM users; -- Чтобы РіРѕСЂРёР·РѕРЅС‚ событий сдвинулся -VACUUM; +-- CREATE TABLE test_table(id int, author text, book text) USING clouddb; -SELECT * FROM users; +-- CREATE INDEX pkey ON test_table USING clouddb_index (id); +-- -- INSERT INTO test_table (id, author, book) VALUES (1, 'author', 'book'); +-- -- INSERT INTO test_table (id, author, book) VALUES (2, 'author2', 'book2'); +-- -- INSERT INTO test_table (id, author, book) VALUES (3, 'author3', 'book3'); +-- -- INSERT INTO test_table (id, author, book) VALUES (4, 'author4', 'book4'); + +-- -- DELETE FROM test_table WHERE id = 2; +-- -- UPDATE test_table SET id = 9 WHERE id = 3; + +-- -- INSERT INTO test_table (id, author, book) VALUES (5, 'author5', 'book5'); + +-- -- UPDATE test_table SET id = 10 WHERE id = 5; + +-- -- SET enable_seqscan TO off; +-- -- SET enable_indexscan = on; + +-- -- EXPLAIN ANALYZE SELECT book FROM test_table WHERE id > 1; +-- -- SELECT book FROM test_table WHERE id > 1; + +-- -- SET enable_indexscan = off; +-- -- SET enable_seqscan TO on; + + + +CREATE TABLE test_table_pg222222222(id int, author text, book text); + +CREATE INDEX pkey_pg ON test_table_pg222222222 (id); + + + +-- DO $$ +-- DECLARE +-- i INT; +-- start_time TIMESTAMP; +-- end_time TIMESTAMP; +-- elapsed_time INTERVAL; +-- BEGIN +-- start_time := clock_timestamp(); + +-- -- INSERT INTO test_table (id, author, book) +-- -- SELECT random() * 1000, md5(random()::text), md5(random()::text) +-- -- FROM generate_series(1, 50000); + +-- FOR i IN 1..400000 LOOP +-- INSERT INTO test_table (id, author, book) VALUES (i, 'book', 'author'); +-- END LOOP; + +-- end_time := clock_timestamp(); +-- elapsed_time := end_time - start_time; + +-- RAISE NOTICE 'Время выполнения INSERT: %', elapsed_time; +-- END $$; + +-- -- DO $$ +-- -- DECLARE +-- -- start_time TIMESTAMP; +-- -- end_time TIMESTAMP; +-- -- elapsed_time INTERVAL; +-- -- BEGIN +-- -- start_time := clock_timestamp(); + +-- -- SET enable_seqscan TO off; +-- -- SET enable_indexscan = on; + +-- -- EXECUTE 'SELECT id FROM test_table WHERE id > 37 AND id <= 990'; + +-- -- SET enable_indexscan = off; +-- -- SET enable_seqscan TO on; + +-- -- end_time := clock_timestamp(); +-- -- elapsed_time := end_time - start_time; + +-- -- RAISE NOTICE 'Время выполнения SELECT: %', elapsed_time; +-- -- END $$; + + +-- -- SET enable_seqscan TO off; +-- -- SET enable_indexscan = on; +-- -- EXPLAIN ANALYZE SELECT id FROM test_table WHERE id > 37 AND id <= 990; +-- -- SET enable_indexscan = off; +-- -- SET enable_seqscan TO on; + + +-- -- pg + +DO $$ +DECLARE + i INT; + start_time TIMESTAMP; + end_time TIMESTAMP; + elapsed_time INTERVAL; +BEGIN + start_time := clock_timestamp(); + + INSERT INTO test_table_pg222222222 (id, author, book) + SELECT random() * 1000, md5(random()::text), md5(random()::text) + FROM generate_series(1, 500000); + + end_time := clock_timestamp(); + elapsed_time := end_time - start_time; + + RAISE NOTICE 'Время выполнения INSERT (postgres): %', elapsed_time; +END $$; + + +DO $$ +DECLARE + start_time TIMESTAMP; + end_time TIMESTAMP; + elapsed_time INTERVAL; +BEGIN + start_time := clock_timestamp(); + + SET enable_seqscan TO off; + SET enable_indexscan = on; + + EXECUTE 'SELECT id FROM test_table_pg222222222 WHERE id > 37 AND id <= 990'; + + SET enable_indexscan = off; + SET enable_seqscan TO on; + + end_time := clock_timestamp(); + elapsed_time := end_time - start_time; + + RAISE NOTICE 'Время выполнения SELECT (postgres): %', elapsed_time; +END $$; + +SET enable_seqscan TO off; +SET enable_indexscan = on; + +EXPLAIN ANALYZE SELECT id FROM test_table_pg222222222 WHERE id > 37 AND id <= 990; + +SET enable_indexscan = off; +SET enable_seqscan TO on; -- GitLab From 73f17712463d8e9b7d3f1619a00d018f8d7285cc Mon Sep 17 00:00:00 2001 From: Dmitrii Shabanov <d.shabanov1@g.nsu.ru> Date: Sun, 16 Feb 2025 02:49:34 +0000 Subject: [PATCH 2/5] Rocksdb --- clouddb/CMakeLists.txt | 4 +- clouddb/src/clouddb/CMakeLists.txt | 167 ++++++++++++--- clouddb/src/clouddb/clouddb.c | 6 +- .../cas_transaction_command.cpp | 10 +- .../src/clouddb/facade/command/command.cpp | 11 +- clouddb/src/clouddb/facade/command/command.h | 2 + .../roc_transaction_command.cpp | 150 +++++++++++++ .../rocksdb_command/roc_transaction_command.h | 89 ++++++++ .../cassandra_driver/cassandra_driver.cpp | 121 +++++++---- .../drivers/rocksdb_driver/rocksdb_driver.cpp | 200 ++++++++++++++++++ .../drivers/rocksdb_driver/rocksdb_driver.h | 77 +++++++ clouddb/src/clouddb/facade/query_builder.cpp | 2 - clouddb/src/clouddb/facade/session.cpp | 2 + clouddb/src/clouddb/facade/session.h | 6 +- clouddb/src/clouddb/tam/all_tam.h | 109 +--------- clouddb/src/clouddb/tam/src/mod_tuple_tam.c | 6 + clouddb/src/clouddb/tam/src/scan_func_tam.c | 4 + clouddb/src/clouddb/tam/tam.c | 19 +- 18 files changed, 780 insertions(+), 205 deletions(-) create mode 100644 clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp create mode 100644 clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h create mode 100644 clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp create mode 100644 clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h diff --git a/clouddb/CMakeLists.txt b/clouddb/CMakeLists.txt index 2d4742869cb..ed3ddfec540 100644 --- a/clouddb/CMakeLists.txt +++ b/clouddb/CMakeLists.txt @@ -5,7 +5,9 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) find_package(PostgreSQL REQUIRED) -set(CMAKE_CXX_STANDARD 14) +# set(CMAKE_BUILD_TYPE Debug) + +set(CMAKE_CXX_STANDARD 17) include_directories(${PostgreSQL_INCLUDE_DIRS} ${PostgreSQL_SERVER_INCLUDE_DIRS}) diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt index a92292c4226..0b11d0ba4f5 100644 --- a/clouddb/src/clouddb/CMakeLists.txt +++ b/clouddb/src/clouddb/CMakeLists.txt @@ -1,31 +1,139 @@ -set(cpp_sources - facade/query_builder.cpp - facade/drivers/cassandra_driver/cassandra_driver.cpp - facade/session.cpp - facade/command/cassandra_command/cas_transaction_command.cpp - facade/command/command.cpp - facade/utils/utils.cpp - cpp.cpp + +set(USE_AWS 1) #(?) + +# Платформа (?) +set(PLATFORM "OS_LINUX") + +# Флаги линковки для платформы (need) +set(PLATFORM_LDFLAGS + "-laws-cpp-sdk-s3" + "-laws-cpp-sdk-kinesis" + "-laws-cpp-sdk-core" + "-laws-cpp-sdk-transfer" + "-lpthread" + "-lrt" + "-ldl" + "-fPIC" + "-lsnappy" + "-lgflags" + "-lz" + "-lbz2" + "-llz4" + "-lzstd" + "-lnuma" + "-ltbb" + "-luring" + "-ldl" ) -set(c_sources - utils/utils.c - tam/src/ddl_func_tam.c - tam/src/index_scan_tam.c - tam/src/misc_func_tam.c - tam/src/mod_tuple_tam.c - tam/src/non_mod_tuple_tam.c - tam/src/parallel_scan_tam.c - tam/src/scan_func_tam.c - tam/src/slot_func_tam.c - tam/tam.c - iam/iam.c - iam/src/scan_func_iam.c - iam/src/mod_func_iam.c - hooks/src/hook.c - clouddb.c +# Флаги компиляции для платформы (?) +set(PLATFORM_CCFLAGS + "-DROCKSDB_PLATFORM_POSIX" + "-DROCKSDB_LIB_IO_POSIX" + "-DOS_LINUX" + "-fno-builtin-memcmp" + "-DROCKSDB_FALLOCATE_PRESENT" + "-DSNAPPY" + "-DGFLAGS=1" + "-DZLIB" + "-DBZIP2" + "-DLZ4" + "-DZSTD" + "-DNUMA" + "-DTBB" + "-DROCKSDB_MALLOC_USABLE_SIZE" + "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX" + "-DROCKSDB_BACKTRACE" + "-DROCKSDB_RANGESYNC_PRESENT" + "-DROCKSDB_SCHED_GETCPU_PRESENT" + "-DROCKSDB_AUXV_GETAUXVAL_PRESENT" + "-DROCKSDB_IOURING_PRESENT" + "-I/usr/local/include/" + "-DUSE_AWS" + "-march=native" + "-DHAVE_UINT128_EXTENSION" ) +set(PLATFORM_CXXFLAGS #(?) + "-std=c++17" + "-faligned-new" + "-DHAVE_ALIGNED_NEW" + "-DROCKSDB_PLATFORM_POSIX" + "-DROCKSDB_LIB_IO_POSIX" + "-DOS_LINUX" + "-fno-builtin-memcmp" + "-DROCKSDB_FALLOCATE_PRESENT" + "-DSNAPPY" + "-DGFLAGS=1" + "-DZLIB" + "-DBZIP2" + "-DLZ4" + "-DZSTD" + "-DNUMA" + "-DTBB" + "-DROCKSDB_MALLOC_USABLE_SIZE" + "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX" + "-DROCKSDB_BACKTRACE" + "-DROCKSDB_RANGESYNC_PRESENT" + "-DROCKSDB_SCHED_GETCPU_PRESENT" + "-DROCKSDB_AUXV_GETAUXVAL_PRESENT" + "-DROCKSDB_IOURING_PRESENT" + "-I/usr/local/include/" + "-DUSE_AWS" + "-march=native" + "-DHAVE_UINT128_EXTENSION" +) + +# Флаги для создания общих библиотек (?) +set(PLATFORM_SHARED_CFLAGS "-fPIC") +set(PLATFORM_SHARED_EXT "so") +set(PLATFORM_SHARED_LDFLAGS "-Wl,--no-as-needed -shared -Wl,-soname -Wl,") +set(PLATFORM_SHARED_VERSIONED true) + +# Флаги линковки для исполняемых файлов (?) +set(EXEC_LDFLAGS "-ldl") + +# JEMALLOC (?) +set(JEMALLOC_INCLUDE "") +set(JEMALLOC_LIB "") +set(JEMALLOC 1) +set(WITH_JEMALLOC_FLAG 1) + +# Версии RocksDB (?) +set(ROCKSDB_MAJOR 9) +set(ROCKSDB_MINOR 1) +set(ROCKSDB_PATCH 1) + +# Другие переменные (?) +set(CLANG_SCAN_BUILD "scan-build") +set(CLANG_ANALYZER "/usr/bin/clang++") +set(PROFILING_FLAGS "-pg") +set(FIND "find") +set(WATCH "watch") +set(FOLLY_PATH "") +set(LUA_PATH "") + +set(target_source facade/query_builder.cpp + utils/utils.c + facade/drivers/cassandra_driver/cassandra_driver.cpp + facade/drivers/rocksdb_driver/rocksdb_driver.cpp + facade/session.cpp + facade/command/cassandra_command/cas_transaction_command.cpp + facade/command/rocksdb_command/roc_transaction_command.cpp + facade/command/command.cpp + tam/src/ddl_func_tam.c + tam/src/index_scan_tam.c + tam/src/misc_func_tam.c + tam/src/mod_tuple_tam.c + tam/src/non_mod_tuple_tam.c + tam/src/parallel_scan_tam.c + tam/src/scan_func_tam.c + tam/src/slot_func_tam.c + tam/tam.c + cpp.cpp + hooks/src/hook.c + clouddb.c) + add_postgresql_extension( clouddb VERSION 1.0 @@ -34,6 +142,15 @@ add_postgresql_extension( REGRESS basic ) +link_directories("/home/user/rocksdb-cloud/") link_directories("/usr/local/pgsql/lib/") +include_directories("/home/user/rocksdb-cloud/include/") + +# Установка флагов компиляции +target_compile_options(clouddb PRIVATE ${PLATFORM_CXXFLAGS} ${PLATFORM_CCFLAGS}) + +# Установка флагов линковки +target_link_libraries(clouddb PRIVATE rocksdb cassandra ${PLATFORM_LDFLAGS}) + -target_link_libraries(clouddb cassandra pq) \ No newline at end of file +target_link_libraries(clouddb cassandra pq) diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c index e0627b75b50..068a66aa78c 100644 --- a/clouddb/src/clouddb/clouddb.c +++ b/clouddb/src/clouddb/clouddb.c @@ -9,12 +9,8 @@ #include "hooks/include/hook.h" PG_MODULE_MAGIC; - void _PG_init() { - char *m = "hello"; - some *some2 = &(some){.message = 6}; - some2 = create_class(some2); - // printf("%d\n", getInClass(some2)); + hook_init(); } diff --git a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp index a5e3aee27ec..b7f9726559a 100644 --- a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp +++ b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp @@ -148,6 +148,8 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation)); int *fieldSize = (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation)); + // std::cout << "size: " << RelationGetNumberOfAttributes(relation) << + // std::endl; TupleDesc desc = slot->tts_tupleDescriptor; for (int i = 0; i < desc->natts; i++) { @@ -170,6 +172,7 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( this->operation = INSERT_VALUE; this->tableName = RelationGetRelationName(relation); + // std::cout << this->tableName << " tableName" << std::endl; this->fieldData = convertToVector(fieldData, RelationGetNumberOfAttributes(relation)); free(fieldData); @@ -181,9 +184,10 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( this->fieldName.push_back(strdup(NameStr(attr->attname))); } - auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver()); slot->tts_tid = driver->getNewPointer( std::string(RelationGetRelationName(relation)), driver->getKeyspace()); + // std::cout << slot->tts_tid.ip_blkid.bi_hi << slot->tts_tid.ip_blkid.bi_lo + // << slot->tts_tid.ip_posid << std::endl; this->metadata.xmin = GetCurrentTransactionId(); this->metadata.xmin_commited = true; @@ -349,6 +353,8 @@ ITransactionCommand *CasTransactionCommand::createUpdateSlotCommand( (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation)); int *fieldSize = (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation)); + // std::cout << "size: " << RelationGetNumberOfAttributes(relation) << + // std::endl; TupleDesc desc = slot->tts_tupleDescriptor; for (int i = 0; i < desc->natts; i++) { @@ -419,4 +425,4 @@ ITransactionCommand *CasTransactionCommand::createTruncateTable( this->operation = TRUNCATE_TABLE; this->tableName = std::string(relName); return this; -} \ No newline at end of file +} diff --git a/clouddb/src/clouddb/facade/command/command.cpp b/clouddb/src/clouddb/facade/command/command.cpp index 4f2a1095e94..aa05b91fbf4 100644 --- a/clouddb/src/clouddb/facade/command/command.cpp +++ b/clouddb/src/clouddb/facade/command/command.cpp @@ -5,10 +5,11 @@ ITransactionCommand *createTransactionCommand(std::shared_ptr<IDriver> driver) { return new CasTransactionCommand( std::dynamic_pointer_cast<CassandraDriver>(driver)); } - // else if (std::dynamic_pointer_cast<YDBDriver>(driver)) { - // return YDBTransactionCommand( - // std::dynamic_pointer_cast<YDBDriver>(driver)); - // } + else if (std::dynamic_pointer_cast<RocksDBDriver>(driver)) { + return new RocTransactionCommand( + std::dynamic_pointer_cast<RocksDBDriver>(driver)); + } + return nullptr; } @@ -116,4 +117,4 @@ EXPORT_C ITransactionCommand *update_tuple_to_index(Session *session, TupleTable ITransactionCommand *command = createTransactionCommand(session->getDriver()); command = command->update_tuple_to_index(session, slot, indexInfo, indexRelation, heapRelation); return command; -} \ No newline at end of file +} diff --git a/clouddb/src/clouddb/facade/command/command.h b/clouddb/src/clouddb/facade/command/command.h index 4e9a8d2c28c..6b696365181 100644 --- a/clouddb/src/clouddb/facade/command/command.h +++ b/clouddb/src/clouddb/facade/command/command.h @@ -5,6 +5,8 @@ // команды каждого драйвера #include "cassandra_command/cas_transaction_command.h" +#include "rocksdb_command/roc_transaction_command.h" + #ifdef __cplusplus diff --git a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp new file mode 100644 index 00000000000..fdcfe28b5bc --- /dev/null +++ b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp @@ -0,0 +1,150 @@ +#include "roc_transaction_command.h" +#include <iostream> + +namespace { +std::vector<std::string> convertToVector(char **charArray, int size) { + std::vector<std::string> result; + if (charArray == nullptr) { + return result; // Если РІС…РѕРґРЅРѕР№ указатель null, возвращаем пустой вектор + } + + // Перебираем каждый элемент массива charArray + for (size_t i = 0; i < size; ++i) { + if (charArray[i] != nullptr) { + result.emplace_back(charArray[i]); // Добавляем строку РІ вектор + } else { + result.emplace_back(""); // Добавляем пустую строку для nullptr + } + } + return result; +} + +std::vector<size_t> convertToVector(int *intArray, int size) { + std::vector<size_t> result; + for (int i = 0; i < size; i++) { + result.push_back(intArray[i]); + } + return result; +} +} // namespace + + +int RocTransactionCommand::execute() { + if (this->operation == RCREATE_TABLE) { + driver->createTable(tableName); + }else if(this->operation == RINSERT_VALUE) { + driver->insertData(tableName, fieldName, fieldData, fieldSize, pointer); + } + return 0; +} + +RocTransactionCommand::RocTransactionCommand(std::shared_ptr<RocksDBDriver> driver) { + this->driver = std::dynamic_pointer_cast<RocksDBDriver>(driver); +} + +ITransactionCommand *RocTransactionCommand::createCreateTableCommand( + Session *session, Relation rel) { + this->operation = RCREATE_TABLE; + + // забавно, РЅРѕ здесь нет РЅРё РѕРґРЅРѕР№ функции, Р° следовательно РѕРЅРё безопасны для + // c++ + this->tableName = std::string(RelationGetRelationName(rel)); + for (int i = 0; i < RelationGetNumberOfAttributes(rel); i++) { + Form_pg_attribute attr = TupleDescAttr(rel->rd_att, i); + this->fieldName.push_back(strdup(NameStr(attr->attname))); + } + return this; +} + +ITransactionCommand *RocTransactionCommand::createInsertCommand( + Session *session, Relation relation, TupleTableSlot *slot, CommandId cid, + int options, BulkInsertState bistate) { + char **fieldData = + (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation)); + int *fieldSize = + (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation)); + + TupleDesc desc = slot->tts_tupleDescriptor; + for (int i = 0; i < desc->natts; i++) { + if (slot->tts_isnull[i]) { + fieldData[i] = NULL; + fieldSize[i] = -1; + continue; + } + Oid outFunc; + bool typIsVarlena; + Form_pg_attribute attr = TupleDescAttr(desc, i); + getTypeOutputInfo(attr->atttypid, &outFunc, &typIsVarlena); + fieldData[i] = OidOutputFunctionCall(outFunc, slot->tts_values[i]); + fieldSize[i] = strlen(fieldData[i]); + } + + this->operation = RINSERT_VALUE; + + this->tableName = RelationGetRelationName(relation); + this->fieldData = + convertToVector(fieldData, RelationGetNumberOfAttributes(relation)); + free(fieldData); + this->fieldSize = + convertToVector(fieldSize, RelationGetNumberOfAttributes(relation)); + free(fieldSize); + for (int i = 0; i < RelationGetNumberOfAttributes(relation); i++) { + Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i); + this->fieldName.push_back(strdup(NameStr(attr->attname))); + } + + slot->tts_tid = driver->getNewPointer( + std::string(RelationGetRelationName(relation))); + pointer = slot->tts_tid; + return this; +} + +ITransactionCommand *RocTransactionCommand::beginScanCommand( + Session *session, Relation relation, Snapshot snapshot, int nkeys, + struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags, + TransactionId id) { + + return this; +} + +ITransactionCommand *RocTransactionCommand::selectDataCommand( + Session *session, Snapshot snapshot) { + + return this; +} + +ITransactionCommand *RocTransactionCommand::createDeleteSlotCommand( + Session *session, TransactionId id, ItemPointer newtid, Relation relation, + ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, + bool wait, TM_FailureData *tmfd, bool changingPart) { + + return this; +} + +ITransactionCommand *RocTransactionCommand::createUpdateSlotCommand( + Session *session, TransactionId id, Relation relation, ItemPointer otid, + TupleTableSlot *slot, CommandId cid, Snapshot snapshot, Snapshot crosscheck, + bool wait, TM_FailureData *tmfd, LockTupleMode *lockmode, + TU_UpdateIndexes *update_indexes) { + + return this; +} + +ITransactionCommand *RocTransactionCommand::createVacuumCommand( + Session *session, TransactionId id, Relation rel, VacuumParams *params, + BufferAccessStrategy bstrategy) { + + return this; +} + +ITransactionCommand *RocTransactionCommand::createDropTable(Session *session, + char *relName) { + + return this; +} + +ITransactionCommand *RocTransactionCommand::createTruncateTable( + Session *session, char *relName) { + + return this; +} diff --git a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h new file mode 100644 index 00000000000..9ea6c2c3fd0 --- /dev/null +++ b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h @@ -0,0 +1,89 @@ +#ifndef ROC_TRANSACTION_COMMAND_H +#define ROC_TRANSACTION_COMMAND_H + +#include "../../query_builder.h" +#include "../itransaction_command.h" + +#ifdef __cplusplus +#include <vector> + +#include "../../utils/metadata.h" + +enum RocTransactionOperation { + RCREATE_TABLE, + RINSERT_VALUE, + RBEGIN_SCAN, + RSELECT_DATA, + RDELETE_SLOT, + RUPDATE_SLOT, + RVACUUM_TABLE, + RTRUNCATE_TABLE, + RDROP_TABLE +}; + +class RocTransactionCommand : public ITransactionCommand { + private: + std::string tableName; + std::vector<std::string> fieldName; + std::vector<std::string> fieldData; + std::vector<size_t> fieldSize; +// RocksDBBuilder builder; + RocTransactionOperation operation; + ItemPointerData pointer; + Metadata metadata; + + // scan data + Relation relation; + Snapshot snapshot; + int nkeys; + struct ScanKeyData *key; + ParallelTableScanDesc parallel_scan; + uint32 flags; + TransactionId id; + + std::shared_ptr<RocksDBDriver> driver; + + public: + RocTransactionCommand() {}; + RocTransactionCommand(std::shared_ptr<RocksDBDriver> driver); + int execute() override; + ITransactionCommand *createCreateTableCommand(Session *session, + Relation rel) override; + ITransactionCommand *createInsertCommand(Session *session, Relation relation, + TupleTableSlot *slot, CommandId cid, + int options, + BulkInsertState bistate) override; + ITransactionCommand *beginScanCommand(Session *session, Relation relation, + Snapshot snapshot, int nkeys, + struct ScanKeyData *key, + ParallelTableScanDesc parallel_scan, + uint32 flags, + TransactionId id) override; + ITransactionCommand *selectDataCommand(Session *session, + Snapshot snapshot) override; + + ITransactionCommand *createDeleteSlotCommand( + Session *session, TransactionId id, ItemPointer newtid, Relation relation, + ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, + bool wait, TM_FailureData *tmfd, bool changingPart) override; + + ITransactionCommand *createUpdateSlotCommand( + Session *session, TransactionId id, Relation relation, ItemPointer otid, + TupleTableSlot *slot, CommandId cid, Snapshot snapshot, + Snapshot crosscheck, bool wait, TM_FailureData *tmfd, + LockTupleMode *lockmode, TU_UpdateIndexes *update_indexes) override; + + ITransactionCommand *createVacuumCommand( + Session *session, TransactionId id, Relation rel, VacuumParams *params, + BufferAccessStrategy bstrategy) override; + + ITransactionCommand *createDropTable(Session *session, + char *relName) override; + + ITransactionCommand *createTruncateTable(Session *session, + char *relName) override; +}; + +#endif // !__cplusplus + +#endif // !CAS_TRANSACTION_COMMAND_H diff --git a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp index acfbbc26379..a705bc3dfc1 100644 --- a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp +++ b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp @@ -5,6 +5,7 @@ #include <storage/itemptr.h> #include <cassandra.h> +#include <chrono> #include <cstring> #include <iostream> #include <unordered_map> @@ -124,11 +125,12 @@ CassandraDriver::CassandraDriver( : mapPointers() { builder = CassandraBuilder(); - hostname = config["cassandra.host"]; - keyspace = config["cassandra.keyspace"]; - replicationFactor = std::atoi(config["cassandra.replication_factor"].c_str()); - std::cout << this->hostname << " " << this->keyspace << " " - << this->replicationFactor << '\n'; + this->hostname = config["cassandra.host"]; + this->keyspace = config["cassandra.keyspace"]; + this->replicationFactor = + std::atoi(config["cassandra.replication_factor"].c_str()); + // std::cout << this->hostname << " " << this->keyspace << " " + // << this->replicationFactor << std::endl; clusterPtr = cass_cluster_new(); cass_cluster_set_contact_points(clusterPtr, hostname.data()); @@ -151,6 +153,7 @@ CassandraDriver::CassandraDriver( std::string query = this->builder.buildKeyspace(this->keyspace, this->replicationFactor); + // std::cout << query << std::endl; execCqlQuery(query); } @@ -178,9 +181,14 @@ void CassandraDriver::execCqlQuery(std::string query, Metadata metadata, int var) { CassError rc = CASS_OK; CassFuture *future = NULL; + // std::cout << query << std::endl; + // std::cout << metadata.mask << std::endl; CassStatement *statement = cass_statement_new(query.data(), var); convert data = {.data = metadata.ctid}; - + // std::cout << metadata.t_ctid.ip_blkid.bi_hi << " " + // << metadata.t_ctid.ip_blkid.bi_lo << " " << + // metadata.t_ctid.ip_posid + // << std::endl; cass_statement_bind_bytes(statement, var - 1, (cass_byte_t *)data.a, 6); bindPartMetadataInStatement(statement, metadata); @@ -204,6 +212,7 @@ void CassandraDriver::execCqlQuery(std::string query, CassError rc = CASS_OK; CassFuture *future = NULL; CassStatement *statement = cass_statement_new(query.data(), var); + // std::cout << "\n\n\n"; for (int i = 0; i < fields.size(); ++i) { char *a = const_cast<char *>(fields[i].c_str()); convert b; @@ -232,11 +241,20 @@ void CassandraDriver::execCqlQuery(std::string query, std::vector<std::string> fieldData, std::vector<size_t> fieldSize, Metadata metadata, int var) { + // auto start = std::chrono::high_resolution_clock::now(); CassError rc = CASS_OK; CassFuture *future = NULL; + static int i = 0; + i++; CassStatement *statement = cass_statement_new(query.data(), var); + static CassBatch *batch = NULL; + if (batch == NULL) + batch = cass_batch_new(CASS_BATCH_TYPE_UNLOGGED); // Создаем пакет + // std::cout << query << std::endl; + // std::cout << fieldData.size() << std::endl; for (int i = 0; i < fieldData.size(); ++i) { + // std::cout << fieldData[i] << " vlaue" << std::endl; if (fieldData[i] == "") { cass_statement_bind_null(statement, i + 1); continue; @@ -247,43 +265,35 @@ void CassandraDriver::execCqlQuery(std::string query, fieldSize[i]); } bindMetadataInStatement(statement, metadata, fieldData.size() + 1); - - future = cass_session_execute(this->sessionPtr, statement); - // cass_future_wait(future); - - // rc = cass_future_error_code(future); - // if (rc != CASS_OK) { - // const char *message; - // size_t message_length; - // cass_future_error_message(future, &message, &message_length); - // std::cerr << "Connection error: " << std::string(message, message_length) - // << std::endl; - // } - cass_future_free(future); + cass_batch_add_statement(batch, statement); cass_statement_free(statement); -} - -void CassandraDriver::execCqlQueryIndex(std::string query, - std::vector<std::string> fieldData, - std::vector<size_t> fieldSize, - Metadata metadata, int var) { - CassError rc = CASS_OK; - CassFuture *future = NULL; - CassStatement *statement = cass_statement_new(query.data(), var); - - for (int i = 0; i < fieldData.size(); ++i) { - if (fieldData[i] == "") { - cass_statement_bind_null(statement, i + 2); - continue; - } - - cass_statement_bind_bytes(statement, i + 2, - (const cass_byte_t *)fieldData[i].c_str(), - fieldSize[i]); - } - bindMetadataInStatementWithIndex(statement, metadata, fieldData.size() + 2); - future = cass_session_execute(this->sessionPtr, statement); + if (i == 10) { + // std::cout << "yee " << batch << " " << &batch << std::endl; + i = 0; + + future = cass_session_execute_batch(this->sessionPtr, batch); + cass_batch_free(batch); // Освобождаем пакет + batch = NULL; + // cass_future_wait(future); + + // rc = cass_future_error_code(future); + // + // if (rc != CASS_OK) { + // const char *message; + // size_t message_length; + // cass_future_error_message(future, &message, &message_length); + // std::cout << "Connection error: " << std::string(message, + // message_length) + // << std::endl; + // } + } + // auto end = std::chrono::high_resolution_clock::now(); + // std::chrono::duration<double> duration = end - start; + // std::cout << "Время выполнения функции: " << duration.count() << " секунд." + // << std::endl; + + // future = cass_session_execute(this->sessionPtr, statement); // cass_future_wait(future); // rc = cass_future_error_code(future); @@ -294,8 +304,7 @@ void CassandraDriver::execCqlQueryIndex(std::string query, // std::cerr << "Connection error: " << std::string(message, message_length) // << std::endl; // } - cass_future_free(future); - cass_statement_free(statement); + // cass_future_free(future); } CassFuture *CassandraDriver::execCqlQueryWithRes(std::string query) { @@ -349,6 +358,7 @@ ItemPointerData CassandraDriver::getLastPointer(const std::string &tableName, } std::string query = builder.buildGetLastPointer(key, tableName); + // std::cout << "query last pointer: " << query << std::endl; CassFuture *future = execCqlQueryWithRes(query); ItemPointerData last = {}; @@ -502,7 +512,11 @@ int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) { CassRow *row = const_cast<CassRow *>(cass_iterator_get_row(this->iterator.iter)); CassError error = loadMetadata(row, metadata); - + // std::cout << metadata.xmin << " " << metadata.xmax << " select" + // << std::endl; + if (!inVisibilityArea(metadata, snapshot, ReadNextTransactionId() - 1)) { + return selectData(snapshot); // надо пофиксить + } this->iterator.row.value.clear(); this->iterator.row.size.clear(); @@ -523,7 +537,12 @@ int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) { cass_value_get_bytes(casValue, &bytes, &size); this->iterator.row.value.push_back(bytes); this->iterator.row.size.push_back(size); - } + } + const cass_byte_t *bytes; + cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"), &bytes, + &size); + // std::cout << "select data: " << this->iterator.row.value[0] << " " + // << this->iterator.row.size.size() << std::endl; return 1; } return 0; @@ -584,7 +603,8 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future, loadMetadata(row, metadata); cass_value_get_bytes(cass_row_get_column_by_name(row, KEY_NAME), &bytes, &size); - + // std::cout << metadata.xmax << " xmax metadata and id - " << id + // << std::endl; if (metadata.xmax == 0) { continue; } @@ -607,11 +627,18 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future, if (keysInBatch > 0) { std::vector<std::string> keysV; for (int i = 0; i < keysInBatch; i++) { - + // std::cout << keys[i].data.ip_blkid.bi_hi << " " + // << keys[i].data.ip_blkid.bi_lo << " " << + // keys[i].data.ip_posid + // << std::endl; + // keysV.emplace_back(keys[i].a, 6); char *a = const_cast<char *>(keysV[i].c_str()); convert b; memcpy(b.a, a, 6); + // std::cout << b.data.ip_blkid.bi_hi << " " << b.data.ip_blkid.bi_lo << " + // " + // << b.data.ip_posid << std::endl; } execCqlQuery(builder.buildDropTuple(keyspace, tableName, keysInBatch), keysV, keysInBatch); diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp new file mode 100644 index 00000000000..ac3be46eb23 --- /dev/null +++ b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp @@ -0,0 +1,200 @@ +#include "rocksdb_driver.h" +#include <bits/this_thread_sleep.h> + +#include <iostream> + +using namespace ROCKSDB_NAMESPACE; + +std::string kDBPath = "/tmp/rocksdb_cloud_durable"; + +std::string kBucketSuffix = "cloud.durable.example."; +std::string kRegion = "us-west-2"; + +static const bool flushAtEnd = true; +static const bool disableWAL = false; + + +RocksDBDriver::RocksDBDriver(std::unordered_map<std::string, std::string> config) : mapPointers() { + std::cout << "Construct" << std::endl; + cloud_fs_options.aws_options.endpoint_override = "127.0.0.1:9000"; + + // Store a reference to a cloud file system. A new cloud env object should be + // associated with every new cloud-db. + + cloud_fs_options.credentials.InitializeSimple( + getenv("AWS_ACCESS_KEY_ID"), getenv("AWS_SECRET_ACCESS_KEY")); + if (!cloud_fs_options.credentials.HasValid().ok()) { + fprintf( + stderr, + "Please set env variables " + "AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY with cloud credentials"); + } + + // Append the user name to the bucket name in an attempt to make it + // globally unique. S3 bucket-names need to be globally unique. + // If you want to rerun this example, then unique user-name suffix here. + char* user = getenv("USER"); + kBucketSuffix.append(user); + + // "rockset." is the default bucket prefix + const std::string bucketPrefix = ""; + cloud_fs_options.src_bucket.SetBucketName(kBucketSuffix, bucketPrefix); + cloud_fs_options.dest_bucket.SetBucketName(kBucketSuffix, bucketPrefix); + + // create a bucket name for debugging purposes + const std::string bucketName = bucketPrefix + kBucketSuffix; + + // Create a new AWS cloud env Status + Status s = CloudFileSystemEnv::NewAwsFileSystem( + FileSystem::Default(), kBucketSuffix, kDBPath, kRegion, kBucketSuffix, + kDBPath, kRegion, cloud_fs_options, nullptr, &cfs); + if (!s.ok()) { + fprintf(stderr, "Unable to create cloud env in bucket %s. %s\n", + bucketName.c_str(), s.ToString().c_str()); + } + cloud_fs.reset(cfs); + + // Create options and use the AWS file system that we created earlier + cloud_env = NewCompositeEnv(cloud_fs); + options.env = cloud_env.get(); + options.create_if_missing = true; + + // No persistent read-cache + std::string persistent_cache = ""; + + // options for each write + wopt.disableWAL = disableWAL; + + // open DB + s = DBCloud::Open(options, kDBPath, persistent_cache, 0, &db); + if (!s.ok()) { + throw std::runtime_error("Unable to open db at path1 " + + kDBPath + + " with bucket " + + bucketName + + ". " + + s.ToString() + "\n"); + } + + + /*********************** + * * + * Test * + * * + ************************/ + + // s = db->Put(wopt, "key1", "value"); + + // db->Flush(FlushOptions()); + + // std::cout << "Test succes" << std::endl; +} + +void RocksDBDriver::createTable(std::string tableName){ + std::cout << "Create" << std::endl; + // ROCKSDB_NAMESPACE::ColumnFamilyOptions cfOptions; + // // Здесь можно настроить параметры семейства колонок, если необходимо + // ROCKSDB_NAMESPACE::ColumnFamilyHandle* cfHandle; + // auto status = db->CreateColumnFamily(cfOptions, tableName, &cfHandle); + // if (!status.ok()) { + // throw std::runtime_error("Unable to create column family: " + status.ToString()); + // } + + // // Сохраняем дескриптор семейства колонок РІ мапу + // columnFamilies[tableName] = cfHandle; +} + +void RocksDBDriver::insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) { + static int countOperation = 0; + + std::string key = std::to_string(pointer.ip_blkid.bi_hi) + "_" + + std::to_string(pointer.ip_blkid.bi_lo) + "_" + + std::to_string(pointer.ip_posid); + + std::string value; + for (size_t i = 0; i < fieldData.size(); ++i) { + value += fieldData[i]; + if (i < fieldData.size() - 1) { + value += "|"; // Use a delimiter to separate fields + } + } + + // auto batch = rocksdb::WriteBatch(); + auto status = db->Put(this->wopt, key, value); + + if (!status.ok()) { + throw std::runtime_error("Failed to insert data: " + status.ToString()); + } + + countOperation++; + if(countOperation % 50000 == 0){ + db->Flush(FlushOptions()); + } +} + +ItemPointerData RocksDBDriver::getNewPointer(std::string tableName) { + ItemPointerData data = getLastPointer(tableName); + if (data.ip_posid < UINT16_MAX) { + data.ip_posid++; + } else { + data.ip_posid = 1; + if (data.ip_blkid.bi_lo < UINT16_MAX) { + data.ip_blkid.bi_lo++; + } else { + data.ip_blkid.bi_lo = 0; + if (data.ip_blkid.bi_hi < UINT16_MAX) { + data.ip_blkid.bi_hi++; + } else { + data.ip_blkid.bi_hi = 0; + } + } + } + mapPointers[tableName] = data; + return data; +} + +ItemPointerData RocksDBDriver::getLastPointer(const std::string &tableName) { + auto it = this->mapPointers.find(tableName); + if (it != this->mapPointers.end()) { + return it->second; + } + + ItemPointerData last = {}; + ROCKSDB_NAMESPACE::ReadOptions readOptions; + ROCKSDB_NAMESPACE::Iterator* itr = db->NewIterator(readOptions); + + itr->SeekToLast(); + if (itr->Valid()) { + std::string lastKey = itr->key().ToString(); + std::istringstream iss(lastKey); + std::string token; + std::vector<uint16_t> parts; + + while (std::getline(iss, token, '_')) { + parts.push_back(static_cast<uint16_t>(std::stoi(token))); + } + + if (parts.size() == 3) { + last.ip_blkid.bi_hi = parts[0]; + last.ip_blkid.bi_lo = parts[1]; + last.ip_posid = parts[2]; + } + }else{ + last.ip_blkid.bi_hi = 1; + last.ip_blkid.bi_lo = 1; + last.ip_posid = 1; + return last; + } + + delete itr; + + mapPointers[tableName] = last; + return last; + // last.ip_blkid.bi_hi = 1; + // last.ip_blkid.bi_lo = 1; + // last.ip_posid = 1; + // return last; + +} + + diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h new file mode 100644 index 00000000000..5c150f57090 --- /dev/null +++ b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h @@ -0,0 +1,77 @@ +#ifndef ROCKSDB_DRIVER_H +#define ROCKSDB_DRIVER_H + +#include "../idriver.h" + +#ifdef __cplusplus +extern "C" { +#endif +#include <postgres.h> +#include <fmgr.h> + +#include <access/transam.h> +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus + +#include <string> +#include <unordered_map> +#include <sstream> + +#include "../../../utils/utils.h" +#include "../../utils/metadata.h" + +#include <rocksdb/listener.h> +#include <rocksdb/options.h> +#include <rocksdb/db.h> +#include <rocksdb/slice.h> +#include <rocksdb/iterator.h> + +#include <bits/std_thread.h> + +#include <rocksdb/cloud/db_cloud.h> +#include <rocksdb/options.h> + + +class RocksDBDriver: public IDriver { +private: + ROCKSDB_NAMESPACE::DBCloud* db; + std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> columnFamilies; + + //require live for correct work + std::unordered_map<std::string, ItemPointerData> mapPointers; + ROCKSDB_NAMESPACE::WriteOptions wopt; + std::shared_ptr<ROCKSDB_NAMESPACE::FileSystem> cloud_fs; + ROCKSDB_NAMESPACE::Options options; + std::unique_ptr<ROCKSDB_NAMESPACE::Env> cloud_env; + ROCKSDB_NAMESPACE::CloudFileSystemOptions cloud_fs_options; + ROCKSDB_NAMESPACE::CloudFileSystem* cfs; +public: + ~RocksDBDriver() = default; + RocksDBDriver(std::unordered_map<std::string, std::string> config); + + void createTable(std::string tableName); + + void insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) ; + + void beginScan(Relation relation, Snapshot snapshot, int nkeys, + struct ScanKeyData* key, + ParallelTableScanDesc parallel_scan, uint32 flags, + TransactionId id) { return; }; + int selectData(Snapshot snapshot) { return 0; }; + char** getValue() { return 0; }; + ItemPointerData getTid() { return ItemPointerData(); }; + + ItemPointerData getNewPointer(std::string tableName); + ItemPointerData getLastPointer(const std::string &tableName); + + void startFlushThread(); + void stopFlushThread(); +}; + +#endif + + +#endif \ No newline at end of file diff --git a/clouddb/src/clouddb/facade/query_builder.cpp b/clouddb/src/clouddb/facade/query_builder.cpp index d969304ef4a..4ab0dbebd8f 100644 --- a/clouddb/src/clouddb/facade/query_builder.cpp +++ b/clouddb/src/clouddb/facade/query_builder.cpp @@ -220,9 +220,7 @@ std::string CassandraBuilder::buildSelectAll(std::string keyspace, query += " <= "; query += std::to_string(id); query += " ALLOW FILTERING;"; - // std::cout << query << std::endl; - return query; } diff --git a/clouddb/src/clouddb/facade/session.cpp b/clouddb/src/clouddb/facade/session.cpp index 6216efe3d40..f9f8f6f704d 100644 --- a/clouddb/src/clouddb/facade/session.cpp +++ b/clouddb/src/clouddb/facade/session.cpp @@ -19,6 +19,8 @@ std::unordered_map<std::string, std::string> parseConfig(char **config) { Session::Session(std::unordered_map<std::string, std::string> config) { if (config["driver"] == "cassandra") { this->driver = std::make_shared<CassandraDriver>(config); + }else if(config["driver"] == "rocksdb") { + this->driver = std::make_shared<RocksDBDriver>(config); } } diff --git a/clouddb/src/clouddb/facade/session.h b/clouddb/src/clouddb/facade/session.h index dd0cdccbbbc..38d6e541014 100644 --- a/clouddb/src/clouddb/facade/session.h +++ b/clouddb/src/clouddb/facade/session.h @@ -4,14 +4,16 @@ #include "../utils/c_export.h" #include "command/icommand.h" #include "drivers/cassandra_driver/cassandra_driver.h" +#include "drivers/rocksdb_driver/rocksdb_driver.h" // #ifdef __cplusplus #include <memory> #include <string> #include <unordered_map> +#include <iostream> -enum DRIVERS { Cassandra }; +enum DRIVERS { Cassandra, RocksDb }; class Session { public: @@ -27,7 +29,7 @@ class Session { std::weak_ptr<ICommand> command; Session(std::unordered_map<std::string, std::string> config); Session(); - ~Session() = default; + ~Session() {std::cout << "~Session" << std::endl;}; // delete all Session(const Session &) = delete; diff --git a/clouddb/src/clouddb/tam/all_tam.h b/clouddb/src/clouddb/tam/all_tam.h index 43134944a91..d00e11646c9 100644 --- a/clouddb/src/clouddb/tam/all_tam.h +++ b/clouddb/src/clouddb/tam/all_tam.h @@ -16,114 +16,7 @@ #include "../facade/command/command.h" #include "../utils/utils.h" -#include "access/hio.h" -#include "access/multixact.h" -#include "access/relscan.h" -#include "access/sysattr.h" -#include "access/transam.h" -#include "access/valid.h" -#include "access/visibilitymap.h" -#include "access/xact.h" -#include "access/xlogutils.h" -#include "catalog/catalog.h" -#include "catalog/namespace.h" -#include "miscadmin.h" -#include "pgstat.h" -#include "storage/bufmgr.h" -#include "storage/freespace.h" -#include "storage/lmgr.h" -#include "storage/procarray.h" -#include "storage/smgr.h" -#include "storage/standby.h" -#include "utils/datum.h" -#include "utils/inval.h" -#include "utils/snapmgr.h" -#include "utils/syscache.h" - - -#include "access/genam.h" -#include "access/table.h" -#include "catalog/indexing.h" -#include "catalog/objectaddress.h" -#include "catalog/pg_description.h" -#include "catalog/pg_shdescription.h" -#include "commands/comment.h" -#include "commands/dbcommands.h" -#include "utils/fmgroids.h" -#include "catalog/pg_index.h" -#include "catalog/pg_class.h" -#include "catalog/pg_namespace.h" -#include "utils/relcache.h" -#include "utils/varbit.h" -#include "commands/sequence.h" - - -#include <access/heapam.h> -#include <access/htup_details.h> -#include <access/relation.h> -#include <access/tableam.h> -#include <cassandra.h> -#include <catalog/index.h> -#include <commands/vacuum.h> -#include <executor/executor.h> -#include <executor/spi.h> -#include <executor/tuptable.h> -#include <fmgr.h> -#include <miscadmin.h> -#include <nodes/execnodes.h> -#include <postmaster/bgworker.h> -#include <postmaster/interrupt.h> -#include <stdlib.h> -#include <storage/ipc.h> -#include <storage/lwlock.h> -#include <storage/shmem.h> -#include <string.h> -#include <tcop/tcopprot.h> -#include <utils/builtins.h> -#include <utils/guc.h> -#include <utils/lsyscache.h> -#include <utils/rel.h> /* ... and relations */ -#include <utils/snapmgr.h> - -#include "access/amapi.h" -#include "access/genam.h" -#include "access/relscan.h" -#include "catalog/index.h" -#include "catalog/pg_type.h" -#include "commands/vacuum.h" -#include "miscadmin.h" -#include "storage/bufmgr.h" -#include "utils/memutils.h" -#include "nodes/pathnodes.h" - -#include <access/heapam.h> -#include <access/htup_details.h> -#include <access/relation.h> -#include <access/tableam.h> -#include <cassandra.h> -#include <catalog/index.h> -#include <commands/vacuum.h> -#include <executor/executor.h> -#include <executor/spi.h> -#include <executor/tuptable.h> -#include <fmgr.h> -#include <miscadmin.h> -#include <nodes/execnodes.h> -#include <postmaster/bgworker.h> -#include <postmaster/interrupt.h> -#include <stdlib.h> -#include <storage/ipc.h> -#include <storage/lwlock.h> -#include <storage/shmem.h> -#include <string.h> -#include <tcop/tcopprot.h> -#include <utils/builtins.h> -#include <utils/guc.h> -#include <utils/lsyscache.h> -#include <utils/rel.h> /* ... and relations */ -#include <utils/snapmgr.h> -#include "access/amapi.h" - +extern Session* session; extern const TableAmRoutine clouddb_methods; #endif diff --git a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c index 4a7c40cf7a8..9ddd5e479ee 100644 --- a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c +++ b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c @@ -4,9 +4,14 @@ void clouddb_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid, int options, BulkInsertState bistate) { + // Вычисляем разницу + /* clock_t start = clock(); */ Session *session = getSessionInstance(NULL); executeCommand(session, createInsertCommand(session, relation, slot, cid, options, bistate)); + /* clock_t end = clock(); */ + /* double time_spent = (double)(end - start) / CLOCKS_PER_SEC * 1000; */ + /* printf("Время выполнения функции: %.3f milliseconds\n", time_spent); */ } void clouddb_tuple_insert_speculative(Relation relation, TupleTableSlot *slot, @@ -136,3 +141,4 @@ TM_Result clouddb_tuple_lock(Relation relation, ItemPointer tid, TM_Result result = 0; return result; } + diff --git a/clouddb/src/clouddb/tam/src/scan_func_tam.c b/clouddb/src/clouddb/tam/src/scan_func_tam.c index b7a9878899a..489bef859d4 100644 --- a/clouddb/src/clouddb/tam/src/scan_func_tam.c +++ b/clouddb/src/clouddb/tam/src/scan_func_tam.c @@ -43,8 +43,12 @@ bool clouddb_getnextslot(TableScanDesc sscan, ScanDirection direction, char **values = getValueForScan(driver); slot->tts_tid = getTidForScan(driver); + /* printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo, + */ + /* slot->tts_tid.ip_blkid.bi_hi); */ TupleDesc desc = RelationGetDescr(sscan->rs_rd); + /* printf("%s\n", values[0]); */ for (int i = 0; i < desc->natts; ++i) { char *curValue = values[i]; diff --git a/clouddb/src/clouddb/tam/tam.c b/clouddb/src/clouddb/tam/tam.c index 3d2059d2987..dbd294918d2 100644 --- a/clouddb/src/clouddb/tam/tam.c +++ b/clouddb/src/clouddb/tam/tam.c @@ -7,6 +7,8 @@ #include "include/scan_func_tam.h" #include "include/slot_func_tam.h" +Session* session; + const TableAmRoutine clouddb_methods = { .type = T_TableAmRoutine, @@ -71,20 +73,21 @@ const TableAmRoutine clouddb_methods = { PG_FUNCTION_INFO_V1(clouddb_table_handler); Datum clouddb_table_handler(PG_FUNCTION_ARGS) { - char *keyspace = (char *)GetConfigOption("cassandra.keyspace", false, false); - char *host = (char *)GetConfigOption("cassandra.host", false, false); + printf("Init\n"); + char *host = GetConfigOption("cassandra.host", false, false); + char *keyspace = GetConfigOption("cassandra.keyspace", false, false); char *replicationFactor = (char *)GetConfigOption("cassandra.replication_factor", false, false); - char **config = (char **)malloc(sizeof(char *) * 7); - config[0] = "cassandra"; + char **config = (char **)malloc(sizeof(char *) * 7); + config[0] = "rocksdb"; config[1] = "cassandra.host"; - config[2] = host; + config[2] = "host"; config[3] = "cassandra.keyspace"; - config[4] = keyspace; + config[4] = "keyspace"; config[5] = "cassandra.replication_factor"; - config[6] = replicationFactor; - Session *session = getSessionInstance((void *)config); + config[6] = "replicationFactor"; + session = getSessionInstance(config); PG_RETURN_POINTER(&clouddb_methods); } -- GitLab From 11c51afe8a88108424b479d02521433b7d5afc83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B8=D1=82=D0=BE=D1=87=D0=BA=D0=B8=D0=BD=20=D0=95?= =?UTF-8?q?=D0=B3=D0=BE=D1=80?= <e.bitochkin@g.nsu.ru> Date: Sun, 16 Feb 2025 19:54:08 +0700 Subject: [PATCH 3/5] feat: Dockerfile --- .gitmodules | 6 + clouddb/Dockerfile | 26 ++- clouddb/external/aws | 1 + clouddb/external/rocksdb | 1 + clouddb/src/clouddb/CMakeLists.txt | 149 +----------------- clouddb/src/clouddb/clouddb.c | 3 - clouddb/src/clouddb/clouddb.h | 6 +- clouddb/src/clouddb/cpp.cpp | 43 ----- clouddb/src/clouddb/cpp.h | 53 ------- .../drivers/rocksdb_driver/rocksdb_driver.h | 49 +++--- clouddb/src/clouddb/utils/utils.c | 1 - test/main.py | 51 ++++++ 12 files changed, 111 insertions(+), 278 deletions(-) create mode 160000 clouddb/external/aws create mode 160000 clouddb/external/rocksdb delete mode 100644 clouddb/src/clouddb/cpp.cpp delete mode 100644 clouddb/src/clouddb/cpp.h create mode 100644 test/main.py diff --git a/.gitmodules b/.gitmodules index a03f69df67a..53bfa81d11b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,3 +5,9 @@ [submodule "clouddb/external/cassandra_driver"] path = clouddb/external/cassandra_driver url = https://github.com/datastax/cpp-driver.git +[submodule "clouddb/external/aws"] + path = clouddb/external/aws + url = https://github.com/aws/aws-sdk-cpp.git +[submodule "clouddb/external/rocksdb"] + path = clouddb/external/rocksdb + url = https://github.com/undy11203/rocksdb-cloud.git diff --git a/clouddb/Dockerfile b/clouddb/Dockerfile index 6a3e9b5fc8c..5ef9b36f975 100644 --- a/clouddb/Dockerfile +++ b/clouddb/Dockerfile @@ -21,10 +21,7 @@ RUN apt-get update && apt-get install -y \ libpq-dev \ icu-devtools \ libicu-dev \ - git - -# Устанавливаем зависимости для СЃР±РѕСЂРєРё расширения Рё Cassandra драйвера -RUN apt-get update && apt-get install -y \ + git \ libpq-dev \ libuv1-dev \ libssl-dev \ @@ -33,6 +30,7 @@ RUN apt-get update && apt-get install -y \ WORKDIR /usr/src +# РЎР±РѕСЂРєР° драйвера Cassandra COPY external/cassandra_driver /usr/src/cassandra_driver RUN cd /usr/src/cassandra_driver && \ mkdir /usr/src/cassandra_driver/build && cd /usr/src/cassandra_driver/build && \ @@ -41,6 +39,24 @@ RUN cd /usr/src/cassandra_driver && \ make install && \ ldconfig +# РЎР±РѕСЂРєР° AWS SDK, зависимости для RocksDB-Cloud +COPY external/aws /usr/src/aws_sdk +RUN cd /usr/src/aws_sdk &&\ + cmake -DCMAKE_BUILD_TYPE=Release '-DBUILD_ONLY=kinesis;core;s3;transfer' -S . -B build && cd build && \ + make -j8 && \ + make install && \ + ldconfig + +COPY external/rocksdb /usr/src/rocksdb +ENV USE_AWS=1 +ENV USE_RTTI=1 +ENV DISABLE_WARNING_AS_ERROR=1 +RUN cd /usr/src/rocksdb &&\ + make -j8 static_lib &&\ + ldconfig + + +# РЎР±РѕСЂРєР° постгреса COPY external/postgres /usr/src/postgres RUN /usr/src/postgres/configure --prefix=/usr/local/pgsql --without-icu --without-perl && \ make -j8 && \ @@ -50,6 +66,8 @@ RUN useradd -m -U -r -d /home/postgres -s /bin/bash postgres && \ mkdir -p /var/lib/postgresql && \ chown -R postgres:postgres /var/lib/postgresql /home/postgres + + ############################################## # Stage 1: РЎР±РѕСЂРєР° CloudDB ############################################## diff --git a/clouddb/external/aws b/clouddb/external/aws new file mode 160000 index 00000000000..00fb461a3ca --- /dev/null +++ b/clouddb/external/aws @@ -0,0 +1 @@ +Subproject commit 00fb461a3cac85baf4a1ffc98fb4fc2f9cf3a1bd diff --git a/clouddb/external/rocksdb b/clouddb/external/rocksdb new file mode 160000 index 00000000000..5d44ac66b33 --- /dev/null +++ b/clouddb/external/rocksdb @@ -0,0 +1 @@ +Subproject commit 5d44ac66b337b0dd79675d5761c7b6887c8c79a4 diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt index 0b11d0ba4f5..61ef58193f7 100644 --- a/clouddb/src/clouddb/CMakeLists.txt +++ b/clouddb/src/clouddb/CMakeLists.txt @@ -1,156 +1,17 @@ - -set(USE_AWS 1) #(?) - -# Платформа (?) -set(PLATFORM "OS_LINUX") - -# Флаги линковки для платформы (need) -set(PLATFORM_LDFLAGS - "-laws-cpp-sdk-s3" - "-laws-cpp-sdk-kinesis" - "-laws-cpp-sdk-core" - "-laws-cpp-sdk-transfer" - "-lpthread" - "-lrt" - "-ldl" - "-fPIC" - "-lsnappy" - "-lgflags" - "-lz" - "-lbz2" - "-llz4" - "-lzstd" - "-lnuma" - "-ltbb" - "-luring" - "-ldl" -) - -# Флаги компиляции для платформы (?) -set(PLATFORM_CCFLAGS - "-DROCKSDB_PLATFORM_POSIX" - "-DROCKSDB_LIB_IO_POSIX" - "-DOS_LINUX" - "-fno-builtin-memcmp" - "-DROCKSDB_FALLOCATE_PRESENT" - "-DSNAPPY" - "-DGFLAGS=1" - "-DZLIB" - "-DBZIP2" - "-DLZ4" - "-DZSTD" - "-DNUMA" - "-DTBB" - "-DROCKSDB_MALLOC_USABLE_SIZE" - "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX" - "-DROCKSDB_BACKTRACE" - "-DROCKSDB_RANGESYNC_PRESENT" - "-DROCKSDB_SCHED_GETCPU_PRESENT" - "-DROCKSDB_AUXV_GETAUXVAL_PRESENT" - "-DROCKSDB_IOURING_PRESENT" - "-I/usr/local/include/" - "-DUSE_AWS" - "-march=native" - "-DHAVE_UINT128_EXTENSION" -) - -set(PLATFORM_CXXFLAGS #(?) - "-std=c++17" - "-faligned-new" - "-DHAVE_ALIGNED_NEW" - "-DROCKSDB_PLATFORM_POSIX" - "-DROCKSDB_LIB_IO_POSIX" - "-DOS_LINUX" - "-fno-builtin-memcmp" - "-DROCKSDB_FALLOCATE_PRESENT" - "-DSNAPPY" - "-DGFLAGS=1" - "-DZLIB" - "-DBZIP2" - "-DLZ4" - "-DZSTD" - "-DNUMA" - "-DTBB" - "-DROCKSDB_MALLOC_USABLE_SIZE" - "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX" - "-DROCKSDB_BACKTRACE" - "-DROCKSDB_RANGESYNC_PRESENT" - "-DROCKSDB_SCHED_GETCPU_PRESENT" - "-DROCKSDB_AUXV_GETAUXVAL_PRESENT" - "-DROCKSDB_IOURING_PRESENT" - "-I/usr/local/include/" - "-DUSE_AWS" - "-march=native" - "-DHAVE_UINT128_EXTENSION" -) - -# Флаги для создания общих библиотек (?) -set(PLATFORM_SHARED_CFLAGS "-fPIC") -set(PLATFORM_SHARED_EXT "so") -set(PLATFORM_SHARED_LDFLAGS "-Wl,--no-as-needed -shared -Wl,-soname -Wl,") -set(PLATFORM_SHARED_VERSIONED true) - -# Флаги линковки для исполняемых файлов (?) -set(EXEC_LDFLAGS "-ldl") - -# JEMALLOC (?) -set(JEMALLOC_INCLUDE "") -set(JEMALLOC_LIB "") -set(JEMALLOC 1) -set(WITH_JEMALLOC_FLAG 1) - -# Версии RocksDB (?) -set(ROCKSDB_MAJOR 9) -set(ROCKSDB_MINOR 1) -set(ROCKSDB_PATCH 1) - -# Другие переменные (?) -set(CLANG_SCAN_BUILD "scan-build") -set(CLANG_ANALYZER "/usr/bin/clang++") -set(PROFILING_FLAGS "-pg") -set(FIND "find") -set(WATCH "watch") -set(FOLLY_PATH "") -set(LUA_PATH "") - -set(target_source facade/query_builder.cpp - utils/utils.c - facade/drivers/cassandra_driver/cassandra_driver.cpp - facade/drivers/rocksdb_driver/rocksdb_driver.cpp - facade/session.cpp - facade/command/cassandra_command/cas_transaction_command.cpp - facade/command/rocksdb_command/roc_transaction_command.cpp - facade/command/command.cpp - tam/src/ddl_func_tam.c - tam/src/index_scan_tam.c - tam/src/misc_func_tam.c - tam/src/mod_tuple_tam.c - tam/src/non_mod_tuple_tam.c - tam/src/parallel_scan_tam.c - tam/src/scan_func_tam.c - tam/src/slot_func_tam.c - tam/tam.c - cpp.cpp - hooks/src/hook.c - clouddb.c) +file(GLOB_RECURSE src ./*.cpp ./*.c ./*.hpp ./*.h) add_postgresql_extension( clouddb VERSION 1.0 - SOURCES ${cpp_sources} ${c_sources} + SOURCES ${src} SCRIPTS clouddb--1.0.sql REGRESS basic ) -link_directories("/home/user/rocksdb-cloud/") +link_directories("/usr/local/lib/rocksdb-cloud/") link_directories("/usr/local/pgsql/lib/") -include_directories("/home/user/rocksdb-cloud/include/") - -# Установка флагов компиляции -target_compile_options(clouddb PRIVATE ${PLATFORM_CXXFLAGS} ${PLATFORM_CCFLAGS}) +include_directories("/usr/local/lib/rocksdb-cloud/include/") -# Установка флагов линковки -target_link_libraries(clouddb PRIVATE rocksdb cassandra ${PLATFORM_LDFLAGS}) -target_link_libraries(clouddb cassandra pq) +target_link_libraries(clouddb PRIVATE rocksdb cassandra pq) diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c index 068a66aa78c..a9f12134724 100644 --- a/clouddb/src/clouddb/clouddb.c +++ b/clouddb/src/clouddb/clouddb.c @@ -5,12 +5,9 @@ #include <lib/stringinfo.h> #include <libpq/pqformat.h> -#include "cpp.h" #include "hooks/include/hook.h" PG_MODULE_MAGIC; void _PG_init() { - - hook_init(); } diff --git a/clouddb/src/clouddb/clouddb.h b/clouddb/src/clouddb/clouddb.h index 3cf9335ac16..0ccb750d0e1 100644 --- a/clouddb/src/clouddb/clouddb.h +++ b/clouddb/src/clouddb/clouddb.h @@ -3,8 +3,4 @@ #include <postgres.h> -typedef struct Quaternion { - double a, b, c, d; -} Quaternion; - -#endif // SAMPLES_QUARTERNION_H_ +#endif diff --git a/clouddb/src/clouddb/cpp.cpp b/clouddb/src/clouddb/cpp.cpp deleted file mode 100644 index 37703b5295e..00000000000 --- a/clouddb/src/clouddb/cpp.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "cpp.h" - -#include <algorithm> -#include <iostream> -#include <vector> - -int some::getA() { return this->a; } -int some::getB() { return this->b; } - -char *some::getMessa() { return this->messa; } - -EXPORT_C some *create_class(some *some2) { - some some1; - // std::cout << ((struct some_copy *)(some2))->message << "\n"; - some2 = &some1; - return some2; -} - -EXPORT_C int result() { - std::vector<int> vec = {5, 3, 8, 1, 2}; - std::sort(vec.begin(), vec.end()); - return vec[0]; -} - -EXPORT_C char *getMessa(some *some1) { return some1->getMessa(); } - -EXPORT_C int getAvalue() { - some somer; - return somer.a; -} - -EXPORT_C int getAwhichFunc() { - some somer; - return somer.getA(); -} - -EXPORT_C int setAndGetA(int k) { - some somer; - somer.setA(k); - return somer.getA(); -} - -EXPORT_C int getInClass(some *some1) { return some1->getB(); } diff --git a/clouddb/src/clouddb/cpp.h b/clouddb/src/clouddb/cpp.h deleted file mode 100644 index 5e0d0c7de38..00000000000 --- a/clouddb/src/clouddb/cpp.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef CPP_H -#define CPP_H - -#include "utils/c_export.h" - -#ifdef __cplusplus -#include <iostream> - -class some { -private: - char *messa; - int b; - -public: - char *getMessa(); - int getB(); - some(){}; - some(char *m) : messa(m){}; - int a = 5; - int getA(); - int setA(int i) { - a = i; - return a; - } - ~some() { std::cout << "adios amigos" << "\n"; } -}; - -struct some_copy { - int message; -}; - -#else -typedef struct some1 { - int message; -} some; - -#endif // class - -EXPORT_C int getInClass(some *some1); - -EXPORT_C char *getMessa(some *some1); - -EXPORT_C some *create_class(some *some2); - -EXPORT_C int result(); - -EXPORT_C int getAvalue(); - -EXPORT_C int getAwhichFunc(); - -EXPORT_C int setAndGetA(int k); - -#endif diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h index 5c150f57090..730be9dd8d2 100644 --- a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h +++ b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h @@ -16,31 +16,27 @@ extern "C" { #ifdef __cplusplus +#include <bits/std_thread.h> +#include <rocksdb/cloud/db_cloud.h> +#include <rocksdb/db.h> +#include <rocksdb/iterator.h> +#include <rocksdb/listener.h> +#include <rocksdb/options.h> +#include <rocksdb/slice.h> +#include <sstream> #include <string> #include <unordered_map> -#include <sstream> #include "../../../utils/utils.h" #include "../../utils/metadata.h" -#include <rocksdb/listener.h> -#include <rocksdb/options.h> -#include <rocksdb/db.h> -#include <rocksdb/slice.h> -#include <rocksdb/iterator.h> - -#include <bits/std_thread.h> - -#include <rocksdb/cloud/db_cloud.h> -#include <rocksdb/options.h> - - -class RocksDBDriver: public IDriver { -private: +class RocksDBDriver : public IDriver { + private: ROCKSDB_NAMESPACE::DBCloud* db; - std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> columnFamilies; + std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> + columnFamilies; - //require live for correct work + // require live for correct work std::unordered_map<std::string, ItemPointerData> mapPointers; ROCKSDB_NAMESPACE::WriteOptions wopt; std::shared_ptr<ROCKSDB_NAMESPACE::FileSystem> cloud_fs; @@ -48,24 +44,28 @@ private: std::unique_ptr<ROCKSDB_NAMESPACE::Env> cloud_env; ROCKSDB_NAMESPACE::CloudFileSystemOptions cloud_fs_options; ROCKSDB_NAMESPACE::CloudFileSystem* cfs; -public: + + public: ~RocksDBDriver() = default; RocksDBDriver(std::unordered_map<std::string, std::string> config); void createTable(std::string tableName); - void insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) ; + void insertData(std::string tableName, std::vector<std::string> fieldName, + std::vector<std::string> fieldData, std::vector<size_t> sizes, + ItemPointerData pointer); void beginScan(Relation relation, Snapshot snapshot, int nkeys, - struct ScanKeyData* key, - ParallelTableScanDesc parallel_scan, uint32 flags, - TransactionId id) { return; }; + struct ScanKeyData* key, ParallelTableScanDesc parallel_scan, + uint32 flags, TransactionId id) { + return; + }; int selectData(Snapshot snapshot) { return 0; }; char** getValue() { return 0; }; ItemPointerData getTid() { return ItemPointerData(); }; ItemPointerData getNewPointer(std::string tableName); - ItemPointerData getLastPointer(const std::string &tableName); + ItemPointerData getLastPointer(const std::string& tableName); void startFlushThread(); void stopFlushThread(); @@ -73,5 +73,4 @@ public: #endif - -#endif \ No newline at end of file +#endif diff --git a/clouddb/src/clouddb/utils/utils.c b/clouddb/src/clouddb/utils/utils.c index b4d4f54c321..d0a478e6c31 100644 --- a/clouddb/src/clouddb/utils/utils.c +++ b/clouddb/src/clouddb/utils/utils.c @@ -1,5 +1,4 @@ #include "utils.h" -#include "../facade/session.h" uint32 get_event_horizont_xmin() { uint32 xmin = 0; diff --git a/test/main.py b/test/main.py new file mode 100644 index 00000000000..b78b993ce23 --- /dev/null +++ b/test/main.py @@ -0,0 +1,51 @@ +import psycopg2 + +# Настройки подключения +DB_HOST = "localhost" # РРјСЏ сервиса РІ Docker-Compose или 127.0.0.1, если РїРѕСЂС‚ проброшен +DB_PORT = "5432" # РџРѕСЂС‚ PostgreSQL (РїРѕ умолчанию 5432) +DB_NAME = "postgres" # РРјСЏ БД (РїРѕ умолчанию postgres) +DB_USER = "postgres" # РРјСЏ пользователя +DB_PASS = "db" # Пароль (замени РЅР° СЃРІРѕР№) + +# Подключение Рє PostgreSQL +try: + conn = psycopg2.connect( + host=DB_HOST, + port=DB_PORT, + dbname=DB_NAME, + user=DB_USER, + password=DB_PASS + ) + conn.autocommit = True + cursor = conn.cursor() + + # Создаём расширение + print("Создаём расширение clouddb...") + cursor.execute("CREATE EXTENSION IF NOT EXISTS clouddb;") + + # Создаём таблицу + print("Создаём таблицу mytable...") + cursor.execute("DROP TABLE IF EXISTS mytable;") + cursor.execute("CREATE TABLE mytable (title text, content text) USING clouddb;") + + # Вставляем тестовые данные + print("Добавляем тестовые данные...") + cursor.execute("INSERT INTO mytable (title, content) VALUES ('Hello', 'This is a test entry');") + cursor.execute("INSERT INTO mytable (title, content) VALUES ('PostgreSQL', 'Running in Docker!');") + + # Выполняем тестовый запрос + print("Выполняем SELECT * FROM mytable:") + cursor.execute("SELECT * FROM mytable;") + rows = cursor.fetchall() + + for row in rows: + print(row) + + # Закрываем соединение + cursor.close() + conn.close() + print("вњ… Тест завершён успешно!") + +except Exception as e: + print(f"Ошибка: {e}") + -- GitLab From 0c40795d15e27c0a96589a6879f47c0815b9dbe8 Mon Sep 17 00:00:00 2001 From: Snezhana Zhuiko <zhuikosnezhana@gmail.com> Date: Mon, 10 Mar 2025 16:38:00 +0700 Subject: [PATCH 4/5] Revert "feat: Dockerfile" This reverts commit 11c51afe8a88108424b479d02521433b7d5afc83. --- .gitmodules | 6 - clouddb/Dockerfile | 26 +-- clouddb/external/aws | 1 - clouddb/external/rocksdb | 1 - clouddb/src/clouddb/CMakeLists.txt | 149 +++++++++++++++++- clouddb/src/clouddb/clouddb.c | 3 + clouddb/src/clouddb/clouddb.h | 6 +- clouddb/src/clouddb/cpp.cpp | 43 +++++ clouddb/src/clouddb/cpp.h | 53 +++++++ .../drivers/rocksdb_driver/rocksdb_driver.h | 49 +++--- clouddb/src/clouddb/utils/utils.c | 1 + test/main.py | 51 ------ 12 files changed, 278 insertions(+), 111 deletions(-) delete mode 160000 clouddb/external/aws delete mode 160000 clouddb/external/rocksdb create mode 100644 clouddb/src/clouddb/cpp.cpp create mode 100644 clouddb/src/clouddb/cpp.h delete mode 100644 test/main.py diff --git a/.gitmodules b/.gitmodules index 53bfa81d11b..a03f69df67a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,9 +5,3 @@ [submodule "clouddb/external/cassandra_driver"] path = clouddb/external/cassandra_driver url = https://github.com/datastax/cpp-driver.git -[submodule "clouddb/external/aws"] - path = clouddb/external/aws - url = https://github.com/aws/aws-sdk-cpp.git -[submodule "clouddb/external/rocksdb"] - path = clouddb/external/rocksdb - url = https://github.com/undy11203/rocksdb-cloud.git diff --git a/clouddb/Dockerfile b/clouddb/Dockerfile index 5ef9b36f975..6a3e9b5fc8c 100644 --- a/clouddb/Dockerfile +++ b/clouddb/Dockerfile @@ -21,7 +21,10 @@ RUN apt-get update && apt-get install -y \ libpq-dev \ icu-devtools \ libicu-dev \ - git \ + git + +# Устанавливаем зависимости для СЃР±РѕСЂРєРё расширения Рё Cassandra драйвера +RUN apt-get update && apt-get install -y \ libpq-dev \ libuv1-dev \ libssl-dev \ @@ -30,7 +33,6 @@ RUN apt-get update && apt-get install -y \ WORKDIR /usr/src -# РЎР±РѕСЂРєР° драйвера Cassandra COPY external/cassandra_driver /usr/src/cassandra_driver RUN cd /usr/src/cassandra_driver && \ mkdir /usr/src/cassandra_driver/build && cd /usr/src/cassandra_driver/build && \ @@ -39,24 +41,6 @@ RUN cd /usr/src/cassandra_driver && \ make install && \ ldconfig -# РЎР±РѕСЂРєР° AWS SDK, зависимости для RocksDB-Cloud -COPY external/aws /usr/src/aws_sdk -RUN cd /usr/src/aws_sdk &&\ - cmake -DCMAKE_BUILD_TYPE=Release '-DBUILD_ONLY=kinesis;core;s3;transfer' -S . -B build && cd build && \ - make -j8 && \ - make install && \ - ldconfig - -COPY external/rocksdb /usr/src/rocksdb -ENV USE_AWS=1 -ENV USE_RTTI=1 -ENV DISABLE_WARNING_AS_ERROR=1 -RUN cd /usr/src/rocksdb &&\ - make -j8 static_lib &&\ - ldconfig - - -# РЎР±РѕСЂРєР° постгреса COPY external/postgres /usr/src/postgres RUN /usr/src/postgres/configure --prefix=/usr/local/pgsql --without-icu --without-perl && \ make -j8 && \ @@ -66,8 +50,6 @@ RUN useradd -m -U -r -d /home/postgres -s /bin/bash postgres && \ mkdir -p /var/lib/postgresql && \ chown -R postgres:postgres /var/lib/postgresql /home/postgres - - ############################################## # Stage 1: РЎР±РѕСЂРєР° CloudDB ############################################## diff --git a/clouddb/external/aws b/clouddb/external/aws deleted file mode 160000 index 00fb461a3ca..00000000000 --- a/clouddb/external/aws +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 00fb461a3cac85baf4a1ffc98fb4fc2f9cf3a1bd diff --git a/clouddb/external/rocksdb b/clouddb/external/rocksdb deleted file mode 160000 index 5d44ac66b33..00000000000 --- a/clouddb/external/rocksdb +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5d44ac66b337b0dd79675d5761c7b6887c8c79a4 diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt index 61ef58193f7..0b11d0ba4f5 100644 --- a/clouddb/src/clouddb/CMakeLists.txt +++ b/clouddb/src/clouddb/CMakeLists.txt @@ -1,17 +1,156 @@ -file(GLOB_RECURSE src ./*.cpp ./*.c ./*.hpp ./*.h) + +set(USE_AWS 1) #(?) + +# Платформа (?) +set(PLATFORM "OS_LINUX") + +# Флаги линковки для платформы (need) +set(PLATFORM_LDFLAGS + "-laws-cpp-sdk-s3" + "-laws-cpp-sdk-kinesis" + "-laws-cpp-sdk-core" + "-laws-cpp-sdk-transfer" + "-lpthread" + "-lrt" + "-ldl" + "-fPIC" + "-lsnappy" + "-lgflags" + "-lz" + "-lbz2" + "-llz4" + "-lzstd" + "-lnuma" + "-ltbb" + "-luring" + "-ldl" +) + +# Флаги компиляции для платформы (?) +set(PLATFORM_CCFLAGS + "-DROCKSDB_PLATFORM_POSIX" + "-DROCKSDB_LIB_IO_POSIX" + "-DOS_LINUX" + "-fno-builtin-memcmp" + "-DROCKSDB_FALLOCATE_PRESENT" + "-DSNAPPY" + "-DGFLAGS=1" + "-DZLIB" + "-DBZIP2" + "-DLZ4" + "-DZSTD" + "-DNUMA" + "-DTBB" + "-DROCKSDB_MALLOC_USABLE_SIZE" + "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX" + "-DROCKSDB_BACKTRACE" + "-DROCKSDB_RANGESYNC_PRESENT" + "-DROCKSDB_SCHED_GETCPU_PRESENT" + "-DROCKSDB_AUXV_GETAUXVAL_PRESENT" + "-DROCKSDB_IOURING_PRESENT" + "-I/usr/local/include/" + "-DUSE_AWS" + "-march=native" + "-DHAVE_UINT128_EXTENSION" +) + +set(PLATFORM_CXXFLAGS #(?) + "-std=c++17" + "-faligned-new" + "-DHAVE_ALIGNED_NEW" + "-DROCKSDB_PLATFORM_POSIX" + "-DROCKSDB_LIB_IO_POSIX" + "-DOS_LINUX" + "-fno-builtin-memcmp" + "-DROCKSDB_FALLOCATE_PRESENT" + "-DSNAPPY" + "-DGFLAGS=1" + "-DZLIB" + "-DBZIP2" + "-DLZ4" + "-DZSTD" + "-DNUMA" + "-DTBB" + "-DROCKSDB_MALLOC_USABLE_SIZE" + "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX" + "-DROCKSDB_BACKTRACE" + "-DROCKSDB_RANGESYNC_PRESENT" + "-DROCKSDB_SCHED_GETCPU_PRESENT" + "-DROCKSDB_AUXV_GETAUXVAL_PRESENT" + "-DROCKSDB_IOURING_PRESENT" + "-I/usr/local/include/" + "-DUSE_AWS" + "-march=native" + "-DHAVE_UINT128_EXTENSION" +) + +# Флаги для создания общих библиотек (?) +set(PLATFORM_SHARED_CFLAGS "-fPIC") +set(PLATFORM_SHARED_EXT "so") +set(PLATFORM_SHARED_LDFLAGS "-Wl,--no-as-needed -shared -Wl,-soname -Wl,") +set(PLATFORM_SHARED_VERSIONED true) + +# Флаги линковки для исполняемых файлов (?) +set(EXEC_LDFLAGS "-ldl") + +# JEMALLOC (?) +set(JEMALLOC_INCLUDE "") +set(JEMALLOC_LIB "") +set(JEMALLOC 1) +set(WITH_JEMALLOC_FLAG 1) + +# Версии RocksDB (?) +set(ROCKSDB_MAJOR 9) +set(ROCKSDB_MINOR 1) +set(ROCKSDB_PATCH 1) + +# Другие переменные (?) +set(CLANG_SCAN_BUILD "scan-build") +set(CLANG_ANALYZER "/usr/bin/clang++") +set(PROFILING_FLAGS "-pg") +set(FIND "find") +set(WATCH "watch") +set(FOLLY_PATH "") +set(LUA_PATH "") + +set(target_source facade/query_builder.cpp + utils/utils.c + facade/drivers/cassandra_driver/cassandra_driver.cpp + facade/drivers/rocksdb_driver/rocksdb_driver.cpp + facade/session.cpp + facade/command/cassandra_command/cas_transaction_command.cpp + facade/command/rocksdb_command/roc_transaction_command.cpp + facade/command/command.cpp + tam/src/ddl_func_tam.c + tam/src/index_scan_tam.c + tam/src/misc_func_tam.c + tam/src/mod_tuple_tam.c + tam/src/non_mod_tuple_tam.c + tam/src/parallel_scan_tam.c + tam/src/scan_func_tam.c + tam/src/slot_func_tam.c + tam/tam.c + cpp.cpp + hooks/src/hook.c + clouddb.c) add_postgresql_extension( clouddb VERSION 1.0 - SOURCES ${src} + SOURCES ${cpp_sources} ${c_sources} SCRIPTS clouddb--1.0.sql REGRESS basic ) -link_directories("/usr/local/lib/rocksdb-cloud/") +link_directories("/home/user/rocksdb-cloud/") link_directories("/usr/local/pgsql/lib/") -include_directories("/usr/local/lib/rocksdb-cloud/include/") +include_directories("/home/user/rocksdb-cloud/include/") + +# Установка флагов компиляции +target_compile_options(clouddb PRIVATE ${PLATFORM_CXXFLAGS} ${PLATFORM_CCFLAGS}) +# Установка флагов линковки +target_link_libraries(clouddb PRIVATE rocksdb cassandra ${PLATFORM_LDFLAGS}) -target_link_libraries(clouddb PRIVATE rocksdb cassandra pq) +target_link_libraries(clouddb cassandra pq) diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c index a9f12134724..068a66aa78c 100644 --- a/clouddb/src/clouddb/clouddb.c +++ b/clouddb/src/clouddb/clouddb.c @@ -5,9 +5,12 @@ #include <lib/stringinfo.h> #include <libpq/pqformat.h> +#include "cpp.h" #include "hooks/include/hook.h" PG_MODULE_MAGIC; void _PG_init() { + + hook_init(); } diff --git a/clouddb/src/clouddb/clouddb.h b/clouddb/src/clouddb/clouddb.h index 0ccb750d0e1..3cf9335ac16 100644 --- a/clouddb/src/clouddb/clouddb.h +++ b/clouddb/src/clouddb/clouddb.h @@ -3,4 +3,8 @@ #include <postgres.h> -#endif +typedef struct Quaternion { + double a, b, c, d; +} Quaternion; + +#endif // SAMPLES_QUARTERNION_H_ diff --git a/clouddb/src/clouddb/cpp.cpp b/clouddb/src/clouddb/cpp.cpp new file mode 100644 index 00000000000..37703b5295e --- /dev/null +++ b/clouddb/src/clouddb/cpp.cpp @@ -0,0 +1,43 @@ +#include "cpp.h" + +#include <algorithm> +#include <iostream> +#include <vector> + +int some::getA() { return this->a; } +int some::getB() { return this->b; } + +char *some::getMessa() { return this->messa; } + +EXPORT_C some *create_class(some *some2) { + some some1; + // std::cout << ((struct some_copy *)(some2))->message << "\n"; + some2 = &some1; + return some2; +} + +EXPORT_C int result() { + std::vector<int> vec = {5, 3, 8, 1, 2}; + std::sort(vec.begin(), vec.end()); + return vec[0]; +} + +EXPORT_C char *getMessa(some *some1) { return some1->getMessa(); } + +EXPORT_C int getAvalue() { + some somer; + return somer.a; +} + +EXPORT_C int getAwhichFunc() { + some somer; + return somer.getA(); +} + +EXPORT_C int setAndGetA(int k) { + some somer; + somer.setA(k); + return somer.getA(); +} + +EXPORT_C int getInClass(some *some1) { return some1->getB(); } diff --git a/clouddb/src/clouddb/cpp.h b/clouddb/src/clouddb/cpp.h new file mode 100644 index 00000000000..5e0d0c7de38 --- /dev/null +++ b/clouddb/src/clouddb/cpp.h @@ -0,0 +1,53 @@ +#ifndef CPP_H +#define CPP_H + +#include "utils/c_export.h" + +#ifdef __cplusplus +#include <iostream> + +class some { +private: + char *messa; + int b; + +public: + char *getMessa(); + int getB(); + some(){}; + some(char *m) : messa(m){}; + int a = 5; + int getA(); + int setA(int i) { + a = i; + return a; + } + ~some() { std::cout << "adios amigos" << "\n"; } +}; + +struct some_copy { + int message; +}; + +#else +typedef struct some1 { + int message; +} some; + +#endif // class + +EXPORT_C int getInClass(some *some1); + +EXPORT_C char *getMessa(some *some1); + +EXPORT_C some *create_class(some *some2); + +EXPORT_C int result(); + +EXPORT_C int getAvalue(); + +EXPORT_C int getAwhichFunc(); + +EXPORT_C int setAndGetA(int k); + +#endif diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h index 730be9dd8d2..5c150f57090 100644 --- a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h +++ b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h @@ -16,27 +16,31 @@ extern "C" { #ifdef __cplusplus -#include <bits/std_thread.h> -#include <rocksdb/cloud/db_cloud.h> -#include <rocksdb/db.h> -#include <rocksdb/iterator.h> -#include <rocksdb/listener.h> -#include <rocksdb/options.h> -#include <rocksdb/slice.h> -#include <sstream> #include <string> #include <unordered_map> +#include <sstream> #include "../../../utils/utils.h" #include "../../utils/metadata.h" -class RocksDBDriver : public IDriver { - private: +#include <rocksdb/listener.h> +#include <rocksdb/options.h> +#include <rocksdb/db.h> +#include <rocksdb/slice.h> +#include <rocksdb/iterator.h> + +#include <bits/std_thread.h> + +#include <rocksdb/cloud/db_cloud.h> +#include <rocksdb/options.h> + + +class RocksDBDriver: public IDriver { +private: ROCKSDB_NAMESPACE::DBCloud* db; - std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> - columnFamilies; + std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> columnFamilies; - // require live for correct work + //require live for correct work std::unordered_map<std::string, ItemPointerData> mapPointers; ROCKSDB_NAMESPACE::WriteOptions wopt; std::shared_ptr<ROCKSDB_NAMESPACE::FileSystem> cloud_fs; @@ -44,28 +48,24 @@ class RocksDBDriver : public IDriver { std::unique_ptr<ROCKSDB_NAMESPACE::Env> cloud_env; ROCKSDB_NAMESPACE::CloudFileSystemOptions cloud_fs_options; ROCKSDB_NAMESPACE::CloudFileSystem* cfs; - - public: +public: ~RocksDBDriver() = default; RocksDBDriver(std::unordered_map<std::string, std::string> config); void createTable(std::string tableName); - void insertData(std::string tableName, std::vector<std::string> fieldName, - std::vector<std::string> fieldData, std::vector<size_t> sizes, - ItemPointerData pointer); + void insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) ; void beginScan(Relation relation, Snapshot snapshot, int nkeys, - struct ScanKeyData* key, ParallelTableScanDesc parallel_scan, - uint32 flags, TransactionId id) { - return; - }; + struct ScanKeyData* key, + ParallelTableScanDesc parallel_scan, uint32 flags, + TransactionId id) { return; }; int selectData(Snapshot snapshot) { return 0; }; char** getValue() { return 0; }; ItemPointerData getTid() { return ItemPointerData(); }; ItemPointerData getNewPointer(std::string tableName); - ItemPointerData getLastPointer(const std::string& tableName); + ItemPointerData getLastPointer(const std::string &tableName); void startFlushThread(); void stopFlushThread(); @@ -73,4 +73,5 @@ class RocksDBDriver : public IDriver { #endif -#endif + +#endif \ No newline at end of file diff --git a/clouddb/src/clouddb/utils/utils.c b/clouddb/src/clouddb/utils/utils.c index d0a478e6c31..b4d4f54c321 100644 --- a/clouddb/src/clouddb/utils/utils.c +++ b/clouddb/src/clouddb/utils/utils.c @@ -1,4 +1,5 @@ #include "utils.h" +#include "../facade/session.h" uint32 get_event_horizont_xmin() { uint32 xmin = 0; diff --git a/test/main.py b/test/main.py deleted file mode 100644 index b78b993ce23..00000000000 --- a/test/main.py +++ /dev/null @@ -1,51 +0,0 @@ -import psycopg2 - -# Настройки подключения -DB_HOST = "localhost" # РРјСЏ сервиса РІ Docker-Compose или 127.0.0.1, если РїРѕСЂС‚ проброшен -DB_PORT = "5432" # РџРѕСЂС‚ PostgreSQL (РїРѕ умолчанию 5432) -DB_NAME = "postgres" # РРјСЏ БД (РїРѕ умолчанию postgres) -DB_USER = "postgres" # РРјСЏ пользователя -DB_PASS = "db" # Пароль (замени РЅР° СЃРІРѕР№) - -# Подключение Рє PostgreSQL -try: - conn = psycopg2.connect( - host=DB_HOST, - port=DB_PORT, - dbname=DB_NAME, - user=DB_USER, - password=DB_PASS - ) - conn.autocommit = True - cursor = conn.cursor() - - # Создаём расширение - print("Создаём расширение clouddb...") - cursor.execute("CREATE EXTENSION IF NOT EXISTS clouddb;") - - # Создаём таблицу - print("Создаём таблицу mytable...") - cursor.execute("DROP TABLE IF EXISTS mytable;") - cursor.execute("CREATE TABLE mytable (title text, content text) USING clouddb;") - - # Вставляем тестовые данные - print("Добавляем тестовые данные...") - cursor.execute("INSERT INTO mytable (title, content) VALUES ('Hello', 'This is a test entry');") - cursor.execute("INSERT INTO mytable (title, content) VALUES ('PostgreSQL', 'Running in Docker!');") - - # Выполняем тестовый запрос - print("Выполняем SELECT * FROM mytable:") - cursor.execute("SELECT * FROM mytable;") - rows = cursor.fetchall() - - for row in rows: - print(row) - - # Закрываем соединение - cursor.close() - conn.close() - print("вњ… Тест завершён успешно!") - -except Exception as e: - print(f"Ошибка: {e}") - -- GitLab From 89f4b4a5a32a4a9310b5c889b318cd503cff8b17 Mon Sep 17 00:00:00 2001 From: Snezhana Zhuiko <zhuikosnezhana@gmail.com> Date: Mon, 10 Mar 2025 16:38:18 +0700 Subject: [PATCH 5/5] Revert "Merge branch 'rocksdb' into 'cpp'" This reverts commit fe45a123b2c84103e56d6835587d989def483cbd, reversing changes made to 6ccd3e556afd4ffe3bad57a39e9e628d860a38d5. --- clouddb/CMakeLists.txt | 4 +- clouddb/src/clouddb/CMakeLists.txt | 167 +++------------ clouddb/src/clouddb/clouddb.c | 6 +- .../cas_transaction_command.cpp | 10 +- .../src/clouddb/facade/command/command.cpp | 11 +- clouddb/src/clouddb/facade/command/command.h | 2 - .../roc_transaction_command.cpp | 150 ------------- .../rocksdb_command/roc_transaction_command.h | 89 -------- .../cassandra_driver/cassandra_driver.cpp | 121 ++++------- .../drivers/rocksdb_driver/rocksdb_driver.cpp | 200 ------------------ .../drivers/rocksdb_driver/rocksdb_driver.h | 77 ------- clouddb/src/clouddb/facade/query_builder.cpp | 2 + clouddb/src/clouddb/facade/session.cpp | 2 - clouddb/src/clouddb/facade/session.h | 6 +- clouddb/src/clouddb/tam/all_tam.h | 109 +++++++++- clouddb/src/clouddb/tam/src/mod_tuple_tam.c | 6 - clouddb/src/clouddb/tam/src/scan_func_tam.c | 4 - clouddb/src/clouddb/tam/tam.c | 19 +- 18 files changed, 205 insertions(+), 780 deletions(-) delete mode 100644 clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp delete mode 100644 clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h delete mode 100644 clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp delete mode 100644 clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h diff --git a/clouddb/CMakeLists.txt b/clouddb/CMakeLists.txt index ed3ddfec540..2d4742869cb 100644 --- a/clouddb/CMakeLists.txt +++ b/clouddb/CMakeLists.txt @@ -5,9 +5,7 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) find_package(PostgreSQL REQUIRED) -# set(CMAKE_BUILD_TYPE Debug) - -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 14) include_directories(${PostgreSQL_INCLUDE_DIRS} ${PostgreSQL_SERVER_INCLUDE_DIRS}) diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt index 0b11d0ba4f5..a92292c4226 100644 --- a/clouddb/src/clouddb/CMakeLists.txt +++ b/clouddb/src/clouddb/CMakeLists.txt @@ -1,139 +1,31 @@ - -set(USE_AWS 1) #(?) - -# Платформа (?) -set(PLATFORM "OS_LINUX") - -# Флаги линковки для платформы (need) -set(PLATFORM_LDFLAGS - "-laws-cpp-sdk-s3" - "-laws-cpp-sdk-kinesis" - "-laws-cpp-sdk-core" - "-laws-cpp-sdk-transfer" - "-lpthread" - "-lrt" - "-ldl" - "-fPIC" - "-lsnappy" - "-lgflags" - "-lz" - "-lbz2" - "-llz4" - "-lzstd" - "-lnuma" - "-ltbb" - "-luring" - "-ldl" +set(cpp_sources + facade/query_builder.cpp + facade/drivers/cassandra_driver/cassandra_driver.cpp + facade/session.cpp + facade/command/cassandra_command/cas_transaction_command.cpp + facade/command/command.cpp + facade/utils/utils.cpp + cpp.cpp ) -# Флаги компиляции для платформы (?) -set(PLATFORM_CCFLAGS - "-DROCKSDB_PLATFORM_POSIX" - "-DROCKSDB_LIB_IO_POSIX" - "-DOS_LINUX" - "-fno-builtin-memcmp" - "-DROCKSDB_FALLOCATE_PRESENT" - "-DSNAPPY" - "-DGFLAGS=1" - "-DZLIB" - "-DBZIP2" - "-DLZ4" - "-DZSTD" - "-DNUMA" - "-DTBB" - "-DROCKSDB_MALLOC_USABLE_SIZE" - "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX" - "-DROCKSDB_BACKTRACE" - "-DROCKSDB_RANGESYNC_PRESENT" - "-DROCKSDB_SCHED_GETCPU_PRESENT" - "-DROCKSDB_AUXV_GETAUXVAL_PRESENT" - "-DROCKSDB_IOURING_PRESENT" - "-I/usr/local/include/" - "-DUSE_AWS" - "-march=native" - "-DHAVE_UINT128_EXTENSION" +set(c_sources + utils/utils.c + tam/src/ddl_func_tam.c + tam/src/index_scan_tam.c + tam/src/misc_func_tam.c + tam/src/mod_tuple_tam.c + tam/src/non_mod_tuple_tam.c + tam/src/parallel_scan_tam.c + tam/src/scan_func_tam.c + tam/src/slot_func_tam.c + tam/tam.c + iam/iam.c + iam/src/scan_func_iam.c + iam/src/mod_func_iam.c + hooks/src/hook.c + clouddb.c ) -set(PLATFORM_CXXFLAGS #(?) - "-std=c++17" - "-faligned-new" - "-DHAVE_ALIGNED_NEW" - "-DROCKSDB_PLATFORM_POSIX" - "-DROCKSDB_LIB_IO_POSIX" - "-DOS_LINUX" - "-fno-builtin-memcmp" - "-DROCKSDB_FALLOCATE_PRESENT" - "-DSNAPPY" - "-DGFLAGS=1" - "-DZLIB" - "-DBZIP2" - "-DLZ4" - "-DZSTD" - "-DNUMA" - "-DTBB" - "-DROCKSDB_MALLOC_USABLE_SIZE" - "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX" - "-DROCKSDB_BACKTRACE" - "-DROCKSDB_RANGESYNC_PRESENT" - "-DROCKSDB_SCHED_GETCPU_PRESENT" - "-DROCKSDB_AUXV_GETAUXVAL_PRESENT" - "-DROCKSDB_IOURING_PRESENT" - "-I/usr/local/include/" - "-DUSE_AWS" - "-march=native" - "-DHAVE_UINT128_EXTENSION" -) - -# Флаги для создания общих библиотек (?) -set(PLATFORM_SHARED_CFLAGS "-fPIC") -set(PLATFORM_SHARED_EXT "so") -set(PLATFORM_SHARED_LDFLAGS "-Wl,--no-as-needed -shared -Wl,-soname -Wl,") -set(PLATFORM_SHARED_VERSIONED true) - -# Флаги линковки для исполняемых файлов (?) -set(EXEC_LDFLAGS "-ldl") - -# JEMALLOC (?) -set(JEMALLOC_INCLUDE "") -set(JEMALLOC_LIB "") -set(JEMALLOC 1) -set(WITH_JEMALLOC_FLAG 1) - -# Версии RocksDB (?) -set(ROCKSDB_MAJOR 9) -set(ROCKSDB_MINOR 1) -set(ROCKSDB_PATCH 1) - -# Другие переменные (?) -set(CLANG_SCAN_BUILD "scan-build") -set(CLANG_ANALYZER "/usr/bin/clang++") -set(PROFILING_FLAGS "-pg") -set(FIND "find") -set(WATCH "watch") -set(FOLLY_PATH "") -set(LUA_PATH "") - -set(target_source facade/query_builder.cpp - utils/utils.c - facade/drivers/cassandra_driver/cassandra_driver.cpp - facade/drivers/rocksdb_driver/rocksdb_driver.cpp - facade/session.cpp - facade/command/cassandra_command/cas_transaction_command.cpp - facade/command/rocksdb_command/roc_transaction_command.cpp - facade/command/command.cpp - tam/src/ddl_func_tam.c - tam/src/index_scan_tam.c - tam/src/misc_func_tam.c - tam/src/mod_tuple_tam.c - tam/src/non_mod_tuple_tam.c - tam/src/parallel_scan_tam.c - tam/src/scan_func_tam.c - tam/src/slot_func_tam.c - tam/tam.c - cpp.cpp - hooks/src/hook.c - clouddb.c) - add_postgresql_extension( clouddb VERSION 1.0 @@ -142,15 +34,6 @@ add_postgresql_extension( REGRESS basic ) -link_directories("/home/user/rocksdb-cloud/") link_directories("/usr/local/pgsql/lib/") -include_directories("/home/user/rocksdb-cloud/include/") - -# Установка флагов компиляции -target_compile_options(clouddb PRIVATE ${PLATFORM_CXXFLAGS} ${PLATFORM_CCFLAGS}) - -# Установка флагов линковки -target_link_libraries(clouddb PRIVATE rocksdb cassandra ${PLATFORM_LDFLAGS}) - -target_link_libraries(clouddb cassandra pq) +target_link_libraries(clouddb cassandra pq) \ No newline at end of file diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c index 068a66aa78c..e0627b75b50 100644 --- a/clouddb/src/clouddb/clouddb.c +++ b/clouddb/src/clouddb/clouddb.c @@ -9,8 +9,12 @@ #include "hooks/include/hook.h" PG_MODULE_MAGIC; -void _PG_init() { +void _PG_init() { + char *m = "hello"; + some *some2 = &(some){.message = 6}; + some2 = create_class(some2); + // printf("%d\n", getInClass(some2)); hook_init(); } diff --git a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp index b7f9726559a..a5e3aee27ec 100644 --- a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp +++ b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp @@ -148,8 +148,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation)); int *fieldSize = (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation)); - // std::cout << "size: " << RelationGetNumberOfAttributes(relation) << - // std::endl; TupleDesc desc = slot->tts_tupleDescriptor; for (int i = 0; i < desc->natts; i++) { @@ -172,7 +170,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( this->operation = INSERT_VALUE; this->tableName = RelationGetRelationName(relation); - // std::cout << this->tableName << " tableName" << std::endl; this->fieldData = convertToVector(fieldData, RelationGetNumberOfAttributes(relation)); free(fieldData); @@ -184,10 +181,9 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand( this->fieldName.push_back(strdup(NameStr(attr->attname))); } + auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver()); slot->tts_tid = driver->getNewPointer( std::string(RelationGetRelationName(relation)), driver->getKeyspace()); - // std::cout << slot->tts_tid.ip_blkid.bi_hi << slot->tts_tid.ip_blkid.bi_lo - // << slot->tts_tid.ip_posid << std::endl; this->metadata.xmin = GetCurrentTransactionId(); this->metadata.xmin_commited = true; @@ -353,8 +349,6 @@ ITransactionCommand *CasTransactionCommand::createUpdateSlotCommand( (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation)); int *fieldSize = (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation)); - // std::cout << "size: " << RelationGetNumberOfAttributes(relation) << - // std::endl; TupleDesc desc = slot->tts_tupleDescriptor; for (int i = 0; i < desc->natts; i++) { @@ -425,4 +419,4 @@ ITransactionCommand *CasTransactionCommand::createTruncateTable( this->operation = TRUNCATE_TABLE; this->tableName = std::string(relName); return this; -} +} \ No newline at end of file diff --git a/clouddb/src/clouddb/facade/command/command.cpp b/clouddb/src/clouddb/facade/command/command.cpp index aa05b91fbf4..4f2a1095e94 100644 --- a/clouddb/src/clouddb/facade/command/command.cpp +++ b/clouddb/src/clouddb/facade/command/command.cpp @@ -5,11 +5,10 @@ ITransactionCommand *createTransactionCommand(std::shared_ptr<IDriver> driver) { return new CasTransactionCommand( std::dynamic_pointer_cast<CassandraDriver>(driver)); } - else if (std::dynamic_pointer_cast<RocksDBDriver>(driver)) { - return new RocTransactionCommand( - std::dynamic_pointer_cast<RocksDBDriver>(driver)); - } - + // else if (std::dynamic_pointer_cast<YDBDriver>(driver)) { + // return YDBTransactionCommand( + // std::dynamic_pointer_cast<YDBDriver>(driver)); + // } return nullptr; } @@ -117,4 +116,4 @@ EXPORT_C ITransactionCommand *update_tuple_to_index(Session *session, TupleTable ITransactionCommand *command = createTransactionCommand(session->getDriver()); command = command->update_tuple_to_index(session, slot, indexInfo, indexRelation, heapRelation); return command; -} +} \ No newline at end of file diff --git a/clouddb/src/clouddb/facade/command/command.h b/clouddb/src/clouddb/facade/command/command.h index 6b696365181..4e9a8d2c28c 100644 --- a/clouddb/src/clouddb/facade/command/command.h +++ b/clouddb/src/clouddb/facade/command/command.h @@ -5,8 +5,6 @@ // команды каждого драйвера #include "cassandra_command/cas_transaction_command.h" -#include "rocksdb_command/roc_transaction_command.h" - #ifdef __cplusplus diff --git a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp deleted file mode 100644 index fdcfe28b5bc..00000000000 --- a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp +++ /dev/null @@ -1,150 +0,0 @@ -#include "roc_transaction_command.h" -#include <iostream> - -namespace { -std::vector<std::string> convertToVector(char **charArray, int size) { - std::vector<std::string> result; - if (charArray == nullptr) { - return result; // Если РІС…РѕРґРЅРѕР№ указатель null, возвращаем пустой вектор - } - - // Перебираем каждый элемент массива charArray - for (size_t i = 0; i < size; ++i) { - if (charArray[i] != nullptr) { - result.emplace_back(charArray[i]); // Добавляем строку РІ вектор - } else { - result.emplace_back(""); // Добавляем пустую строку для nullptr - } - } - return result; -} - -std::vector<size_t> convertToVector(int *intArray, int size) { - std::vector<size_t> result; - for (int i = 0; i < size; i++) { - result.push_back(intArray[i]); - } - return result; -} -} // namespace - - -int RocTransactionCommand::execute() { - if (this->operation == RCREATE_TABLE) { - driver->createTable(tableName); - }else if(this->operation == RINSERT_VALUE) { - driver->insertData(tableName, fieldName, fieldData, fieldSize, pointer); - } - return 0; -} - -RocTransactionCommand::RocTransactionCommand(std::shared_ptr<RocksDBDriver> driver) { - this->driver = std::dynamic_pointer_cast<RocksDBDriver>(driver); -} - -ITransactionCommand *RocTransactionCommand::createCreateTableCommand( - Session *session, Relation rel) { - this->operation = RCREATE_TABLE; - - // забавно, РЅРѕ здесь нет РЅРё РѕРґРЅРѕР№ функции, Р° следовательно РѕРЅРё безопасны для - // c++ - this->tableName = std::string(RelationGetRelationName(rel)); - for (int i = 0; i < RelationGetNumberOfAttributes(rel); i++) { - Form_pg_attribute attr = TupleDescAttr(rel->rd_att, i); - this->fieldName.push_back(strdup(NameStr(attr->attname))); - } - return this; -} - -ITransactionCommand *RocTransactionCommand::createInsertCommand( - Session *session, Relation relation, TupleTableSlot *slot, CommandId cid, - int options, BulkInsertState bistate) { - char **fieldData = - (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation)); - int *fieldSize = - (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation)); - - TupleDesc desc = slot->tts_tupleDescriptor; - for (int i = 0; i < desc->natts; i++) { - if (slot->tts_isnull[i]) { - fieldData[i] = NULL; - fieldSize[i] = -1; - continue; - } - Oid outFunc; - bool typIsVarlena; - Form_pg_attribute attr = TupleDescAttr(desc, i); - getTypeOutputInfo(attr->atttypid, &outFunc, &typIsVarlena); - fieldData[i] = OidOutputFunctionCall(outFunc, slot->tts_values[i]); - fieldSize[i] = strlen(fieldData[i]); - } - - this->operation = RINSERT_VALUE; - - this->tableName = RelationGetRelationName(relation); - this->fieldData = - convertToVector(fieldData, RelationGetNumberOfAttributes(relation)); - free(fieldData); - this->fieldSize = - convertToVector(fieldSize, RelationGetNumberOfAttributes(relation)); - free(fieldSize); - for (int i = 0; i < RelationGetNumberOfAttributes(relation); i++) { - Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i); - this->fieldName.push_back(strdup(NameStr(attr->attname))); - } - - slot->tts_tid = driver->getNewPointer( - std::string(RelationGetRelationName(relation))); - pointer = slot->tts_tid; - return this; -} - -ITransactionCommand *RocTransactionCommand::beginScanCommand( - Session *session, Relation relation, Snapshot snapshot, int nkeys, - struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags, - TransactionId id) { - - return this; -} - -ITransactionCommand *RocTransactionCommand::selectDataCommand( - Session *session, Snapshot snapshot) { - - return this; -} - -ITransactionCommand *RocTransactionCommand::createDeleteSlotCommand( - Session *session, TransactionId id, ItemPointer newtid, Relation relation, - ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, - bool wait, TM_FailureData *tmfd, bool changingPart) { - - return this; -} - -ITransactionCommand *RocTransactionCommand::createUpdateSlotCommand( - Session *session, TransactionId id, Relation relation, ItemPointer otid, - TupleTableSlot *slot, CommandId cid, Snapshot snapshot, Snapshot crosscheck, - bool wait, TM_FailureData *tmfd, LockTupleMode *lockmode, - TU_UpdateIndexes *update_indexes) { - - return this; -} - -ITransactionCommand *RocTransactionCommand::createVacuumCommand( - Session *session, TransactionId id, Relation rel, VacuumParams *params, - BufferAccessStrategy bstrategy) { - - return this; -} - -ITransactionCommand *RocTransactionCommand::createDropTable(Session *session, - char *relName) { - - return this; -} - -ITransactionCommand *RocTransactionCommand::createTruncateTable( - Session *session, char *relName) { - - return this; -} diff --git a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h deleted file mode 100644 index 9ea6c2c3fd0..00000000000 --- a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef ROC_TRANSACTION_COMMAND_H -#define ROC_TRANSACTION_COMMAND_H - -#include "../../query_builder.h" -#include "../itransaction_command.h" - -#ifdef __cplusplus -#include <vector> - -#include "../../utils/metadata.h" - -enum RocTransactionOperation { - RCREATE_TABLE, - RINSERT_VALUE, - RBEGIN_SCAN, - RSELECT_DATA, - RDELETE_SLOT, - RUPDATE_SLOT, - RVACUUM_TABLE, - RTRUNCATE_TABLE, - RDROP_TABLE -}; - -class RocTransactionCommand : public ITransactionCommand { - private: - std::string tableName; - std::vector<std::string> fieldName; - std::vector<std::string> fieldData; - std::vector<size_t> fieldSize; -// RocksDBBuilder builder; - RocTransactionOperation operation; - ItemPointerData pointer; - Metadata metadata; - - // scan data - Relation relation; - Snapshot snapshot; - int nkeys; - struct ScanKeyData *key; - ParallelTableScanDesc parallel_scan; - uint32 flags; - TransactionId id; - - std::shared_ptr<RocksDBDriver> driver; - - public: - RocTransactionCommand() {}; - RocTransactionCommand(std::shared_ptr<RocksDBDriver> driver); - int execute() override; - ITransactionCommand *createCreateTableCommand(Session *session, - Relation rel) override; - ITransactionCommand *createInsertCommand(Session *session, Relation relation, - TupleTableSlot *slot, CommandId cid, - int options, - BulkInsertState bistate) override; - ITransactionCommand *beginScanCommand(Session *session, Relation relation, - Snapshot snapshot, int nkeys, - struct ScanKeyData *key, - ParallelTableScanDesc parallel_scan, - uint32 flags, - TransactionId id) override; - ITransactionCommand *selectDataCommand(Session *session, - Snapshot snapshot) override; - - ITransactionCommand *createDeleteSlotCommand( - Session *session, TransactionId id, ItemPointer newtid, Relation relation, - ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, - bool wait, TM_FailureData *tmfd, bool changingPart) override; - - ITransactionCommand *createUpdateSlotCommand( - Session *session, TransactionId id, Relation relation, ItemPointer otid, - TupleTableSlot *slot, CommandId cid, Snapshot snapshot, - Snapshot crosscheck, bool wait, TM_FailureData *tmfd, - LockTupleMode *lockmode, TU_UpdateIndexes *update_indexes) override; - - ITransactionCommand *createVacuumCommand( - Session *session, TransactionId id, Relation rel, VacuumParams *params, - BufferAccessStrategy bstrategy) override; - - ITransactionCommand *createDropTable(Session *session, - char *relName) override; - - ITransactionCommand *createTruncateTable(Session *session, - char *relName) override; -}; - -#endif // !__cplusplus - -#endif // !CAS_TRANSACTION_COMMAND_H diff --git a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp index a705bc3dfc1..acfbbc26379 100644 --- a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp +++ b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp @@ -5,7 +5,6 @@ #include <storage/itemptr.h> #include <cassandra.h> -#include <chrono> #include <cstring> #include <iostream> #include <unordered_map> @@ -125,12 +124,11 @@ CassandraDriver::CassandraDriver( : mapPointers() { builder = CassandraBuilder(); - this->hostname = config["cassandra.host"]; - this->keyspace = config["cassandra.keyspace"]; - this->replicationFactor = - std::atoi(config["cassandra.replication_factor"].c_str()); - // std::cout << this->hostname << " " << this->keyspace << " " - // << this->replicationFactor << std::endl; + hostname = config["cassandra.host"]; + keyspace = config["cassandra.keyspace"]; + replicationFactor = std::atoi(config["cassandra.replication_factor"].c_str()); + std::cout << this->hostname << " " << this->keyspace << " " + << this->replicationFactor << '\n'; clusterPtr = cass_cluster_new(); cass_cluster_set_contact_points(clusterPtr, hostname.data()); @@ -153,7 +151,6 @@ CassandraDriver::CassandraDriver( std::string query = this->builder.buildKeyspace(this->keyspace, this->replicationFactor); - // std::cout << query << std::endl; execCqlQuery(query); } @@ -181,14 +178,9 @@ void CassandraDriver::execCqlQuery(std::string query, Metadata metadata, int var) { CassError rc = CASS_OK; CassFuture *future = NULL; - // std::cout << query << std::endl; - // std::cout << metadata.mask << std::endl; CassStatement *statement = cass_statement_new(query.data(), var); convert data = {.data = metadata.ctid}; - // std::cout << metadata.t_ctid.ip_blkid.bi_hi << " " - // << metadata.t_ctid.ip_blkid.bi_lo << " " << - // metadata.t_ctid.ip_posid - // << std::endl; + cass_statement_bind_bytes(statement, var - 1, (cass_byte_t *)data.a, 6); bindPartMetadataInStatement(statement, metadata); @@ -212,7 +204,6 @@ void CassandraDriver::execCqlQuery(std::string query, CassError rc = CASS_OK; CassFuture *future = NULL; CassStatement *statement = cass_statement_new(query.data(), var); - // std::cout << "\n\n\n"; for (int i = 0; i < fields.size(); ++i) { char *a = const_cast<char *>(fields[i].c_str()); convert b; @@ -241,20 +232,11 @@ void CassandraDriver::execCqlQuery(std::string query, std::vector<std::string> fieldData, std::vector<size_t> fieldSize, Metadata metadata, int var) { - // auto start = std::chrono::high_resolution_clock::now(); CassError rc = CASS_OK; CassFuture *future = NULL; - static int i = 0; - i++; CassStatement *statement = cass_statement_new(query.data(), var); - static CassBatch *batch = NULL; - if (batch == NULL) - batch = cass_batch_new(CASS_BATCH_TYPE_UNLOGGED); // Создаем пакет - // std::cout << query << std::endl; - // std::cout << fieldData.size() << std::endl; for (int i = 0; i < fieldData.size(); ++i) { - // std::cout << fieldData[i] << " vlaue" << std::endl; if (fieldData[i] == "") { cass_statement_bind_null(statement, i + 1); continue; @@ -265,35 +247,43 @@ void CassandraDriver::execCqlQuery(std::string query, fieldSize[i]); } bindMetadataInStatement(statement, metadata, fieldData.size() + 1); - cass_batch_add_statement(batch, statement); + + future = cass_session_execute(this->sessionPtr, statement); + // cass_future_wait(future); + + // rc = cass_future_error_code(future); + // if (rc != CASS_OK) { + // const char *message; + // size_t message_length; + // cass_future_error_message(future, &message, &message_length); + // std::cerr << "Connection error: " << std::string(message, message_length) + // << std::endl; + // } + cass_future_free(future); cass_statement_free(statement); +} + +void CassandraDriver::execCqlQueryIndex(std::string query, + std::vector<std::string> fieldData, + std::vector<size_t> fieldSize, + Metadata metadata, int var) { + CassError rc = CASS_OK; + CassFuture *future = NULL; + CassStatement *statement = cass_statement_new(query.data(), var); + + for (int i = 0; i < fieldData.size(); ++i) { + if (fieldData[i] == "") { + cass_statement_bind_null(statement, i + 2); + continue; + } + + cass_statement_bind_bytes(statement, i + 2, + (const cass_byte_t *)fieldData[i].c_str(), + fieldSize[i]); + } + bindMetadataInStatementWithIndex(statement, metadata, fieldData.size() + 2); - if (i == 10) { - // std::cout << "yee " << batch << " " << &batch << std::endl; - i = 0; - - future = cass_session_execute_batch(this->sessionPtr, batch); - cass_batch_free(batch); // Освобождаем пакет - batch = NULL; - // cass_future_wait(future); - - // rc = cass_future_error_code(future); - // - // if (rc != CASS_OK) { - // const char *message; - // size_t message_length; - // cass_future_error_message(future, &message, &message_length); - // std::cout << "Connection error: " << std::string(message, - // message_length) - // << std::endl; - // } - } - // auto end = std::chrono::high_resolution_clock::now(); - // std::chrono::duration<double> duration = end - start; - // std::cout << "Время выполнения функции: " << duration.count() << " секунд." - // << std::endl; - - // future = cass_session_execute(this->sessionPtr, statement); + future = cass_session_execute(this->sessionPtr, statement); // cass_future_wait(future); // rc = cass_future_error_code(future); @@ -304,7 +294,8 @@ void CassandraDriver::execCqlQuery(std::string query, // std::cerr << "Connection error: " << std::string(message, message_length) // << std::endl; // } - // cass_future_free(future); + cass_future_free(future); + cass_statement_free(statement); } CassFuture *CassandraDriver::execCqlQueryWithRes(std::string query) { @@ -358,7 +349,6 @@ ItemPointerData CassandraDriver::getLastPointer(const std::string &tableName, } std::string query = builder.buildGetLastPointer(key, tableName); - // std::cout << "query last pointer: " << query << std::endl; CassFuture *future = execCqlQueryWithRes(query); ItemPointerData last = {}; @@ -512,11 +502,7 @@ int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) { CassRow *row = const_cast<CassRow *>(cass_iterator_get_row(this->iterator.iter)); CassError error = loadMetadata(row, metadata); - // std::cout << metadata.xmin << " " << metadata.xmax << " select" - // << std::endl; - if (!inVisibilityArea(metadata, snapshot, ReadNextTransactionId() - 1)) { - return selectData(snapshot); // надо пофиксить - } + this->iterator.row.value.clear(); this->iterator.row.size.clear(); @@ -537,12 +523,7 @@ int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) { cass_value_get_bytes(casValue, &bytes, &size); this->iterator.row.value.push_back(bytes); this->iterator.row.size.push_back(size); - } - const cass_byte_t *bytes; - cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"), &bytes, - &size); - // std::cout << "select data: " << this->iterator.row.value[0] << " " - // << this->iterator.row.size.size() << std::endl; + } return 1; } return 0; @@ -603,8 +584,7 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future, loadMetadata(row, metadata); cass_value_get_bytes(cass_row_get_column_by_name(row, KEY_NAME), &bytes, &size); - // std::cout << metadata.xmax << " xmax metadata and id - " << id - // << std::endl; + if (metadata.xmax == 0) { continue; } @@ -627,18 +607,11 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future, if (keysInBatch > 0) { std::vector<std::string> keysV; for (int i = 0; i < keysInBatch; i++) { - // std::cout << keys[i].data.ip_blkid.bi_hi << " " - // << keys[i].data.ip_blkid.bi_lo << " " << - // keys[i].data.ip_posid - // << std::endl; - // + keysV.emplace_back(keys[i].a, 6); char *a = const_cast<char *>(keysV[i].c_str()); convert b; memcpy(b.a, a, 6); - // std::cout << b.data.ip_blkid.bi_hi << " " << b.data.ip_blkid.bi_lo << " - // " - // << b.data.ip_posid << std::endl; } execCqlQuery(builder.buildDropTuple(keyspace, tableName, keysInBatch), keysV, keysInBatch); diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp deleted file mode 100644 index ac3be46eb23..00000000000 --- a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp +++ /dev/null @@ -1,200 +0,0 @@ -#include "rocksdb_driver.h" -#include <bits/this_thread_sleep.h> - -#include <iostream> - -using namespace ROCKSDB_NAMESPACE; - -std::string kDBPath = "/tmp/rocksdb_cloud_durable"; - -std::string kBucketSuffix = "cloud.durable.example."; -std::string kRegion = "us-west-2"; - -static const bool flushAtEnd = true; -static const bool disableWAL = false; - - -RocksDBDriver::RocksDBDriver(std::unordered_map<std::string, std::string> config) : mapPointers() { - std::cout << "Construct" << std::endl; - cloud_fs_options.aws_options.endpoint_override = "127.0.0.1:9000"; - - // Store a reference to a cloud file system. A new cloud env object should be - // associated with every new cloud-db. - - cloud_fs_options.credentials.InitializeSimple( - getenv("AWS_ACCESS_KEY_ID"), getenv("AWS_SECRET_ACCESS_KEY")); - if (!cloud_fs_options.credentials.HasValid().ok()) { - fprintf( - stderr, - "Please set env variables " - "AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY with cloud credentials"); - } - - // Append the user name to the bucket name in an attempt to make it - // globally unique. S3 bucket-names need to be globally unique. - // If you want to rerun this example, then unique user-name suffix here. - char* user = getenv("USER"); - kBucketSuffix.append(user); - - // "rockset." is the default bucket prefix - const std::string bucketPrefix = ""; - cloud_fs_options.src_bucket.SetBucketName(kBucketSuffix, bucketPrefix); - cloud_fs_options.dest_bucket.SetBucketName(kBucketSuffix, bucketPrefix); - - // create a bucket name for debugging purposes - const std::string bucketName = bucketPrefix + kBucketSuffix; - - // Create a new AWS cloud env Status - Status s = CloudFileSystemEnv::NewAwsFileSystem( - FileSystem::Default(), kBucketSuffix, kDBPath, kRegion, kBucketSuffix, - kDBPath, kRegion, cloud_fs_options, nullptr, &cfs); - if (!s.ok()) { - fprintf(stderr, "Unable to create cloud env in bucket %s. %s\n", - bucketName.c_str(), s.ToString().c_str()); - } - cloud_fs.reset(cfs); - - // Create options and use the AWS file system that we created earlier - cloud_env = NewCompositeEnv(cloud_fs); - options.env = cloud_env.get(); - options.create_if_missing = true; - - // No persistent read-cache - std::string persistent_cache = ""; - - // options for each write - wopt.disableWAL = disableWAL; - - // open DB - s = DBCloud::Open(options, kDBPath, persistent_cache, 0, &db); - if (!s.ok()) { - throw std::runtime_error("Unable to open db at path1 " + - kDBPath + - " with bucket " + - bucketName + - ". " + - s.ToString() + "\n"); - } - - - /*********************** - * * - * Test * - * * - ************************/ - - // s = db->Put(wopt, "key1", "value"); - - // db->Flush(FlushOptions()); - - // std::cout << "Test succes" << std::endl; -} - -void RocksDBDriver::createTable(std::string tableName){ - std::cout << "Create" << std::endl; - // ROCKSDB_NAMESPACE::ColumnFamilyOptions cfOptions; - // // Здесь можно настроить параметры семейства колонок, если необходимо - // ROCKSDB_NAMESPACE::ColumnFamilyHandle* cfHandle; - // auto status = db->CreateColumnFamily(cfOptions, tableName, &cfHandle); - // if (!status.ok()) { - // throw std::runtime_error("Unable to create column family: " + status.ToString()); - // } - - // // Сохраняем дескриптор семейства колонок РІ мапу - // columnFamilies[tableName] = cfHandle; -} - -void RocksDBDriver::insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) { - static int countOperation = 0; - - std::string key = std::to_string(pointer.ip_blkid.bi_hi) + "_" + - std::to_string(pointer.ip_blkid.bi_lo) + "_" + - std::to_string(pointer.ip_posid); - - std::string value; - for (size_t i = 0; i < fieldData.size(); ++i) { - value += fieldData[i]; - if (i < fieldData.size() - 1) { - value += "|"; // Use a delimiter to separate fields - } - } - - // auto batch = rocksdb::WriteBatch(); - auto status = db->Put(this->wopt, key, value); - - if (!status.ok()) { - throw std::runtime_error("Failed to insert data: " + status.ToString()); - } - - countOperation++; - if(countOperation % 50000 == 0){ - db->Flush(FlushOptions()); - } -} - -ItemPointerData RocksDBDriver::getNewPointer(std::string tableName) { - ItemPointerData data = getLastPointer(tableName); - if (data.ip_posid < UINT16_MAX) { - data.ip_posid++; - } else { - data.ip_posid = 1; - if (data.ip_blkid.bi_lo < UINT16_MAX) { - data.ip_blkid.bi_lo++; - } else { - data.ip_blkid.bi_lo = 0; - if (data.ip_blkid.bi_hi < UINT16_MAX) { - data.ip_blkid.bi_hi++; - } else { - data.ip_blkid.bi_hi = 0; - } - } - } - mapPointers[tableName] = data; - return data; -} - -ItemPointerData RocksDBDriver::getLastPointer(const std::string &tableName) { - auto it = this->mapPointers.find(tableName); - if (it != this->mapPointers.end()) { - return it->second; - } - - ItemPointerData last = {}; - ROCKSDB_NAMESPACE::ReadOptions readOptions; - ROCKSDB_NAMESPACE::Iterator* itr = db->NewIterator(readOptions); - - itr->SeekToLast(); - if (itr->Valid()) { - std::string lastKey = itr->key().ToString(); - std::istringstream iss(lastKey); - std::string token; - std::vector<uint16_t> parts; - - while (std::getline(iss, token, '_')) { - parts.push_back(static_cast<uint16_t>(std::stoi(token))); - } - - if (parts.size() == 3) { - last.ip_blkid.bi_hi = parts[0]; - last.ip_blkid.bi_lo = parts[1]; - last.ip_posid = parts[2]; - } - }else{ - last.ip_blkid.bi_hi = 1; - last.ip_blkid.bi_lo = 1; - last.ip_posid = 1; - return last; - } - - delete itr; - - mapPointers[tableName] = last; - return last; - // last.ip_blkid.bi_hi = 1; - // last.ip_blkid.bi_lo = 1; - // last.ip_posid = 1; - // return last; - -} - - diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h deleted file mode 100644 index 5c150f57090..00000000000 --- a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef ROCKSDB_DRIVER_H -#define ROCKSDB_DRIVER_H - -#include "../idriver.h" - -#ifdef __cplusplus -extern "C" { -#endif -#include <postgres.h> -#include <fmgr.h> - -#include <access/transam.h> -#ifdef __cplusplus -} -#endif - -#ifdef __cplusplus - -#include <string> -#include <unordered_map> -#include <sstream> - -#include "../../../utils/utils.h" -#include "../../utils/metadata.h" - -#include <rocksdb/listener.h> -#include <rocksdb/options.h> -#include <rocksdb/db.h> -#include <rocksdb/slice.h> -#include <rocksdb/iterator.h> - -#include <bits/std_thread.h> - -#include <rocksdb/cloud/db_cloud.h> -#include <rocksdb/options.h> - - -class RocksDBDriver: public IDriver { -private: - ROCKSDB_NAMESPACE::DBCloud* db; - std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> columnFamilies; - - //require live for correct work - std::unordered_map<std::string, ItemPointerData> mapPointers; - ROCKSDB_NAMESPACE::WriteOptions wopt; - std::shared_ptr<ROCKSDB_NAMESPACE::FileSystem> cloud_fs; - ROCKSDB_NAMESPACE::Options options; - std::unique_ptr<ROCKSDB_NAMESPACE::Env> cloud_env; - ROCKSDB_NAMESPACE::CloudFileSystemOptions cloud_fs_options; - ROCKSDB_NAMESPACE::CloudFileSystem* cfs; -public: - ~RocksDBDriver() = default; - RocksDBDriver(std::unordered_map<std::string, std::string> config); - - void createTable(std::string tableName); - - void insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) ; - - void beginScan(Relation relation, Snapshot snapshot, int nkeys, - struct ScanKeyData* key, - ParallelTableScanDesc parallel_scan, uint32 flags, - TransactionId id) { return; }; - int selectData(Snapshot snapshot) { return 0; }; - char** getValue() { return 0; }; - ItemPointerData getTid() { return ItemPointerData(); }; - - ItemPointerData getNewPointer(std::string tableName); - ItemPointerData getLastPointer(const std::string &tableName); - - void startFlushThread(); - void stopFlushThread(); -}; - -#endif - - -#endif \ No newline at end of file diff --git a/clouddb/src/clouddb/facade/query_builder.cpp b/clouddb/src/clouddb/facade/query_builder.cpp index 4ab0dbebd8f..d969304ef4a 100644 --- a/clouddb/src/clouddb/facade/query_builder.cpp +++ b/clouddb/src/clouddb/facade/query_builder.cpp @@ -220,7 +220,9 @@ std::string CassandraBuilder::buildSelectAll(std::string keyspace, query += " <= "; query += std::to_string(id); query += " ALLOW FILTERING;"; + // std::cout << query << std::endl; + return query; } diff --git a/clouddb/src/clouddb/facade/session.cpp b/clouddb/src/clouddb/facade/session.cpp index f9f8f6f704d..6216efe3d40 100644 --- a/clouddb/src/clouddb/facade/session.cpp +++ b/clouddb/src/clouddb/facade/session.cpp @@ -19,8 +19,6 @@ std::unordered_map<std::string, std::string> parseConfig(char **config) { Session::Session(std::unordered_map<std::string, std::string> config) { if (config["driver"] == "cassandra") { this->driver = std::make_shared<CassandraDriver>(config); - }else if(config["driver"] == "rocksdb") { - this->driver = std::make_shared<RocksDBDriver>(config); } } diff --git a/clouddb/src/clouddb/facade/session.h b/clouddb/src/clouddb/facade/session.h index 38d6e541014..dd0cdccbbbc 100644 --- a/clouddb/src/clouddb/facade/session.h +++ b/clouddb/src/clouddb/facade/session.h @@ -4,16 +4,14 @@ #include "../utils/c_export.h" #include "command/icommand.h" #include "drivers/cassandra_driver/cassandra_driver.h" -#include "drivers/rocksdb_driver/rocksdb_driver.h" // #ifdef __cplusplus #include <memory> #include <string> #include <unordered_map> -#include <iostream> -enum DRIVERS { Cassandra, RocksDb }; +enum DRIVERS { Cassandra }; class Session { public: @@ -29,7 +27,7 @@ class Session { std::weak_ptr<ICommand> command; Session(std::unordered_map<std::string, std::string> config); Session(); - ~Session() {std::cout << "~Session" << std::endl;}; + ~Session() = default; // delete all Session(const Session &) = delete; diff --git a/clouddb/src/clouddb/tam/all_tam.h b/clouddb/src/clouddb/tam/all_tam.h index d00e11646c9..43134944a91 100644 --- a/clouddb/src/clouddb/tam/all_tam.h +++ b/clouddb/src/clouddb/tam/all_tam.h @@ -16,7 +16,114 @@ #include "../facade/command/command.h" #include "../utils/utils.h" -extern Session* session; +#include "access/hio.h" +#include "access/multixact.h" +#include "access/relscan.h" +#include "access/sysattr.h" +#include "access/transam.h" +#include "access/valid.h" +#include "access/visibilitymap.h" +#include "access/xact.h" +#include "access/xlogutils.h" +#include "catalog/catalog.h" +#include "catalog/namespace.h" +#include "miscadmin.h" +#include "pgstat.h" +#include "storage/bufmgr.h" +#include "storage/freespace.h" +#include "storage/lmgr.h" +#include "storage/procarray.h" +#include "storage/smgr.h" +#include "storage/standby.h" +#include "utils/datum.h" +#include "utils/inval.h" +#include "utils/snapmgr.h" +#include "utils/syscache.h" + + +#include "access/genam.h" +#include "access/table.h" +#include "catalog/indexing.h" +#include "catalog/objectaddress.h" +#include "catalog/pg_description.h" +#include "catalog/pg_shdescription.h" +#include "commands/comment.h" +#include "commands/dbcommands.h" +#include "utils/fmgroids.h" +#include "catalog/pg_index.h" +#include "catalog/pg_class.h" +#include "catalog/pg_namespace.h" +#include "utils/relcache.h" +#include "utils/varbit.h" +#include "commands/sequence.h" + + +#include <access/heapam.h> +#include <access/htup_details.h> +#include <access/relation.h> +#include <access/tableam.h> +#include <cassandra.h> +#include <catalog/index.h> +#include <commands/vacuum.h> +#include <executor/executor.h> +#include <executor/spi.h> +#include <executor/tuptable.h> +#include <fmgr.h> +#include <miscadmin.h> +#include <nodes/execnodes.h> +#include <postmaster/bgworker.h> +#include <postmaster/interrupt.h> +#include <stdlib.h> +#include <storage/ipc.h> +#include <storage/lwlock.h> +#include <storage/shmem.h> +#include <string.h> +#include <tcop/tcopprot.h> +#include <utils/builtins.h> +#include <utils/guc.h> +#include <utils/lsyscache.h> +#include <utils/rel.h> /* ... and relations */ +#include <utils/snapmgr.h> + +#include "access/amapi.h" +#include "access/genam.h" +#include "access/relscan.h" +#include "catalog/index.h" +#include "catalog/pg_type.h" +#include "commands/vacuum.h" +#include "miscadmin.h" +#include "storage/bufmgr.h" +#include "utils/memutils.h" +#include "nodes/pathnodes.h" + +#include <access/heapam.h> +#include <access/htup_details.h> +#include <access/relation.h> +#include <access/tableam.h> +#include <cassandra.h> +#include <catalog/index.h> +#include <commands/vacuum.h> +#include <executor/executor.h> +#include <executor/spi.h> +#include <executor/tuptable.h> +#include <fmgr.h> +#include <miscadmin.h> +#include <nodes/execnodes.h> +#include <postmaster/bgworker.h> +#include <postmaster/interrupt.h> +#include <stdlib.h> +#include <storage/ipc.h> +#include <storage/lwlock.h> +#include <storage/shmem.h> +#include <string.h> +#include <tcop/tcopprot.h> +#include <utils/builtins.h> +#include <utils/guc.h> +#include <utils/lsyscache.h> +#include <utils/rel.h> /* ... and relations */ +#include <utils/snapmgr.h> +#include "access/amapi.h" + extern const TableAmRoutine clouddb_methods; #endif diff --git a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c index 9ddd5e479ee..4a7c40cf7a8 100644 --- a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c +++ b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c @@ -4,14 +4,9 @@ void clouddb_tuple_insert(Relation relation, TupleTableSlot *slot, CommandId cid, int options, BulkInsertState bistate) { - // Вычисляем разницу - /* clock_t start = clock(); */ Session *session = getSessionInstance(NULL); executeCommand(session, createInsertCommand(session, relation, slot, cid, options, bistate)); - /* clock_t end = clock(); */ - /* double time_spent = (double)(end - start) / CLOCKS_PER_SEC * 1000; */ - /* printf("Время выполнения функции: %.3f milliseconds\n", time_spent); */ } void clouddb_tuple_insert_speculative(Relation relation, TupleTableSlot *slot, @@ -141,4 +136,3 @@ TM_Result clouddb_tuple_lock(Relation relation, ItemPointer tid, TM_Result result = 0; return result; } - diff --git a/clouddb/src/clouddb/tam/src/scan_func_tam.c b/clouddb/src/clouddb/tam/src/scan_func_tam.c index 489bef859d4..b7a9878899a 100644 --- a/clouddb/src/clouddb/tam/src/scan_func_tam.c +++ b/clouddb/src/clouddb/tam/src/scan_func_tam.c @@ -43,12 +43,8 @@ bool clouddb_getnextslot(TableScanDesc sscan, ScanDirection direction, char **values = getValueForScan(driver); slot->tts_tid = getTidForScan(driver); - /* printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo, - */ - /* slot->tts_tid.ip_blkid.bi_hi); */ TupleDesc desc = RelationGetDescr(sscan->rs_rd); - /* printf("%s\n", values[0]); */ for (int i = 0; i < desc->natts; ++i) { char *curValue = values[i]; diff --git a/clouddb/src/clouddb/tam/tam.c b/clouddb/src/clouddb/tam/tam.c index dbd294918d2..3d2059d2987 100644 --- a/clouddb/src/clouddb/tam/tam.c +++ b/clouddb/src/clouddb/tam/tam.c @@ -7,8 +7,6 @@ #include "include/scan_func_tam.h" #include "include/slot_func_tam.h" -Session* session; - const TableAmRoutine clouddb_methods = { .type = T_TableAmRoutine, @@ -73,21 +71,20 @@ const TableAmRoutine clouddb_methods = { PG_FUNCTION_INFO_V1(clouddb_table_handler); Datum clouddb_table_handler(PG_FUNCTION_ARGS) { - printf("Init\n"); - char *host = GetConfigOption("cassandra.host", false, false); - char *keyspace = GetConfigOption("cassandra.keyspace", false, false); + char *keyspace = (char *)GetConfigOption("cassandra.keyspace", false, false); + char *host = (char *)GetConfigOption("cassandra.host", false, false); char *replicationFactor = (char *)GetConfigOption("cassandra.replication_factor", false, false); - char **config = (char **)malloc(sizeof(char *) * 7); - config[0] = "rocksdb"; + char **config = (char **)malloc(sizeof(char *) * 7); + config[0] = "cassandra"; config[1] = "cassandra.host"; - config[2] = "host"; + config[2] = host; config[3] = "cassandra.keyspace"; - config[4] = "keyspace"; + config[4] = keyspace; config[5] = "cassandra.replication_factor"; - config[6] = "replicationFactor"; - session = getSessionInstance(config); + config[6] = replicationFactor; + Session *session = getSessionInstance((void *)config); PG_RETURN_POINTER(&clouddb_methods); } -- GitLab