Add a BpfMap#clear method.

A caller can mostly already do this via forEach(), but having a
specific method is faster (since the code does not need to read
the value) and easier to use.

The semantics of this method (e.g., ignore ENOENT while deleting
a key, but throw on any other error) match those of the native
BpfMap::clear method.

Test: new unit tests
Change-Id: I5cd32efd0f87c823cd2d0a2fa3a95a83093fb6f9
This commit is contained in:
Lorenzo Colitti 2021-02-24 12:15:50 +09:00
commit ffb0ccd04b
2 changed files with 40 additions and 0 deletions

View file

@ -226,6 +226,20 @@ public class BpfMap<K extends Struct, V extends Struct> implements AutoCloseable
closeMap(mMapFd);
}
/**
* Clears the map. The map may already be empty.
*
* @throws ErrnoException if the map is already closed, if an error occurred during iteration,
* or if a non-ENOENT error occurred when deleting a key.
*/
public void clear() throws ErrnoException {
K key = getFirstKey();
while (key != null) {
deleteEntry(key); // ignores ENOENT.
key = getFirstKey();
}
}
private static native int closeMap(int fd) throws ErrnoException;
private native int bpfFdGet(String path, int mode) throws ErrnoException, NullPointerException;

View file

@ -311,6 +311,32 @@ public final class BpfMapTest {
assertNull(mTestMap.getFirstKey());
}
@Test
public void testClear() throws Exception {
// Clear an empty map.
assertTrue(mTestMap.isEmpty());
mTestMap.clear();
// Clear a map with some data in it.
final ArrayMap<TetherDownstream6Key, Tether6Value> resultMap =
new ArrayMap<>(mTestData);
for (int i = 0; i < resultMap.size(); i++) {
mTestMap.insertEntry(resultMap.keyAt(i), resultMap.valueAt(i));
}
assertFalse(mTestMap.isEmpty());
mTestMap.clear();
assertTrue(mTestMap.isEmpty());
// Clearing an already-closed map throws.
mTestMap.close();
try {
mTestMap.clear();
fail("clearing already-closed map should throw");
} catch (ErrnoException expected) {
assertEquals(OsConstants.EBADF, expected.errno);
}
}
@Test
public void testInsertOverflow() throws Exception {
final ArrayMap<TetherDownstream6Key, Tether6Value> testData =