Skip to content

Commit 77a9fa2

Browse files
authored
Refactor requests-in-progress tracking (#4752)
<img width="1217" height="407" alt="image" src="https://github.com/user-attachments/assets/ca8c48bf-d90d-40a5-b2d8-b9f5d5f064ce" />
1 parent 0d8cc2e commit 77a9fa2

File tree

10 files changed

+264
-324
lines changed

10 files changed

+264
-324
lines changed
Lines changed: 0 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
#pragma once
22

3-
#include "requests_in_progress.h"
4-
53
#include <cloud/blockstore/libs/common/block_range.h>
64

75
#include <util/generic/hash.h>
@@ -31,110 +29,4 @@ class TRequestBoundsTracker
3129
[[nodiscard]] bool OverlapsWithRequest(TBlockRange64 r) const;
3230
};
3331

34-
template <typename TValue>
35-
struct TRequestInProgressWithBlockRange
36-
{
37-
TValue Value;
38-
bool IsWrite = false;
39-
TBlockRange64 BlockRange;
40-
};
41-
42-
template <EAllowedRequests TKind, typename TKey, typename TValue = TEmptyType>
43-
class TRequestsInProgressWithBlockRangeTracking
44-
: public IRequestsInProgress
45-
, TRequestsInProgressImpl<TKey, TRequestInProgressWithBlockRange<TValue>>
46-
{
47-
using TImpl =
48-
TRequestsInProgressImpl<TKey, TRequestInProgressWithBlockRange<TValue>>;
49-
50-
private:
51-
TRequestBoundsTracker WriteRequestBoundsTracker;
52-
53-
public:
54-
using TRequest = TRequestInProgressWithBlockRange<TValue>;
55-
56-
public:
57-
explicit TRequestsInProgressWithBlockRangeTracking(size_t blockSize)
58-
: WriteRequestBoundsTracker(blockSize)
59-
{}
60-
61-
using TImpl::AllRequests;
62-
using TImpl::Empty;
63-
using TImpl::GenerateRequestId;
64-
using TImpl::GetRequest;
65-
using TImpl::GetRequestCount;
66-
using TImpl::SetRequestIdentityKey;
67-
68-
void AddReadRequest(const TKey& key, TBlockRange64 range, TValue value = {})
69-
requires(IsReadAllowed<TKind>)
70-
{
71-
TImpl::AddRequest(
72-
key,
73-
{.Value = std::move(value), .IsWrite = false, .BlockRange = range});
74-
}
75-
76-
TKey AddReadRequest(TBlockRange64 range, TValue value = {})
77-
requires(IsReadAllowed<TKind>)
78-
{
79-
return TImpl::AddRequest(
80-
{.Value = std::move(value), .IsWrite = false, .BlockRange = range});
81-
}
82-
83-
void
84-
AddWriteRequest(const TKey& key, TBlockRange64 range, TValue value = {})
85-
requires(IsWriteAllowed<TKind>)
86-
{
87-
WriteRequestBoundsTracker.AddRequest(range);
88-
89-
TImpl::AddRequest(
90-
key,
91-
{.Value = std::move(value), .IsWrite = true, .BlockRange = range});
92-
}
93-
94-
TKey AddWriteRequest(TBlockRange64 range, TValue value = {})
95-
requires(IsWriteAllowed<TKind>)
96-
{
97-
TKey key = GenerateRequestId();
98-
AddWriteRequest(key, range, std::move(value));
99-
return key;
100-
}
101-
102-
bool RemoveRequest(const TKey& key)
103-
{
104-
return ExtractRequest(key).has_value();
105-
}
106-
107-
std::optional<TRequest> ExtractRequest(const TKey& key)
108-
{
109-
auto request = TImpl::ExtractRequest(key);
110-
if (request && request->IsWrite) {
111-
WriteRequestBoundsTracker.RemoveRequest(request->BlockRange);
112-
}
113-
114-
return request;
115-
}
116-
117-
const TRequestBoundsTracker& GetRequestBoundsTracker()
118-
{
119-
return WriteRequestBoundsTracker;
120-
}
121-
122-
// IRequestsInProgress
123-
124-
[[nodiscard]] bool WriteRequestInProgress() const override
125-
{
126-
return TImpl::WriteRequestInProgress();
127-
}
128-
129-
void WaitForInFlightWrites() override
130-
{
131-
TImpl::WaitForInFlightWrites();
132-
}
133-
134-
[[nodiscard]] bool IsWaitingForInFlightWrites() const override
135-
{
136-
return TImpl::IsWaitingForInFlightWrites();
137-
}
138-
};
139-
14032
} // namespace NCloud::NBlockStore::NStorage

cloud/blockstore/libs/storage/model/request_bounds_tracker_ut.cpp

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "request_bounds_tracker.h"
22

33
#include "common_constants.h"
4+
#include "requests_in_progress.h"
45

56
#include <library/cpp/testing/unittest/registar.h>
67

