Skip to content

Commit 138cbe3

Browse files
authored
HDDS-11998. BlockDataStreamOutput should decrPendingContainerOpsMetrics (apache#7636)
1 parent de79c37 commit 138cbe3

File tree

3 files changed

+56
-30
lines changed

3 files changed

+56
-30
lines changed

hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/BlockDataStreamOutput.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ public void write(ByteBuffer b, int off, int len) throws IOException {
253253
}
254254
while (len > 0) {
255255
allocateNewBufferIfNeeded();
256-
int writeLen = Math.min(len, currentBuffer.length());
256+
int writeLen = Math.min(len, currentBuffer.remaining());
257257
final StreamBuffer buf = new StreamBuffer(b, off, writeLen);
258258
currentBuffer.put(buf);
259259
writeChunkIfNeeded();
@@ -265,7 +265,7 @@ public void write(ByteBuffer b, int off, int len) throws IOException {
265265
}
266266

267267
private void writeChunkIfNeeded() throws IOException {
268-
if (currentBuffer.length() == 0) {
268+
if (currentBuffer.remaining() == 0) {
269269
writeChunk(currentBuffer);
270270
currentBuffer = null;
271271
}
@@ -672,6 +672,7 @@ private void writeChunkToContainer(ByteBuffer buf)
672672
out.writeAsync(buf, StandardWriteOption.SYNC) :
673673
out.writeAsync(buf))
674674
.whenCompleteAsync((r, e) -> {
675+
metrics.decrPendingContainerOpsMetrics(ContainerProtos.Type.WriteChunk);
675676
if (e != null || !r.isSuccess()) {
676677
if (e == null) {
677678
e = new IOException("result is not success");

hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/StreamBuffer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ public ByteBuffer duplicate() {
3939
return buffer.duplicate();
4040
}
4141

42-
public int length() {
43-
return buffer.limit() - buffer.position();
42+
public int remaining() {
43+
return buffer.remaining();
4444
}
4545

4646
public int position() {

hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestBlockDataStreamOutput.java

Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
2323
import org.apache.hadoop.hdds.conf.StorageUnit;
2424
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
25-
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
2625
import org.apache.hadoop.hdds.scm.OzoneClientConfig;
2726
import org.apache.hadoop.hdds.scm.XceiverClientManager;
2827
import org.apache.hadoop.hdds.scm.XceiverClientMetrics;
@@ -47,13 +46,14 @@
4746
import org.junit.jupiter.api.Test;
4847
import org.junit.jupiter.api.Timeout;
4948

50-
import java.io.IOException;
5149
import java.nio.ByteBuffer;
5250
import java.util.List;
5351
import java.util.UUID;
5452
import java.util.concurrent.TimeUnit;
5553

5654
import static java.nio.charset.StandardCharsets.UTF_8;
55+
import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type.PutBlock;
56+
import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type.WriteChunk;
5757
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_STALENODE_INTERVAL;
5858
import static org.assertj.core.api.Assertions.assertThat;
5959
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -77,13 +77,6 @@ public class TestBlockDataStreamOutput {
7777
private static String keyString;
7878
private static final DatanodeVersion DN_OLD_VERSION = DatanodeVersion.SEPARATE_RATIS_PORTS_AVAILABLE;
7979

80-
/**
81-
* Create a MiniDFSCluster for testing.
82-
* <p>
83-
* Ozone is made active by setting OZONE_ENABLED = true
84-
*
85-
* @throws IOException
86-
*/
8780
@BeforeAll
8881
public static void init() throws Exception {
8982
chunkSize = 100;
@@ -120,7 +113,7 @@ public static void init() throws Exception {
120113
client = OzoneClientFactory.getRpcClient(conf);
121114
objectStore = client.getObjectStore();
122115
keyString = UUID.randomUUID().toString();
123-
volumeName = "testblockoutputstream";
116+
volumeName = "testblockdatastreamoutput";
124117
bucketName = volumeName;
125118
objectStore.createVolume(volumeName);
126119
objectStore.getVolume(volumeName).createBucket(bucketName);
@@ -130,9 +123,6 @@ static String getKeyName() {
130123
return UUID.randomUUID().toString();
131124
}
132125

133-
/**
134-
* Shutdown MiniDFSCluster.
135-
*/
136126
@AfterAll
137127
public static void shutdown() {
138128
IOUtils.closeQuietly(client);
@@ -166,6 +156,11 @@ public void testMultiBlockWrite() throws Exception {
166156
}
167157

168158
static void testWrite(int dataLength) throws Exception {
159+
XceiverClientMetrics metrics =
160+
XceiverClientManager.getXceiverClientMetrics();
161+
long pendingWriteChunkCount = metrics.getPendingContainerOpCountMetrics(WriteChunk);
162+
long pendingPutBlockCount = metrics.getPendingContainerOpCountMetrics(PutBlock);
163+
169164
String keyName = getKeyName();
170165
OzoneDataStreamOutput key = createKey(
171166
keyName, ReplicationType.RATIS, dataLength);
@@ -174,9 +169,19 @@ static void testWrite(int dataLength) throws Exception {
174169
// now close the stream, It will update the key length.
175170
key.close();
176171
validateData(keyName, data);
172+
173+
assertEquals(pendingPutBlockCount,
174+
metrics.getPendingContainerOpCountMetrics(PutBlock));
175+
assertEquals(pendingWriteChunkCount,
176+
metrics.getPendingContainerOpCountMetrics(WriteChunk));
177177
}
178178

179179
private void testWriteWithFailure(int dataLength) throws Exception {
180+
XceiverClientMetrics metrics =
181+
XceiverClientManager.getXceiverClientMetrics();
182+
long pendingWriteChunkCount = metrics.getPendingContainerOpCountMetrics(WriteChunk);
183+
long pendingPutBlockCount = metrics.getPendingContainerOpCountMetrics(PutBlock);
184+
180185
String keyName = getKeyName();
181186
OzoneDataStreamOutput key = createKey(
182187
keyName, ReplicationType.RATIS, dataLength);
@@ -195,32 +200,50 @@ private void testWriteWithFailure(int dataLength) throws Exception {
195200
key.close();
196201
String dataString = new String(data, UTF_8);
197202
validateData(keyName, dataString.concat(dataString).getBytes(UTF_8));
203+
204+
assertEquals(pendingPutBlockCount,
205+
metrics.getPendingContainerOpCountMetrics(PutBlock));
206+
assertEquals(pendingWriteChunkCount,
207+
metrics.getPendingContainerOpCountMetrics(WriteChunk));
198208
}
199209

200210
@Test
201211
public void testPutBlockAtBoundary() throws Exception {
202-
int dataLength = 500;
212+
int dataLength = maxFlushSize + 100;
203213
XceiverClientMetrics metrics =
204214
XceiverClientManager.getXceiverClientMetrics();
205-
long putBlockCount = metrics.getContainerOpCountMetrics(
206-
ContainerProtos.Type.PutBlock);
207-
long pendingPutBlockCount = metrics.getPendingContainerOpCountMetrics(
208-
ContainerProtos.Type.PutBlock);
215+
long writeChunkCount = metrics.getContainerOpCountMetrics(WriteChunk);
216+
long putBlockCount = metrics.getContainerOpCountMetrics(PutBlock);
217+
long pendingWriteChunkCount = metrics.getPendingContainerOpCountMetrics(WriteChunk);
218+
long pendingPutBlockCount = metrics.getPendingContainerOpCountMetrics(PutBlock);
219+
long totalOpCount = metrics.getTotalOpCount();
220+
209221
String keyName = getKeyName();
210222
OzoneDataStreamOutput key = createKey(
211223
keyName, ReplicationType.RATIS, 0);
212224
byte[] data =
213225
ContainerTestHelper.getFixedLengthString(keyString, dataLength)
214226
.getBytes(UTF_8);
215227
key.write(ByteBuffer.wrap(data));
216-
assertThat(metrics.getPendingContainerOpCountMetrics(ContainerProtos.Type.PutBlock))
228+
assertThat(metrics.getPendingContainerOpCountMetrics(PutBlock))
217229
.isLessThanOrEqualTo(pendingPutBlockCount + 1);
230+
assertThat(metrics.getPendingContainerOpCountMetrics(WriteChunk))
231+
.isLessThanOrEqualTo(pendingWriteChunkCount + 5);
218232
key.close();
219233
// Since data length is 500 , first putBlock will be at 400(flush boundary)
220234
// and the other at 500
221-
assertEquals(
222-
metrics.getContainerOpCountMetrics(ContainerProtos.Type.PutBlock),
223-
putBlockCount + 2);
235+
assertEquals(putBlockCount + 2,
236+
metrics.getContainerOpCountMetrics(PutBlock));
237+
// Each chunk is 100 so there will be 500 / 100 = 5 chunks.
238+
assertEquals(writeChunkCount + 5,
239+
metrics.getContainerOpCountMetrics(WriteChunk));
240+
assertEquals(totalOpCount + 7,
241+
metrics.getTotalOpCount());
242+
assertEquals(pendingPutBlockCount,
243+
metrics.getPendingContainerOpCountMetrics(PutBlock));
244+
assertEquals(pendingWriteChunkCount,
245+
metrics.getPendingContainerOpCountMetrics(WriteChunk));
246+
224247
validateData(keyName, data);
225248
}
226249

@@ -242,20 +265,22 @@ public void testMinPacketSize() throws Exception {
242265
XceiverClientMetrics metrics =
243266
XceiverClientManager.getXceiverClientMetrics();
244267
OzoneDataStreamOutput key = createKey(keyName, ReplicationType.RATIS, 0);
245-
long writeChunkCount =
246-
metrics.getContainerOpCountMetrics(ContainerProtos.Type.WriteChunk);
268+
long writeChunkCount = metrics.getContainerOpCountMetrics(WriteChunk);
269+
long pendingWriteChunkCount = metrics.getPendingContainerOpCountMetrics(WriteChunk);
247270
byte[] data =
248271
ContainerTestHelper.getFixedLengthString(keyString, chunkSize / 2)
249272
.getBytes(UTF_8);
250273
key.write(ByteBuffer.wrap(data));
251274
// minPacketSize= 100, so first write of 50 wont trigger a writeChunk
252275
assertEquals(writeChunkCount,
253-
metrics.getContainerOpCountMetrics(ContainerProtos.Type.WriteChunk));
276+
metrics.getContainerOpCountMetrics(WriteChunk));
254277
key.write(ByteBuffer.wrap(data));
255278
assertEquals(writeChunkCount + 1,
256-
metrics.getContainerOpCountMetrics(ContainerProtos.Type.WriteChunk));
279+
metrics.getContainerOpCountMetrics(WriteChunk));
257280
// now close the stream, It will update the key length.
258281
key.close();
282+
assertEquals(pendingWriteChunkCount,
283+
metrics.getPendingContainerOpCountMetrics(WriteChunk));
259284
String dataString = new String(data, UTF_8);
260285
validateData(keyName, dataString.concat(dataString).getBytes(UTF_8));
261286
}

0 commit comments

Comments
 (0)