public void messageArrived(DoorTransferFinishedMessage transferFinishedMessage) { NFS4ProtocolInfo protocolInfo = (NFS4ProtocolInfo) transferFinishedMessage.getProtocolInfo(); _log.debug("Mover {} done.", protocolInfo.stateId()); org.dcache.chimera.nfs.v4.xdr.stateid4 legacyStateid = protocolInfo.stateId(); Transfer transfer = _ioMessages.remove(new stateid4(legacyStateid.other, legacyStateid.seqid.value)); if (transfer != null) { transfer.finished(transferFinishedMessage); transfer.notifyBilling(transferFinishedMessage.getReturnCode(), ""); } }
@Override public Serializable call() throws Exception { List<IoDoorEntry> entries = new ArrayList<>(); for (Transfer transfer : _ioMessages.values()) { entries.add(transfer.getIoDoorEntry()); } IoDoorInfo doorInfo = new IoDoorInfo(NFSv41Door.this.getCellName(), NFSv41Door.this.getCellDomainName()); doorInfo.setProtocol("NFSV4.1", "0"); doorInfo.setOwner(""); doorInfo.setProcess(""); doorInfo.setIoDoorEntries(entries.toArray(new IoDoorEntry[0])); return isBinary ? doorInfo : doorInfo.toString(); }
private void cleanStateAndKillMover(stateid4 stateid) { Transfer t = _ioMessages.remove(stateid); if (t != null) { t.killMover(0); } }
/** * ask pool manager for a file * * <p>On successful reply from pool manager corresponding O request will be sent to the pool to * start a NFS mover. * * @throws ChimeraNFSException in case of NFS friendly errors ( like ACCESS ) * @throws IOException in case of any other errors */ @Override public Layout layoutGet(CompoundContext context, Inode nfsInode, int ioMode, stateid4 stateid) throws IOException { FsInode inode = _fileFileSystemProvider.inodeFromBytes(nfsInode.getFileId()); CDC cdc = CDC.reset(_cellName, _domainName); try { NDC.push(inode.toString()); NDC.push(context.getRpcCall().getTransport().getRemoteSocketAddress().toString()); deviceid4 deviceid; if (inode.type() != FsInodeType.INODE || inode.getLevel() != 0) { /* * all non regular files ( AKA pnfs dot files ) provided by door itself. */ deviceid = MDS_ID; } else { final InetSocketAddress remote = context.getRpcCall().getTransport().getRemoteSocketAddress(); final PnfsId pnfsId = new PnfsId(inode.toString()); final NFS4ProtocolInfo protocolInfo = new NFS4ProtocolInfo(remote, new org.dcache.chimera.nfs.v4.xdr.stateid4(stateid)); Transfer.initSession(); NfsTransfer transfer = _ioMessages.get(stateid); if (transfer == null) { transfer = new NfsTransfer(_pnfsHandler, context.getRpcCall().getCredential().getSubject()); transfer.setProtocolInfo(protocolInfo); transfer.setCellName(this.getCellName()); transfer.setDomainName(this.getCellDomainName()); transfer.setBillingStub(_billingStub); transfer.setPoolStub(_poolManagerStub); transfer.setPoolManagerStub(_poolManagerStub); transfer.setPnfsId(pnfsId); transfer.setClientAddress(remote); transfer.readNameSpaceEntry(); _ioMessages.put(stateid, transfer); PoolDS ds = getPool(transfer, ioMode); deviceid = ds.getDeviceId(); } else { PoolDS ds = transfer.waitForRedirect(NFS_RETRY_PERIOD); deviceid = ds.getDeviceId(); } } nfs_fh4 fh = new nfs_fh4(nfsInode.toNfsHandle()); // -1 is special value, which means entire file layout4 layout = Layout.getLayoutSegment(deviceid, fh, ioMode, 0, nfs4_prot.NFS4_UINT64_MAX); return new Layout(true, stateid, new layout4[] {layout}); } catch (FileInCacheException e) { cleanStateAndKillMover(stateid); throw new ChimeraNFSException(nfsstat.NFSERR_IO, e.getMessage()); } catch (CacheException e) { cleanStateAndKillMover(stateid); /* * error 243: file is broken on tape. * can't do a much. Tell it to client. */ int status = e.getRc() == CacheException.BROKEN_ON_TAPE ? nfsstat.NFSERR_IO : nfsstat.NFSERR_LAYOUTTRYLATER; throw new ChimeraNFSException(status, e.getMessage()); } catch (InterruptedException e) { cleanStateAndKillMover(stateid); throw new ChimeraNFSException(nfsstat.NFSERR_LAYOUTTRYLATER, e.getMessage()); } finally { cdc.close(); } }