/* * 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.flink.runtime.io.disk.iomanager; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.flink.util.Preconditions; public abstract class AbstractFileIOChannel implements FileIOChannel { /** Logger object for channel and its subclasses */ protected static final Logger LOG = LoggerFactory.getLogger(FileIOChannel.class); /** The ID of the underlying channel. */ protected final FileIOChannel.ID id; /** A file channel for NIO access to the file. */ protected final FileChannel fileChannel; /** * Creates a new channel to the path indicated by the given ID. The channel hands IO requests to * the given request queue to be processed. * * @param channelID The id describing the path of the file that the channel accessed. * @param writeEnabled Flag describing whether the channel should be opened in read/write mode, rather * than in read-only mode. * @throws IOException Thrown, if the channel could no be opened. */ protected AbstractFileIOChannel(FileIOChannel.ID channelID, boolean writeEnabled) throws IOException { this.id = Preconditions.checkNotNull(channelID); try { @SuppressWarnings("resource") RandomAccessFile file = new RandomAccessFile(id.getPath(), writeEnabled ? "rw" : "r"); this.fileChannel = file.getChannel(); } catch (IOException e) { throw new IOException("Channel to path '" + channelID.getPath() + "' could not be opened.", e); } } // -------------------------------------------------------------------------------------------- @Override public final FileIOChannel.ID getChannelID() { return this.id; } @Override public long getSize() throws IOException { FileChannel channel = fileChannel; return channel == null ? 0 : channel.size(); } @Override public abstract boolean isClosed(); @Override public abstract void close() throws IOException; @Override public void deleteChannel() { if (!isClosed() || this.fileChannel.isOpen()) { throw new IllegalStateException("Cannot delete a channel that is open."); } // make a best effort to delete the file. Don't report exceptions. try { File f = new File(this.id.getPath()); if (f.exists()) { f.delete(); } } catch (Throwable t) {} } @Override public void closeAndDelete() throws IOException { try { close(); } finally { deleteChannel(); } } @Override public FileChannel getNioFileChannel() { return fileChannel; } }