Github user srdo commented on a diff in the pull request: https://github.com/apache/storm/pull/2743#discussion_r204882262 --- Diff: storm-server/src/main/java/org/apache/storm/daemon/nimbus/TimedWritableByteChannel.java --- @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. + * See the NOTICE file distributed with this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package org.apache.storm.daemon.nimbus; + +import com.codahale.metrics.Timer; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.WritableByteChannel; + +import org.apache.storm.metric.timed.TimedResource; + +public class TimedWritableByteChannel extends TimedResource<WritableByteChannel> implements WritableByteChannel { + + public TimedWritableByteChannel(WritableByteChannel measured, Timer timer) { + super(measured, timer); + } + + @Override + public int write(ByteBuffer src) throws IOException { + return getMeasured().write(src); + } + + @Override + public boolean isOpen() { + return getMeasured().isOpen(); + } + + @Override + public void close() throws IOException { + try { + super.close(); + } catch (Exception e) { + //WritableByteChannel is a Channel which implements Closeable. + // Hence although declared AutoCloseable super#close here should only throws IOException + //We rethrow to conform the signature + throw (IOException) e; --- End diff -- Just as a follow up to our earlier discussion here, I think you can avoid the downcast by making TimedResource implement both AutoCloseable and Closeable. Unless we have a class in mind that only implements AutoCloseable (which seems rare), this shouldn't be a constraint that affects us.
---