Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit b7aa304

Browse files
authored
Merge pull request #1253 from zhaoguoquan94/lockfreearray
Lockfreearray
2 parents 1aecc58 + 8d0f87f commit b7aa304

File tree

5 files changed

+76
-121
lines changed

5 files changed

+76
-121
lines changed

src/catalog/manager.cpp

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,51 +36,39 @@ Manager &Manager::GetInstance() {
3636

3737
void Manager::AddTileGroup(const oid_t oid,
3838
std::shared_ptr<storage::TileGroup> location) {
39-
4039
// add/update the catalog reference to the tile group
41-
tile_group_locator_.Update(oid, location);
40+
tile_group_locator_[oid] = location;
4241
}
4342

4443
void Manager::DropTileGroup(const oid_t oid) {
45-
4644
// drop the catalog reference to the tile group
47-
tile_group_locator_.Erase(oid, empty_tile_group_);
45+
tile_group_locator_[oid] = empty_tile_group_;
4846
}
4947

5048
std::shared_ptr<storage::TileGroup> Manager::GetTileGroup(const oid_t oid) {
51-
std::shared_ptr<storage::TileGroup> location;
52-
53-
location = tile_group_locator_.Find(oid);
54-
55-
return location;
49+
auto iter = tile_group_locator_.find(oid);
50+
if (iter == tile_group_locator_.end()) {
51+
return empty_tile_group_;
52+
}
53+
return iter->second;
5654
}
5755

5856
// used for logging test
59-
void Manager::ClearTileGroup() {
60-
61-
tile_group_locator_.Clear(empty_tile_group_);
62-
}
63-
64-
65-
void Manager::AddIndirectionArray(const oid_t oid,
66-
std::shared_ptr<storage::IndirectionArray> location) {
57+
void Manager::ClearTileGroup() { tile_group_locator_.clear(); }
6758

59+
void Manager::AddIndirectionArray(
60+
const oid_t oid, std::shared_ptr<storage::IndirectionArray> location) {
6861
// add/update the catalog reference to the indirection array
69-
indirection_array_locator_.Update(oid, location);
62+
auto ret = indirection_array_locator_[oid] = location;
7063
}
7164

7265
void Manager::DropIndirectionArray(const oid_t oid) {
73-
7466
// drop the catalog reference to the tile group
75-
indirection_array_locator_.Erase(oid, empty_indirection_array_);
67+
indirection_array_locator_[oid] = empty_indirection_array_;
7668
}
7769

78-
7970
// used for logging test
80-
void Manager::ClearIndirectionArray() {
81-
82-
indirection_array_locator_.Clear(empty_indirection_array_);
83-
}
71+
void Manager::ClearIndirectionArray() { indirection_array_locator_.clear(); }
8472

8573
} // namespace catalog
8674
} // namespace peloton

src/common/container/lock_free_array.cpp

Lines changed: 43 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -19,72 +19,68 @@
1919

