Project: Flume-Hive
/**
 * Licensed to Cloudera, Inc. under one 
 * or more contributor license agreements.  See the NOTICE file 
 * distributed with this work for additional information 
 * regarding copyright ownership.  Cloudera, Inc. 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 com.cloudera.flume.agent.diskfailover; 
 
import java.io.IOException; 
 
import com.cloudera.flume.core.EventSink; 
import com.cloudera.flume.core.EventSource; 
import com.cloudera.flume.handlers.rolling.RollSink; 
import com.cloudera.flume.handlers.rolling.RollTrigger; 
import com.cloudera.flume.handlers.rolling.Tagger; 
import com.cloudera.flume.reporter.Reportable; 
 
/**
 * This is the interface for providing durability of events until the reach the 
 * permanent store. This is intended to be used after a detected failure and has 
 * a slightly different state machine than the WALManager's. Different 
 * implementations can be encapsulated by this interface. 
 *  
 * Implementations of this interface must be thread safe -- it may be called 
 * from different threads. 
 */
 
 
public interface DiskFailoverManager extends Reportable { 
  /**
   * These are the states a batch of events can be in. 
   *  
   * WRITING means that there is some entity writing to the set of data. 
   *  
   * LOGGED means that the data is durable on the node. 
   *  
   * SENDING means that data is durable and is being sent somewhere downstream 
   *  
   * SENT means that data has been received by the next downstream node. This 
   * data can be deleted. 
   *  
   * ERROR means that the set of data contains an error. 
   */
 
  enum State { 
    IMPORT, WRITING, LOGGED, SENDING, SENT, ERROR 
  }; 
 
  final public static String A_MSG_WRITING = "writingEvts"
  final public static String A_MSG_READ = "readEvts"
 
  final public static String A_IMPORTED = "importedChunks"
  final public static String A_WRITING = "writingChunks"
  final public static String A_LOGGED = "loggedChunks"
  final public static String A_SENDING = "sendingChunks"
  final public static String A_SENT = "sentChunks"
  final public static String A_ACKED = "ackedChunks"
  final public static String A_ERROR = "errorChunks"
  final public static String A_RECOVERED = "recoveredChunks"
  final public static String A_IN_LOGGED = "loggedQChunks"
 
  /**
   * Open the WAL manager to enable reads and writes. 
   */
 
  public void open() throws IOException; 
 
  /**
   * Closes the WAL manager for reads and writes 
   */
 
  public void close() throws IOException; 
 
  /**
   * Recover data that is not in ERROR state assuming that data transmission has 
   * failed. This is called to recover durable data and retry sends after a 
   * crash. 
   */
 
  public void recover() throws IOException; 
 
  /**
   * Get a new sink to write events to. Events are durably written before being 
   * transmitted. The tagger creates a unique name for the batch of events. 
   */
 
  public EventSink newWritingSink(Tagger t) throws IOException; 
 
  /**
   * Gets an unacked batch. Read from the Failover Event log by getting event 
   * sources from the DiskFailoverManager. This changes state, and will block 
   * when exhausted, or return null when shutdown. 
   */
 
  public EventSource getUnsentSource() throws IOException; 
 
  /**
   * Get a logical sink that breaks stream of data into mini batches 
   * transparently to the user. When the RollTrigger's predicate condition is 
   * met, the rolling sink closes the previous sink and calls newWritingSink to 
   * roll to a new writer. 
   */
 
  public RollSink getEventSink(RollTrigger t) throws IOException; 
 
  /**
   * Get a source that logically provides a single stream. This should call 
   * getUnackedSource() underneath to get another event batch. 
   */
 
  public EventSource getEventSource() throws IOException; 
 
  /**
   * This imports "external data" into the WAL. Currently this is used for 
   * testing. 
   *  
   * TODO (jon) This interface is not quite right -- it should take a file and a 
   * format as an arg. This will be revisited when we revist the Log4J, Log4Net, 
   * and avro serialization integration. 
   */
 
  public void importData() throws IOException; 
 
  /**
   * Transition a data set tagged with SENT to LOGGED for it to be retried. 
   */
 
  public void retry(String tag) throws IOException; 
 
  /**
   * Returns true if there dfo has no logged entries. This is useful for 
   * completeness checking. (wait for after this is true before closing). 
   */
 
  boolean isEmpty(); 
 
}