Remove redundant transaction from index creation
Reviewers: florijan Reviewed By: florijan Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D1011
This commit is contained in:
parent
73c1206e81
commit
a7f9255c17
@ -124,19 +124,14 @@ void GraphDbAccessor::BuildIndex(const GraphDbTypes::Label &label,
|
|||||||
// happened earlier. We have to first wait for every transaction that
|
// happened earlier. We have to first wait for every transaction that
|
||||||
// happend before, or a bit later than CreateIndex to end.
|
// happend before, or a bit later than CreateIndex to end.
|
||||||
{
|
{
|
||||||
auto wait_transaction = db_.tx_engine_.Begin();
|
auto wait_transactions = db_.tx_engine_.ActiveTransactions();
|
||||||
for (auto id : wait_transaction->snapshot()) {
|
for (auto id : wait_transactions) {
|
||||||
if (id == transaction_->id_) continue;
|
if (id == transaction_->id_) continue;
|
||||||
while (wait_transaction->engine_.IsActive(id)) {
|
while (db_.tx_engine_.IsActive(id)) {
|
||||||
// TODO reconsider this constant, currently rule-of-thumb chosen
|
// TODO reconsider this constant, currently rule-of-thumb chosen
|
||||||
std::this_thread::sleep_for(std::chrono::microseconds(100));
|
std::this_thread::sleep_for(std::chrono::microseconds(100));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// We must notify the WAL about this transaction manually since it's not
|
|
||||||
// handled by a GraphDbAccessor.
|
|
||||||
db_.wal_.TxBegin(wait_transaction->id_);
|
|
||||||
db_.wal_.TxCommit(wait_transaction->id_);
|
|
||||||
wait_transaction->Commit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// This accessor's transaction surely sees everything that happened before
|
// This accessor's transaction surely sees everything that happened before
|
||||||
|
@ -100,6 +100,15 @@ class Engine {
|
|||||||
return snapshot_copy;
|
return snapshot_copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns active transactions.
|
||||||
|
*/
|
||||||
|
Snapshot ActiveTransactions() {
|
||||||
|
std::lock_guard<SpinLock> guard(lock_);
|
||||||
|
Snapshot active_transactions = active_;
|
||||||
|
return active_transactions;
|
||||||
|
}
|
||||||
|
|
||||||
/** Comits the given transaction. Deletes the transaction object, it's not
|
/** Comits the given transaction. Deletes the transaction object, it's not
|
||||||
* valid after this function executes. */
|
* valid after this function executes. */
|
||||||
void Commit(const Transaction &t) {
|
void Commit(const Transaction &t) {
|
||||||
|
@ -338,7 +338,7 @@ TEST_F(Durability, WalEncoding) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
reader.Close();
|
reader.Close();
|
||||||
ASSERT_EQ(ops.size(), 13);
|
ASSERT_EQ(ops.size(), 11);
|
||||||
|
|
||||||
using Type = durability::WriteAheadLog::Op::Type;
|
using Type = durability::WriteAheadLog::Op::Type;
|
||||||
EXPECT_EQ(ops[0].type_, Type::TRANSACTION_BEGIN);
|
EXPECT_EQ(ops[0].type_, Type::TRANSACTION_BEGIN);
|
||||||
@ -369,16 +369,14 @@ TEST_F(Durability, WalEncoding) {
|
|||||||
EXPECT_EQ(ops[6].edge_id_, 0);
|
EXPECT_EQ(ops[6].edge_id_, 0);
|
||||||
EXPECT_EQ(ops[6].property_, "p0");
|
EXPECT_EQ(ops[6].property_, "p0");
|
||||||
EXPECT_EQ(ops[6].value_.type(), PropertyValue::Type::List);
|
EXPECT_EQ(ops[6].value_.type(), PropertyValue::Type::List);
|
||||||
// The next four ops are the BuildIndex internal transactions.
|
// The next two ops are the BuildIndex internal transactions.
|
||||||
EXPECT_EQ(ops[7].type_, Type::TRANSACTION_BEGIN);
|
EXPECT_EQ(ops[7].type_, Type::TRANSACTION_BEGIN);
|
||||||
EXPECT_EQ(ops[8].type_, Type::TRANSACTION_COMMIT);
|
EXPECT_EQ(ops[8].type_, Type::TRANSACTION_COMMIT);
|
||||||
EXPECT_EQ(ops[9].type_, Type::TRANSACTION_BEGIN);
|
EXPECT_EQ(ops[9].type_, Type::BUILD_INDEX);
|
||||||
|
EXPECT_EQ(ops[9].label_, "l1");
|
||||||
|
EXPECT_EQ(ops[9].property_, "p1");
|
||||||
EXPECT_EQ(ops[10].type_, Type::TRANSACTION_COMMIT);
|
EXPECT_EQ(ops[10].type_, Type::TRANSACTION_COMMIT);
|
||||||
EXPECT_EQ(ops[11].type_, Type::BUILD_INDEX);
|
EXPECT_EQ(ops[10].transaction_id_, 1);
|
||||||
EXPECT_EQ(ops[11].label_, "l1");
|
|
||||||
EXPECT_EQ(ops[11].property_, "p1");
|
|
||||||
EXPECT_EQ(ops[12].type_, Type::TRANSACTION_COMMIT);
|
|
||||||
EXPECT_EQ(ops[12].transaction_id_, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Durability, SnapshotEncoding) {
|
TEST_F(Durability, SnapshotEncoding) {
|
||||||
|
Loading…
Reference in New Issue
Block a user