2020
namespace peloton {
2121

22-
namespace index{
22+
namespace index {
2323
class Index;
2424
}
2525

26-
namespace storage{
26+
namespace storage {
2727
class TileGroup;
2828
class Database;
2929
class IndirectionArray;
3030
}
3131

32-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
33-
LOCK_FREE_ARRAY_TYPE::LockFreeArray(){
34-
lock_free_array.reset(new lock_free_array_t());
32+
template <typename ValueType>
33+
LOCK_FREE_ARRAY_TYPE::LockFreeArray() {
34+
lock_free_array.reserve(kLockfreeArrayInitSize);
3535
}
3636

37-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
38-
LOCK_FREE_ARRAY_TYPE::~LockFreeArray(){
39-
}
37+
template <typename ValueType>
38+
LOCK_FREE_ARRAY_TYPE::~LockFreeArray() { lock_free_array.clear(); }
4039

41-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
42-
bool LOCK_FREE_ARRAY_TYPE::Update(const std::size_t &offset, ValueType value){
43-
PELOTON_ASSERT(offset <= LOCK_FREE_ARRAY_MAX_SIZE);
44-
LOG_TRACE("Update at %lu", lock_free_array_offset.load());
45-
lock_free_array->at(offset) = value;
40+
template <typename ValueType>
41+
bool LOCK_FREE_ARRAY_TYPE::Update(const std::size_t &offset, ValueType value) {
42+
LOG_TRACE("Update at %lu", offset);
43+
PELOTON_ASSERT(lock_free_array.size() >= offset + 1);
44+
lock_free_array.at(offset) = value;
4645
return true;
4746
}
4847

49-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
50-
bool LOCK_FREE_ARRAY_TYPE::Append(ValueType value){
51-
LOG_TRACE("Appended at %lu", lock_free_array_offset.load());
52-
lock_free_array->at(lock_free_array_offset++) = value;
48+
template <typename ValueType>
49+
bool LOCK_FREE_ARRAY_TYPE::Append(ValueType value) {
50+
LOG_TRACE("Appended value.");
51+
lock_free_array.push_back(value);
5352
return true;
5453
}
5554

56-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
57-
bool LOCK_FREE_ARRAY_TYPE::Erase(const std::size_t &offset, const ValueType& invalid_value){
58-
PELOTON_ASSERT(offset <= LOCK_FREE_ARRAY_MAX_SIZE);
55+
template <typename ValueType>
56+
bool LOCK_FREE_ARRAY_TYPE::Erase(const std::size_t &offset,
57+
const ValueType &invalid_value) {
5958
LOG_TRACE("Erase at %lu", offset);
60-
lock_free_array->at(offset) = invalid_value;
59+
lock_free_array.at(offset) = invalid_value;
6160
return true;
6261
}
6362

64-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
65-
ValueType LOCK_FREE_ARRAY_TYPE::Find(const std::size_t &offset) const{
66-
PELOTON_ASSERT(offset <= LOCK_FREE_ARRAY_MAX_SIZE);
63+
template <typename ValueType>
64+
ValueType LOCK_FREE_ARRAY_TYPE::Find(const std::size_t &offset) const {
6765
LOG_TRACE("Find at %lu", offset);
68-
auto value = lock_free_array->at(offset);
66+
PELOTON_ASSERT(lock_free_array.size() > offset);
67+
auto value = lock_free_array.at(offset);
6968
return value;
7069
}
7170

72-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
73-
ValueType LOCK_FREE_ARRAY_TYPE::FindValid(const std::size_t &offset,
74-
const ValueType& invalid_value) const {
75-
PELOTON_ASSERT(offset <= LOCK_FREE_ARRAY_MAX_SIZE);
71+
template <typename ValueType>
72+
ValueType LOCK_FREE_ARRAY_TYPE::FindValid(
73+
const std::size_t &offset, const ValueType &invalid_value) const {
7674
LOG_TRACE("Find Valid at %lu", offset);
7775

7876
std::size_t valid_array_itr = 0;
7977
std::size_t array_itr;
80-
81-
for(array_itr = 0;
82-
array_itr < lock_free_array_offset;
83-
array_itr++){
84-
auto value = lock_free_array->at(array_itr);
78+
auto lock_free_array_offset = lock_free_array.size();
79+
for (array_itr = 0; array_itr < lock_free_array_offset; array_itr++) {
80+
auto value = lock_free_array.at(array_itr);
8581
if (value != invalid_value) {
8682
// Check offset
87-
if(valid_array_itr == offset) {
83+
if (valid_array_itr == offset) {
8884
return value;
8985
}
9086

@@ -96,42 +92,24 @@ ValueType LOCK_FREE_ARRAY_TYPE::FindValid(const std::size_t &offset,
9692
return invalid_value;
9793
}
9894

99-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
100-
size_t LOCK_FREE_ARRAY_TYPE::GetSize() const{
101-
return lock_free_array_offset;
102-
}
95+
template <typename ValueType>
96+
size_t LOCK_FREE_ARRAY_TYPE::GetSize() const { return lock_free_array.size(); }
10397

104-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
105-
bool LOCK_FREE_ARRAY_TYPE::IsEmpty() const{
106-
return lock_free_array->empty();
107-
}
108-
109-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
110-
void LOCK_FREE_ARRAY_TYPE::Clear(const ValueType& invalid_value) {
111-
112-
// Set invalid value for all elements and reset lock_free_array_offset
113-
for(std::size_t array_itr = 0;
114-
array_itr < lock_free_array_offset;
115-
array_itr++){
116-
lock_free_array->at(array_itr) = invalid_value;
117-
}
98+
template <typename ValueType>
99+
bool LOCK_FREE_ARRAY_TYPE::IsEmpty() const { return lock_free_array.empty(); }
118100

119-
// Reset sentinel
120-
lock_free_array_offset = 0;
121-
122-
}
123-
124-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
125-
bool LOCK_FREE_ARRAY_TYPE::Contains(const ValueType& value) {
101+
template <typename ValueType>
102+
void LOCK_FREE_ARRAY_TYPE::Clear() { lock_free_array.clear(); }
126103

104+
template <typename ValueType>
105+
bool LOCK_FREE_ARRAY_TYPE::Contains(const ValueType &value) {
127106
bool exists = false;
128107

129-
for(std::size_t array_itr = 0;
130-
array_itr < lock_free_array_offset;
131-
array_itr++){
132-
auto array_value = lock_free_array->at(array_itr);
108+
for (std::size_t array_itr = 0; array_itr < lock_free_array.size();
109+
array_itr++) {
110+
auto array_value = lock_free_array.at(array_itr);
133111
// Check array value
134-
if(array_value == value) {
112+
if (array_value == value) {
135113
exists = true;
136114
break;
137115
}
@@ -145,12 +123,6 @@ template class LockFreeArray<std::shared_ptr<oid_t>>;
145123

146124
template class LockFreeArray<std::shared_ptr<index::Index>>;
147125

148-
template class LockFreeArray<std::shared_ptr<storage::TileGroup>>;
149-
150-
template class LockFreeArray<std::shared_ptr<storage::Database>>;
151-
152-
template class LockFreeArray<std::shared_ptr<storage::IndirectionArray>>;
153-
154126
template class LockFreeArray<oid_t>;
155127

156128
} // namespace peloton

src/include/catalog/manager.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@
1818
#include <vector>
1919
#include <unordered_map>
2020
#include <memory>
21+
#include "common/internal_types.h"
2122

2223
#include "common/macros.h"
2324
#include "common/internal_types.h"
2425
#include "common/container/lock_free_array.h"
25-
26+
#include "tbb/concurrent_unordered_map.h"
2627
namespace peloton {
2728

2829
namespace storage {
@@ -64,7 +65,6 @@ class Manager {
6465

6566
void ClearTileGroup(void);
6667

67-
6868
//===--------------------------------------------------------------------===//
6969
// INDIRECTION ARRAY ALLOCATION
7070
//===--------------------------------------------------------------------===//
@@ -94,17 +94,18 @@ class Manager {
9494
//===--------------------------------------------------------------------===//
9595
std::atomic<oid_t> tile_group_oid_ = ATOMIC_VAR_INIT(START_OID);
9696

97-
LockFreeArray<std::shared_ptr<storage::TileGroup>> tile_group_locator_;
98-
97+
tbb::concurrent_unordered_map<oid_t, std::shared_ptr<storage::TileGroup>>
98+
tile_group_locator_;
9999
static std::shared_ptr<storage::TileGroup> empty_tile_group_;
100100

101101
//===--------------------------------------------------------------------===//
102102
// Data members for indirection array allocation
103103
//===--------------------------------------------------------------------===//
104104
std::atomic<oid_t> indirection_array_oid_ = ATOMIC_VAR_INIT(START_OID);
105105

106-
LockFreeArray<std::shared_ptr<storage::IndirectionArray>> indirection_array_locator_;
107-
106+
tbb::concurrent_unordered_map<oid_t,
107+
std::shared_ptr<storage::IndirectionArray>>
108+
indirection_array_locator_;
108109
static std::shared_ptr<storage::IndirectionArray> empty_indirection_array_;
109110
};
110111

src/include/common/container/lock_free_array.h

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
1413
#pragma once
15-
14+
#include "tbb/concurrent_vector.h"
15+
#include "tbb/tbb_allocator.h"
1616
#include <cstdlib>
1717
#include <cstring>
1818
#include <cstdio>
@@ -22,18 +22,16 @@
2222

2323
namespace peloton {
2424

25-
#define LOCK_FREE_ARRAY_MAX_SIZE 1024 * 1024
25+
static const size_t kLockfreeArrayInitSize = 256;
2626

2727
// LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
28-
#define LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS template <typename ValueType>
2928

3029
// LOCK_FREE_ARRAY_TYPE
3130
#define LOCK_FREE_ARRAY_TYPE LockFreeArray<ValueType>
3231

33-
LOCK_FREE_ARRAY_TEMPLATE_ARGUMENTS
32+
template <typename ValueType>
3433
class LockFreeArray {
3534
public:
36-
3735
LockFreeArray();
3836
~LockFreeArray();
3937

@@ -47,10 +45,11 @@ class LockFreeArray {
4745
ValueType Find(const std::size_t &offset) const;
4846

4947
// Get a valid item
50-
ValueType FindValid(const std::size_t &offset, const ValueType& invalid_value) const;
48+
ValueType FindValid(const std::size_t &offset,
49+
const ValueType &invalid_value) const;
5150

5251
// Delete key from the lock_free_array
53-
bool Erase(const std::size_t &offset, const ValueType& invalid_value);
52+
bool Erase(const std::size_t &offset, const ValueType &invalid_value);
5453

5554
// Returns item count in the lock_free_array
5655
size_t GetSize() const;
@@ -59,20 +58,15 @@ class LockFreeArray {
5958
bool IsEmpty() const;
6059

6160
// Clear all elements and reset them to default value
62-
void Clear(const ValueType& invalid_value);
61+
void Clear();
6362

6463
// Exists ?
65-
bool Contains(const ValueType& value);
64+
bool Contains(const ValueType &value);
6665

6766
private:
68-
69-
// lock free array type
70-
typedef std::array<ValueType, LOCK_FREE_ARRAY_MAX_SIZE> lock_free_array_t;
71-
72-
std::atomic<std::size_t> lock_free_array_offset {0};
73-
7467
// lock free array
75-
std::unique_ptr<lock_free_array_t> lock_free_array;
68+
tbb::concurrent_vector<ValueType, tbb::zero_allocator<ValueType>>
69+
lock_free_array;
7670
};
7771

7872
} // namespace peloton

src/storage/data_table.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,7 +1029,7 @@ void DataTable::DropTileGroups() {
10291029
}
10301030

10311031
// Clear array
1032-
tile_groups_.Clear(invalid_tile_group_id);
1032+
tile_groups_.Clear();
10331033

10341034
tile_group_count_ = 0;
10351035
}
@@ -1100,7 +1100,7 @@ void DataTable::DropIndexWithOid(const oid_t &index_oid) {
11001100
void DataTable::DropIndexes() {
11011101
// TODO: iterate over all indexes, and actually drop them
11021102

1103-
indexes_.Clear(nullptr);
1103+
indexes_.Clear();
11041104

11051105
indexes_columns_.clear();
11061106
}

0 commit comments

Comments
 (0)