public LFCOutputStream( ITaskMonitor monitor, LFCFile lfcFile, VFile replica, LFCClient client, boolean isNewRepl) throws IOException { super(); this.lfcFile = lfcFile; this.replica = replica; info("Opening OutputStream to replica:" + replica); this.outputStream = replica.createOutputStream(); this.isNewReplica = isNewRepl; this.monitor = monitor; debug("Replica should be created in: " + replica.getVRL()); this.client = client; }
@Override public void close() throws IOException { try { outputStream.close(); } catch (Exception e) { info("Couldn't close outputstream. Already closed ?:" + e); } try { // after closing a stream we can register the replica // together with a new LFC entry: if (lfcFile.exists() == false) { monitor.startSubTask("LFC: Registering new File entry", -1); monitor.logPrintf("LFC: Registering new File entry:\n - " + lfcFile + "\n"); lfcFile.create(); // register new netry without replicas monitor.endSubTask("LFC: Registering new File entry"); } // as soon as the replica is created register it if (isNewReplica) { monitor.startSubTask("LFC: Registering new replica", -1); monitor.logPrintf("LFC: Registering new replica:\n - " + replica.getVRL() + "\n"); this.client.addReplica(monitor, lfcFile, replica, true); monitor.endSubTask("LFC: Registering new replica"); } else { // if this is an existing replica just update metadata (checksum // , size). This also fixes the bug of getting the correct size // after writing twice monitor.startSubTask("LFC: Updating replica metadata", -1); monitor.logPrintf("LFC: Updating metadata for: \n - " + replica.getVRL() + "\n"); client.updateReplicaMetaData(monitor, lfcFile, replica); monitor.endSubTask("LFC: Updating replica metadata"); } // LinkHandling new or existing file should be resolved link: FileDescWrapper wrapperDesc = client.queryPath(lfcFile.getPath(), true); lfcFile.setWrapperDesc(wrapperDesc); debug("-------------LFC file is: " + lfcFile.getLength() + " bytes"); debug("-------------Replica file is " + replica.getLength() + " bytes"); if (lfcFile.getLength() != replica.getLength()) { error( "LFC file and replica file sizes don't match!!! LFC file is " + lfcFile.getLength() + " bytes and replica " + replica.getLength() + " bytes"); } monitor.logPrintf( "LFC: Finalizing entry: setting new file size (updated from replica) to:" + wrapperDesc.getFileDesc().getFileSize() + "\n"); info("Closing OutputStream. Finalizing upload to:" + lfcFile); } catch (Exception e) { IOException ex = new IOException(e.getMessage()); ex.initCause(e); throw ex; } finally { } }