use of diskCacheV111.vehicles.PnfsClearCacheLocationMessage in project dcache by dCache.
the class RemoteNameSpaceProviderTests method shouldSucceedWhenClearCacheLocationRemoveLast.
@Test
public void shouldSucceedWhenClearCacheLocationRemoveLast() throws Exception {
givenSuccessfulResponse();
_namespace.clearCacheLocation(ROOT, A_PNFSID, "pool-1", true);
PnfsClearCacheLocationMessage sent = getSingleSendAndWaitMessage(PnfsClearCacheLocationMessage.class);
assertThat(sent.getReplyRequired(), is(true));
assertThat(sent.getSubject(), is(ROOT));
assertThat(sent.getPnfsId(), is(A_PNFSID));
assertThat(sent.getPoolName(), is("pool-1"));
assertThat(sent.removeIfLast(), is(true));
}
use of diskCacheV111.vehicles.PnfsClearCacheLocationMessage in project dcache by dCache.
the class RepositorySubsystemTest method createEntry4.
/* Helper method for creating a fourth entry in the repository.
*/
private void createEntry4(final boolean failSetAttributes, final boolean cancel, final ReplicaState transferState, final ReplicaState finalState) throws Throwable {
new CellStubHelper(cell) {
boolean setAttr;
boolean addCache;
@Message(required = false, step = 1, cell = "pnfs")
public Object whenFileIsGarbageCollected(PnfsClearCacheLocationMessage msg) {
msg.setSucceeded();
return msg;
}
@Message(required = false, step = 3, cell = "pnfs")
public Object whenDescriptorIsCommitted(PnfsSetFileAttributes msg) {
assertEquals(size4, msg.getFileAttributes().getSize());
if (failSetAttributes) {
msg.setFailed(1, null);
} else {
msg.setSucceeded();
}
setAttr = true;
return msg;
}
@Message(required = false, step = 5, cell = "pnfs")
public Object whenDescriptorFails(PnfsAddCacheLocationMessage msg) {
assertTrue(failSetAttributes || cancel);
msg.setSucceeded();
addCache = true;
return msg;
}
@Message(required = false, step = 5, cell = "pnfs")
public Object whenDescriptorFails(PnfsSetFileAttributes msg) {
assertTrue(failSetAttributes || cancel);
msg.setSucceeded();
return msg;
}
@Override
protected void run() throws FileInCacheException, CacheException, InterruptedException, IOException {
List<StickyRecord> stickyRecords = Collections.emptyList();
ReplicaDescriptor handle = repository.createEntry(attributes4, transferState, finalState, stickyRecords, EnumSet.noneOf(OpenFlags.class), OptionalLong.empty());
try {
assertStep("No clear after this point", 2);
createFile(handle, size4);
if (!cancel) {
handle.commit();
}
} finally {
assertStep("Only failure registration after this point", 4);
handle.close();
}
assertEquals("SetFileAttributes must be sent unless we don't try to commit", !cancel, setAttr);
assertEquals("AddCacheLocation must be sent if not committed", cancel || failSetAttributes, addCache);
}
};
}
use of diskCacheV111.vehicles.PnfsClearCacheLocationMessage in project dcache by dCache.
the class RepositorySubsystemTest method testRemoveOpenAgain.
@Test(expected = LockedCacheException.class)
public void testRemoveOpenAgain() throws Throwable {
repository.init();
repository.load();
stateChangeEvents.clear();
new CellStubHelper(cell) {
@Message(required = true, step = 1, cell = "pnfs")
public Object message(PnfsClearCacheLocationMessage msg) {
msg.setSucceeded();
return msg;
}
@Override
protected void run() throws CacheException, InterruptedException, IllegalTransitionException {
ReplicaDescriptor h1 = repository.openEntry(id1, EnumSet.noneOf(OpenFlags.class));
repository.setState(id1, REMOVED, "test");
expectStateChangeEvent(id1, PRECIOUS, REMOVED);
assertStep("Cache location should have been cleared", 1);
ReplicaDescriptor h2 = repository.openEntry(id1, EnumSet.noneOf(OpenFlags.class));
}
};
}
use of diskCacheV111.vehicles.PnfsClearCacheLocationMessage in project dcache by dCache.
the class PnfsManagerV3 method postProcessLocationModificationMessage.
private void postProcessLocationModificationMessage(CellMessage envelope, PnfsMessage message) {
if (message.getReplyRequired()) {
envelope.revertDirection();
sendMessage(envelope);
}
if (message instanceof PnfsAddCacheLocationMessage) {
PnfsMessage msg = new PnfsAddCacheLocationMessage(message.getPnfsId(), ((PnfsAddCacheLocationMessage) message).getPoolName());
sendMessage(new CellMessage(_cacheModificationRelay, msg));
} else if (message instanceof PnfsClearCacheLocationMessage) {
PnfsMessage msg = new PnfsClearCacheLocationMessage(message.getPnfsId(), ((PnfsClearCacheLocationMessage) message).getPoolName());
sendMessage(new CellMessage(_cacheModificationRelay, msg));
} else if (message instanceof PnfsSetFileAttributes) {
Collection<String> locations = ((PnfsSetFileAttributes) message).getLocations();
if (locations == null) {
return;
}
PnfsId pnfsId = message.getPnfsId();
locations.stream().forEach((pool) -> {
PnfsMessage msg = new PnfsAddCacheLocationMessage(pnfsId, pool);
sendMessage(new CellMessage(_cacheModificationRelay, msg));
});
}
}
use of diskCacheV111.vehicles.PnfsClearCacheLocationMessage in project dcache by dCache.
the class PnfsManagerV3 method clearCacheLocation.
public void clearCacheLocation(PnfsClearCacheLocationMessage pnfsMessage) {
PnfsId pnfsId = pnfsMessage.getPnfsId();
LOGGER.info("clearCacheLocation : {} for {}", pnfsMessage.getPoolName(), pnfsId);
try {
checkMask(pnfsMessage);
checkRestriction(pnfsMessage, UPDATE_METADATA);
_nameSpaceProvider.clearCacheLocation(pnfsMessage.getSubject(), pnfsId, pnfsMessage.getPoolName(), pnfsMessage.removeIfLast());
} catch (FileNotFoundCacheException fnf) {
pnfsMessage.setFailed(CacheException.FILE_NOT_FOUND, fnf.getMessage());
} catch (CacheException e) {
LOGGER.warn("Exception in clearCacheLocation for {}: {}", pnfsId, e.toString());
pnfsMessage.setFailed(e.getRc(), e.getMessage());
} catch (RuntimeException e) {
LOGGER.error("Exception in clearCacheLocation for " + pnfsId, e);
pnfsMessage.setFailed(CacheException.UNEXPECTED_SYSTEM_EXCEPTION, e.getMessage());
}
}
Aggregations