Skip to content

Commit

Permalink
Detecting when a deserialized Map is immutable before changing it in …
Browse files Browse the repository at this point in the history
…IndexDiskUsageStats (#77219)

This commit prevents errors that can happen if an empty fields map is serialized and deserialized
in IndexDiskUsageStats.
  • Loading branch information
masseyke authored Sep 7, 2021
1 parent ac86642 commit ececfff
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public IndexDiskUsageStats(long indexSizeInBytes) {
}

public IndexDiskUsageStats(StreamInput in) throws IOException {
this.fields = in.readMap(StreamInput::readString, PerFieldDiskUsage::new);
this.fields = new HashMap<>(in.readMap(StreamInput::readString, PerFieldDiskUsage::new));
this.indexSizeInBytes = in.readVLong();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

package org.elasticsearch.action.admin.indices.diskusage;

import org.elasticsearch.common.io.stream.BytesStreamOutput;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.test.ESTestCase;

import java.io.IOException;

public class IndexDiskUsageStatsTests extends ESTestCase {

public void testEmptySerialization() throws IOException {
IndexDiskUsageStats emptyDndexDiskUsageStats = createEmptyDiskUsageStats();
try (BytesStreamOutput out = new BytesStreamOutput()) {
emptyDndexDiskUsageStats.writeTo(out);
try (StreamInput in = out.bytes().streamInput()) {
IndexDiskUsageStats deserializedNodeStats = new IndexDiskUsageStats(in);
assertEquals(emptyDndexDiskUsageStats.getIndexSizeInBytes(), deserializedNodeStats.getIndexSizeInBytes());
assertEquals(emptyDndexDiskUsageStats.getFields(), deserializedNodeStats.getFields());
// Now just making sure that an exception doesn't get thrown here:
deserializedNodeStats.addStoredField(randomAlphaOfLength(10), randomNonNegativeLong());
}
}
}

private IndexDiskUsageStats createEmptyDiskUsageStats() {
return new IndexDiskUsageStats(randomNonNegativeLong());
}

}

0 comments on commit ececfff

Please sign in to comment.