Skip to content

Commit ad3d43c

Browse files
adoroszlaixichen01
authored andcommitted
HDDS-10046. Replace PrecomputedVolumeSpace with SpaceUsageSource.Fixed (apache#5904)
(cherry picked from commit 2066868)
1 parent 4554b36 commit ad3d43c

6 files changed

Lines changed: 64 additions & 73 deletions

File tree

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/SpaceUsageSource.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,47 @@ public interface SpaceUsageSource {
4040
long getCapacity();
4141

4242
long getAvailable();
43+
44+
default SpaceUsageSource snapshot() {
45+
return new Fixed(getCapacity(), getAvailable(), getUsedSpace());
46+
}
47+
48+
SpaceUsageSource UNKNOWN = new Fixed(0, 0, 0);
49+
50+
/**
51+
* A static source of space usage. Can be a point in time snapshot of a
52+
* real volume usage, or can be used for testing.
53+
*/
54+
final class Fixed implements SpaceUsageSource {
55+
56+
private final long capacity;
57+
private final long available;
58+
private final long used;
59+
60+
Fixed(long capacity, long available, long used) {
61+
this.capacity = capacity;
62+
this.available = available;
63+
this.used = used;
64+
}
65+
66+
@Override
67+
public long getCapacity() {
68+
return capacity;
69+
}
70+
71+
@Override
72+
public long getAvailable() {
73+
return available;
74+
}
75+
76+
@Override
77+
public long getUsedSpace() {
78+
return used;
79+
}
80+
81+
@Override
82+
public SpaceUsageSource snapshot() {
83+
return this; // immutable
84+
}
85+
}
4386
}

hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/MockSpaceUsageSource.java

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,35 +36,7 @@ public static SpaceUsageSource fixed(long capacity, long available) {
3636

3737
public static SpaceUsageSource fixed(long capacity, long available,
3838
long used) {
39-
return new Fixed(capacity, available, used);
40-
}
41-
42-
private static final class Fixed implements SpaceUsageSource {
43-
44-
private final long capacity;
45-
private final long available;
46-
private final long used;
47-
48-
Fixed(long capacity, long available, long used) {
49-
this.capacity = capacity;
50-
this.available = available;
51-
this.used = used;
52-
}
53-
54-
@Override
55-
public long getCapacity() {
56-
return capacity;
57-
}
58-
59-
@Override
60-
public long getAvailable() {
61-
return available;
62-
}
63-
64-
@Override
65-
public long getUsedSpace() {
66-
return used;
67-
}
39+
return new SpaceUsageSource.Fixed(capacity, available, used);
6840
}
6941

7042
private MockSpaceUsageSource() {

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.hadoop.hdds.HddsUtils;
2626
import org.apache.hadoop.hdds.client.BlockID;
2727
import org.apache.hadoop.hdds.conf.ConfigurationSource;
28+
import org.apache.hadoop.hdds.fs.SpaceUsageSource;
2829
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
2930
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandRequestProto;
3031
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandResponseProto;
@@ -78,7 +79,6 @@
7879
import static org.apache.hadoop.hdds.scm.protocolPB.ContainerCommandResponseBuilders.malformedRequest;
7980
import static org.apache.hadoop.hdds.scm.protocolPB.ContainerCommandResponseBuilders.unsupportedRequest;
8081
import static org.apache.hadoop.ozone.container.common.interfaces.Container.ScanResult;
81-
import static org.apache.hadoop.ozone.container.common.volume.VolumeUsage.PrecomputedVolumeSpace;
8282

8383
/**
8484
* Ozone Container dispatcher takes a call from the netty server and routes it
@@ -585,8 +585,8 @@ private boolean isVolumeFull(Container container) {
585585
.orElse(Boolean.FALSE);
586586
if (isOpen) {
587587
HddsVolume volume = container.getContainerData().getVolume();
588-
PrecomputedVolumeSpace precomputedVolumeSpace =
589-
volume.getPrecomputedVolumeSpace();
588+
SpaceUsageSource precomputedVolumeSpace =
589+
volume.getCurrentUsage();
590590
long volumeCapacity = precomputedVolumeSpace.getCapacity();
591591
long volumeFreeSpaceToSpare =
592592
VolumeUsage.getMinVolumeFreeSpace(conf, volumeCapacity);

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/StorageVolume.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.hadoop.fs.StorageType;
2424
import org.apache.hadoop.hdds.conf.ConfigurationSource;
2525
import org.apache.hadoop.hdds.fs.SpaceUsageCheckFactory;
26+
import org.apache.hadoop.hdds.fs.SpaceUsageSource;
2627
import org.apache.hadoop.hdfs.server.datanode.StorageLocation;
2728
import org.apache.hadoop.hdfs.server.datanode.checker.Checkable;
2829
import org.apache.hadoop.hdfs.server.datanode.checker.VolumeCheckResult;
@@ -50,7 +51,6 @@
5051
import java.util.stream.Stream;
5152

5253
import static org.apache.hadoop.ozone.container.common.HDDSVolumeLayoutVersion.getLatestVersion;
53-
import static org.apache.hadoop.ozone.container.common.volume.VolumeUsage.PrecomputedVolumeSpace;
5454

5555

5656
/**
@@ -456,14 +456,14 @@ public long getAvailable() {
456456

457457
}
458458

459-
public long getAvailable(PrecomputedVolumeSpace precomputedVolumeSpace) {
459+
public long getAvailable(SpaceUsageSource precomputedVolumeSpace) {
460460
return volumeInfo.map(info -> info.getAvailable(precomputedVolumeSpace))
461461
.orElse(0L);
462462
}
463463

464-
public PrecomputedVolumeSpace getPrecomputedVolumeSpace() {
465-
return volumeInfo.map(VolumeInfo::getPrecomputedVolumeSpace)
466-
.orElse(new PrecomputedVolumeSpace(0L, 0L));
464+
public SpaceUsageSource getCurrentUsage() {
465+
return volumeInfo.map(VolumeInfo::getCurrentUsage)
466+
.orElse(SpaceUsageSource.UNKNOWN);
467467
}
468468

469469
public long getUsedSpace() {

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfo.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@
2929
import org.apache.hadoop.hdds.fs.SpaceUsageCheckParams;
3030

3131
import com.google.common.annotations.VisibleForTesting;
32+
import org.apache.hadoop.hdds.fs.SpaceUsageSource;
3233
import org.slf4j.Logger;
3334
import org.slf4j.LoggerFactory;
3435

35-
import static org.apache.hadoop.ozone.container.common.volume.VolumeUsage.PrecomputedVolumeSpace;
3636
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_DU_RESERVED;
3737
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_DU_RESERVED_PERCENT;
3838
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_DU_RESERVED_PERCENT_DEFAULT;
@@ -240,13 +240,13 @@ public long getAvailable() {
240240
return Math.max(Math.min(avail, usage.getAvailable()), 0);
241241
}
242242

243-
public long getAvailable(PrecomputedVolumeSpace precomputedValues) {
243+
public long getAvailable(SpaceUsageSource precomputedValues) {
244244
long avail = precomputedValues.getCapacity() - usage.getUsedSpace();
245245
return Math.max(Math.min(avail, usage.getAvailable(precomputedValues)), 0);
246246
}
247247

248-
public PrecomputedVolumeSpace getPrecomputedVolumeSpace() {
249-
return usage.getPrecomputedVolumeSpace();
248+
public SpaceUsageSource getCurrentUsage() {
249+
return usage.snapshot();
250250
}
251251

252252
public void incrementUsedSpace(long usedSpace) {

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeUsage.java

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public long getAvailable() {
6565
return source.getAvailable() - getRemainingReserved();
6666
}
6767

68-
public long getAvailable(PrecomputedVolumeSpace precomputedVolumeSpace) {
68+
public long getAvailable(SpaceUsageSource precomputedVolumeSpace) {
6969
long available = precomputedVolumeSpace.getAvailable();
7070
return available - getRemainingReserved(precomputedVolumeSpace);
7171
}
@@ -75,6 +75,11 @@ public long getUsedSpace() {
7575
return source.getUsedSpace();
7676
}
7777

78+
@Override
79+
public SpaceUsageSource snapshot() {
80+
return source.snapshot();
81+
}
82+
7883
public void incrementUsedSpace(long usedSpace) {
7984
source.incrementUsedSpace(usedSpace);
8085
}
@@ -94,7 +99,7 @@ private long getOtherUsed() {
9499
return Math.max(totalUsed - source.getUsedSpace(), 0L);
95100
}
96101

97-
private long getOtherUsed(PrecomputedVolumeSpace precomputedVolumeSpace) {
102+
private long getOtherUsed(SpaceUsageSource precomputedVolumeSpace) {
98103
long totalUsed = precomputedVolumeSpace.getCapacity() -
99104
precomputedVolumeSpace.getAvailable();
100105
return Math.max(totalUsed - source.getUsedSpace(), 0L);
@@ -105,7 +110,7 @@ private long getRemainingReserved() {
105110
}
106111

107112
private long getRemainingReserved(
108-
PrecomputedVolumeSpace precomputedVolumeSpace) {
113+
SpaceUsageSource precomputedVolumeSpace) {
109114
return Math.max(reservedInBytes - getOtherUsed(precomputedVolumeSpace), 0L);
110115
}
111116

@@ -169,33 +174,4 @@ public static boolean hasVolumeEnoughSpace(long volumeAvailableSpace,
169174
return (volumeAvailableSpace - volumeCommittedBytesCount) >
170175
Math.max(requiredSpace, volumeFreeSpaceToSpare);
171176
}
172-
173-
/**
174-
* Class representing precomputed space values of a volume.
175-
* This class is intended to store precomputed values, such as capacity
176-
* and available space of a volume, to avoid recalculating these
177-
* values multiple times and to make method signatures simpler.
178-
*/
179-
public static class PrecomputedVolumeSpace {
180-
private final long capacity;
181-
private final long available;
182-
183-
public PrecomputedVolumeSpace(long capacity, long available) {
184-
this.capacity = capacity;
185-
this.available = available;
186-
}
187-
188-
public long getCapacity() {
189-
return capacity;
190-
}
191-
192-
public long getAvailable() {
193-
return available;
194-
}
195-
}
196-
197-
public PrecomputedVolumeSpace getPrecomputedVolumeSpace() {
198-
return new PrecomputedVolumeSpace(source.getCapacity(),
199-
source.getAvailable());
200-
}
201177
}

0 commit comments

Comments
 (0)