1
1
#include " erasure_checkers.h"
2
2
3
+ #include < ydb/core/protos/counters_cms.pb.h>
4
+ #include < ydb/core/tablet/tablet_counters.h>
5
+
3
6
namespace NKikimr ::NCms {
4
7
5
8
bool TErasureCounterBase::IsDown (const TVDiskInfo &vdisk, TClusterInfoPtr info, TDuration &retryTime, TErrorInfo &error) {
@@ -43,6 +46,10 @@ bool TErasureCounterBase::GroupAlreadyHasLockedDisks() const {
43
46
return HasAlreadyLockedDisks;
44
47
}
45
48
49
+ bool TErasureCounterBase::GroupHasMoreThanOneDiskPerNode () const {
50
+ return HasMoreThanOneDiskPerNode;
51
+ }
52
+
46
53
static TString DumpVDisksInfo (const THashMap<TVDiskID, TString>& vdisks, TClusterInfoPtr info) {
47
54
if (vdisks.empty ()) {
48
55
return " <empty>" ;
@@ -121,11 +128,18 @@ bool TErasureCounterBase::CountVDisk(const TVDiskInfo &vdisk, TClusterInfoPtr in
121
128
}
122
129
123
130
void TErasureCounterBase::CountGroupState (TClusterInfoPtr info, TDuration retryTime, TDuration duration, TErrorInfo &error) {
124
- for (const auto &vdId : info->BSGroup (GroupId).VDisks ) {
125
- if (vdId != VDisk.VDiskId )
126
- CountVDisk (info->VDisk (vdId), info, retryTime, duration, error);
131
+ const auto & group = info->BSGroup (GroupId);
132
+
133
+ TSet<ui32> groupNodes;
134
+ for (const auto &vdId : group.VDisks ) {
135
+ const auto &vd = info->VDisk (vdId);
136
+ if (vd.VDiskId != VDisk.VDiskId )
137
+ CountVDisk (vd, info, retryTime, duration, error);
138
+ groupNodes.insert (vd.NodeId );
127
139
}
128
140
141
+ HasMoreThanOneDiskPerNode = group.VDisks .size () > groupNodes.size ();
142
+
129
143
if (Locked && error.Code == TStatus::DISALLOW) {
130
144
HasAlreadyLockedDisks = true ;
131
145
}
@@ -136,10 +150,11 @@ void TErasureCounterBase::CountGroupState(TClusterInfoPtr info, TDuration retryT
136
150
bool TDefaultErasureCounter::CheckForKeepAvailability (TClusterInfoPtr info, TErrorInfo &error,
137
151
TInstant &defaultDeadline, bool allowPartial) const
138
152
{
139
- if (HasAlreadyLockedDisks && allowPartial) {
153
+ if (HasAlreadyLockedDisks && !HasMoreThanOneDiskPerNode && allowPartial) {
154
+ CmsCounters->Cumulative ()[COUNTER_PARTIAL_PERMISSIONS_OPTIMIZED].Increment (1 );
140
155
error.Code = TStatus::DISALLOW_TEMP;
141
156
error.Reason = " You cannot get two or more disks from the same group at the same time"
142
- " without specifying the PartialPermissionAllowed parameter " ;
157
+ " in partial permissions allowed mode " ;
143
158
error.Deadline = defaultDeadline;
144
159
return false ;
145
160
}
@@ -170,10 +185,11 @@ bool TDefaultErasureCounter::CheckForKeepAvailability(TClusterInfoPtr info, TErr
170
185
bool TMirror3dcCounter::CheckForKeepAvailability (TClusterInfoPtr info, TErrorInfo &error,
171
186
TInstant &defaultDeadline, bool allowPartial) const
172
187
{
173
- if (HasAlreadyLockedDisks && allowPartial) {
188
+ if (HasAlreadyLockedDisks && !HasMoreThanOneDiskPerNode && allowPartial) {
189
+ CmsCounters->Cumulative ()[COUNTER_PARTIAL_PERMISSIONS_OPTIMIZED].Increment (1 );
174
190
error.Code = TStatus::DISALLOW_TEMP;
175
191
error.Reason = " You cannot get two or more disks from the same group at the same time"
176
- " without specifying the PartialPermissionAllowed parameter " ;
192
+ " in partial permissions allowed mode " ;
177
193
error.Deadline = defaultDeadline;
178
194
return false ;
179
195
}
@@ -237,7 +253,9 @@ void TMirror3dcCounter::CountGroupState(TClusterInfoPtr info, TDuration retryTim
237
253
++DataCenterDisabledNodes[VDisk.VDiskId .FailRealm ];
238
254
}
239
255
240
- TSimpleSharedPtr<IErasureCounter> CreateErasureCounter (TErasureType::EErasureSpecies es, const TVDiskInfo &vdisk, ui32 groupId) {
256
+ TSimpleSharedPtr<IErasureCounter> CreateErasureCounter (TErasureType::EErasureSpecies es,
257
+ const TVDiskInfo &vdisk, ui32 groupId, TTabletCountersBase* cmsCounters)
258
+ {
241
259
switch (es) {
242
260
case TErasureType::ErasureNone:
243
261
case TErasureType::ErasureMirror3:
@@ -257,9 +275,9 @@ TSimpleSharedPtr<IErasureCounter> CreateErasureCounter(TErasureType::EErasureSpe
257
275
case TErasureType::Erasure2Plus2Block:
258
276
case TErasureType::Erasure2Plus2Stripe:
259
277
case TErasureType::ErasureMirror3of4:
260
- return TSimpleSharedPtr<IErasureCounter>(new TDefaultErasureCounter (vdisk, groupId));
278
+ return TSimpleSharedPtr<IErasureCounter>(new TDefaultErasureCounter (vdisk, groupId, cmsCounters ));
261
279
case TErasureType::ErasureMirror3dc:
262
- return TSimpleSharedPtr<IErasureCounter>(new TMirror3dcCounter (vdisk, groupId));
280
+ return TSimpleSharedPtr<IErasureCounter>(new TMirror3dcCounter (vdisk, groupId, cmsCounters ));
263
281
default :
264
282
Y_ABORT (" Unknown erasure type: %d" , es);
265
283
}
0 commit comments