8
8
9
9
namespace NKikimr ::NOlap {
10
10
class IBlobsDeclareRemovingAction ;
11
+
12
+ class TInsertedDataInstant {
13
+ private:
14
+ const TInsertedData* Data;
15
+ const TInstant WriteTime;
16
+
17
+ public:
18
+ TInsertedDataInstant (const TInsertedData& data)
19
+ : Data(&data)
20
+ , WriteTime(Data->GetMeta ().GetDirtyWriteTime())
21
+ {
22
+
23
+ }
24
+
25
+ const TInsertedData& GetData () const {
26
+ return *Data;
27
+ }
28
+ TInstant GetWriteTime () const {
29
+ return WriteTime;
30
+ }
31
+
32
+ bool operator <(const TInsertedDataInstant& item) const {
33
+ if (WriteTime == item.WriteTime ) {
34
+ return Data->GetInsertWriteId () < item.Data ->GetInsertWriteId ();
35
+ } else {
36
+ return WriteTime < item.WriteTime ;
37
+ }
38
+ }
39
+ };
40
+
41
+ class TInsertedContainer {
42
+ private:
43
+ THashMap<TInsertWriteId, TInsertedData> Inserted;
44
+ std::set<TInsertedDataInstant> InsertedByWriteTime;
45
+
46
+ public:
47
+ size_t size () const {
48
+ return Inserted.size ();
49
+ }
50
+
51
+ bool contains (const TInsertWriteId id) const {
52
+ return Inserted.contains (id);
53
+ }
54
+
55
+ THashMap<TInsertWriteId, TInsertedData>::const_iterator begin () const {
56
+ return Inserted.begin ();
57
+ }
58
+
59
+ THashMap<TInsertWriteId, TInsertedData>::const_iterator end () const {
60
+ return Inserted.end ();
61
+ }
62
+
63
+ THashSet<TInsertWriteId> GetExpired (const TInstant timeBorder, const ui64 limit) const {
64
+ THashSet<TInsertWriteId> result;
65
+ for (auto & data : InsertedByWriteTime) {
66
+ if (timeBorder < data.GetWriteTime ()) {
67
+ break ;
68
+ }
69
+ if (data.GetData ().IsNotAbortable ()) {
70
+ continue ;
71
+ }
72
+ result.emplace (data.GetData ().GetInsertWriteId ());
73
+ if (limit <= result.size ()) {
74
+ break ;
75
+ }
76
+ }
77
+ return result;
78
+ }
79
+
80
+ TInsertedData* AddVerified (TInsertedData&& data) {
81
+ const TInsertWriteId writeId = data.GetInsertWriteId ();
82
+ auto itInsertion = Inserted.emplace (writeId, std::move (data));
83
+ AFL_VERIFY (itInsertion.second );
84
+ auto * dataPtr = &itInsertion.first ->second ;
85
+ InsertedByWriteTime.emplace (TInsertedDataInstant (*dataPtr));
86
+ return dataPtr;
87
+ }
88
+
89
+ const TInsertedData* GetOptional (const TInsertWriteId id) const {
90
+ auto it = Inserted.find (id);
91
+ if (it == Inserted.end ()) {
92
+ return nullptr ;
93
+ } else {
94
+ return &it->second ;
95
+ }
96
+ }
97
+
98
+ TInsertedData* MutableOptional (const TInsertWriteId id) {
99
+ auto it = Inserted.find (id);
100
+ if (it == Inserted.end ()) {
101
+ return nullptr ;
102
+ } else {
103
+ return &it->second ;
104
+ }
105
+ }
106
+
107
+ std::optional<TInsertedData> ExtractOptional (const TInsertWriteId id) {
108
+ auto it = Inserted.find (id);
109
+ if (it == Inserted.end ()) {
110
+ return std::nullopt;
111
+ }
112
+ AFL_VERIFY (InsertedByWriteTime.erase (TInsertedDataInstant (it->second )));
113
+ TInsertedData result = std::move (it->second );
114
+ Inserted.erase (it);
115
+ return result;
116
+ }
117
+ };
118
+
11
119
class TInsertionSummary {
12
120
public:
13
121
struct TCounters {
@@ -22,9 +130,8 @@ class TInsertionSummary {
22
130
TCounters StatsCommitted;
23
131
const NColumnShard::TInsertTableCounters Counters;
24
132
25
- THashMap<TInsertWriteId, TInsertedData> Inserted;
133
+ TInsertedContainer Inserted;
26
134
THashMap<TInsertWriteId, TInsertedData> Aborted;
27
- mutable TInstant MinInsertedTs = TInstant::Zero();
28
135
29
136
std::map<TPathInfoIndexPriority, std::set<const TPathInfo*>> Priorities;
30
137
THashMap<ui64, TPathInfo> PathInfo;
@@ -57,18 +164,16 @@ class TInsertionSummary {
57
164
}
58
165
59
166
void MarkAsNotAbortable (const TInsertWriteId writeId) {
60
- auto it = Inserted.find (writeId);
61
- if (it == Inserted. end () ) {
167
+ auto * data = Inserted.MutableOptional (writeId);
168
+ if (!data ) {
62
169
return ;
63
170
}
64
- it-> second . MarkAsNotAbortable ();
171
+ data-> MarkAsNotAbortable ();
65
172
}
66
173
67
- THashSet<TInsertWriteId> GetInsertedByPathId (const ui64 pathId) const ;
68
-
69
174
THashSet<TInsertWriteId> GetExpiredInsertions (const TInstant timeBorder, const ui64 limit) const ;
70
175
71
- const THashMap<TInsertWriteId, TInsertedData> & GetInserted () const {
176
+ const TInsertedContainer & GetInserted () const {
72
177
return Inserted;
73
178
}
74
179
const THashMap<TInsertWriteId, TInsertedData>& GetAborted () const {
0 commit comments