From 3d1371a1704e24a6589447b557310a58d3d78dca Mon Sep 17 00:00:00 2001 From: Tigran Mkrtchyan Date: Wed, 16 Nov 2016 12:32:00 +0100 Subject: [PATCH] nfs: remove deviceid to data server mapping when pool is removed Motivation: When mapping between pool name and IP address is removed, we ween to remove remove corresponding mapping for device id as well. Modification: remove devide id -> data server mapping when pool is removed Result: no dangling device ids Acked-by: Paul Millar Target: master Require-book: no Require-notes: no --- .../dcache/chimera/nfsv41/door/PoolDeviceMap.java | 6 +++++- .../chimera/nfsv41/door/PoolDeviceMapTest.java | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/modules/dcache-nfs/src/main/java/org/dcache/chimera/nfsv41/door/PoolDeviceMap.java b/modules/dcache-nfs/src/main/java/org/dcache/chimera/nfsv41/door/PoolDeviceMap.java index dd33458c3ad..8ed1976fb3d 100644 --- a/modules/dcache-nfs/src/main/java/org/dcache/chimera/nfsv41/door/PoolDeviceMap.java +++ b/modules/dcache-nfs/src/main/java/org/dcache/chimera/nfsv41/door/PoolDeviceMap.java @@ -107,7 +107,11 @@ Collection> getEntries() { PoolDS remove(String pool) { _wlock.lock(); try { - return _poolNameToIpMap.remove(pool); + PoolDS ds = _poolNameToIpMap.remove(pool); + if (ds != null) { + _deviceMap.remove(ds.getDeviceId()); + } + return ds; } finally { _wlock.unlock(); } diff --git a/modules/dcache-nfs/src/test/java/org/dcache/chimera/nfsv41/door/PoolDeviceMapTest.java b/modules/dcache-nfs/src/test/java/org/dcache/chimera/nfsv41/door/PoolDeviceMapTest.java index 2ad1655aaae..d200ac34e4b 100644 --- a/modules/dcache-nfs/src/test/java/org/dcache/chimera/nfsv41/door/PoolDeviceMapTest.java +++ b/modules/dcache-nfs/src/test/java/org/dcache/chimera/nfsv41/door/PoolDeviceMapTest.java @@ -3,12 +3,12 @@ import java.net.InetSocketAddress; import java.net.UnknownHostException; import org.dcache.nfs.v4.xdr.deviceid4; -import org.junit.Assert; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; public class PoolDeviceMapTest { @@ -43,6 +43,16 @@ public void testUpdateExisting() throws UnknownHostException { InetSocketAddress[] ip = new InetSocketAddress[]{new InetSocketAddress(0)}; NFSv41Door.PoolDS ds = _poolDeviceMap.getOrCreateDS(name, 0, ip); - Assert.assertSame(ds, _poolDeviceMap.getOrCreateDS(name, 0, ip)); + assertSame(ds, _poolDeviceMap.getOrCreateDS(name, 0, ip)); + } + + @Test + public void testRemoveExisting() throws UnknownHostException { + String name = "somePool"; + InetSocketAddress[] ip = new InetSocketAddress[]{new InetSocketAddress(0)}; + + NFSv41Door.PoolDS ds = _poolDeviceMap.getOrCreateDS(name, 0, ip); + _poolDeviceMap.remove(name); + assertNull("Removed pool stil available", _poolDeviceMap.getByDeviceId(ds.getDeviceId())); } }