@@ -106,32 +107,31 @@ Y_UNIT_TEST_SUITE(TRequestBoundsTrackerTest)
106107
ui32>
107108
requestsInProgress{blockSize};
108109

109-
const auto& boundsTracker =
110-
requestsInProgress.GetRequestBoundsTracker();
111-
112110
auto blocksPerTrackingRange = MigrationRangeSize / 4_KB;
113111

114112
{
115113
auto id1 = requestsInProgress.GenerateRequestId();
116114

117115
requestsInProgress.AddWriteRequest(
118116
id1,
119-
TBlockRange64::WithLength(0, 10));
117+
TBlockRange64::WithLength(0, 10),
118+
{});
120119

121-
UNIT_ASSERT(boundsTracker.OverlapsWithRequest(
120+
UNIT_ASSERT(requestsInProgress.Overlaps(
122121
TBlockRange64::WithLength(0, blocksPerTrackingRange)));
123122

124123
auto id2 = requestsInProgress.GenerateRequestId();
125124
requestsInProgress.AddWriteRequest(
126125
id2,
127-
TBlockRange64::WithLength(10, 10));
126+
TBlockRange64::WithLength(10, 10),
127+
{});
128128
requestsInProgress.ExtractRequest(id1);
129129

130-
UNIT_ASSERT(boundsTracker.OverlapsWithRequest(
130+
UNIT_ASSERT(requestsInProgress.Overlaps(
131131
TBlockRange64::WithLength(0, blocksPerTrackingRange)));
132132

133133
requestsInProgress.ExtractRequest(id2);
134-
UNIT_ASSERT(!boundsTracker.OverlapsWithRequest(
134+
UNIT_ASSERT(!requestsInProgress.Overlaps(
135135
TBlockRange64::WithLength(0, blocksPerTrackingRange)));
136136
}
137137

@@ -141,12 +141,13 @@ Y_UNIT_TEST_SUITE(TRequestBoundsTrackerTest)
141141

142142
requestsInProgress.AddWriteRequest(
143143
id1,
144-
TBlockRange64::WithLength(blocksPerTrackingRange - 1, 2));
144+
TBlockRange64::WithLength(blocksPerTrackingRange - 1, 2),
145+
{});
145146

146-
UNIT_ASSERT(boundsTracker.OverlapsWithRequest(
147+
UNIT_ASSERT(requestsInProgress.Overlaps(
147148
TBlockRange64::WithLength(0, blocksPerTrackingRange)));
148149
UNIT_ASSERT(
149-
boundsTracker.OverlapsWithRequest(TBlockRange64::WithLength(
150+
requestsInProgress.Overlaps(TBlockRange64::WithLength(
150151
blocksPerTrackingRange,
151152
2 * blocksPerTrackingRange)));
152153
}
@@ -161,32 +162,31 @@ Y_UNIT_TEST_SUITE(TRequestBoundsTrackerTest)
161162
ui32>
162163
requestsInProgress{blockSize};
163164

164-
const auto& boundsTracker =
165-
requestsInProgress.GetRequestBoundsTracker();
166-
167165
auto blocksPerTrackingRange = MigrationRangeSize / 4_KB;
168166

169167
auto id1 = requestsInProgress.GenerateRequestId();
170168
requestsInProgress.AddWriteRequest(
171169
id1,
172-
TBlockRange64::WithLength(0, blocksPerTrackingRange));
170+
TBlockRange64::WithLength(0, blocksPerTrackingRange),
171+
{});
173172

174-
UNIT_ASSERT(boundsTracker.OverlapsWithRequest(
173+
UNIT_ASSERT(requestsInProgress.Overlaps(
175174
TBlockRange64::WithLength(0, blocksPerTrackingRange)));
176175

177176
requestsInProgress.RemoveRequest(id1);
178177

179-
UNIT_ASSERT(!boundsTracker.OverlapsWithRequest(
178+
UNIT_ASSERT(!requestsInProgress.Overlaps(
180179
TBlockRange64::WithLength(0, blocksPerTrackingRange)));
181180

182181
auto id2 = requestsInProgress.AddWriteRequest(
183-
TBlockRange64::WithLength(0, blocksPerTrackingRange));
184-
UNIT_ASSERT(boundsTracker.OverlapsWithRequest(
182+
TBlockRange64::WithLength(0, blocksPerTrackingRange),
183+
{});
184+
UNIT_ASSERT(requestsInProgress.Overlaps(
185185
TBlockRange64::WithLength(0, blocksPerTrackingRange)));
186186

187187
requestsInProgress.RemoveRequest(id2);
188188

189-
UNIT_ASSERT(!boundsTracker.OverlapsWithRequest(
189+
UNIT_ASSERT(!requestsInProgress.Overlaps(
190190
TBlockRange64::WithLength(0, blocksPerTrackingRange)));
191191
}
192192
}

cloud/blockstore/libs/storage/model/request_in_progress_impl.h

Lines changed: 0 additions & 134 deletions
This file was deleted.

0 commit comments

Comments
 (0)