/*
 * 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.geode.internal.cache;

import java.nio.ByteBuffer;

import org.apache.geode.cache.RegionEvent;

/**
 * This interface is used by testing/debugging code to be notified of query events. See the
 * documentation for class CacheObserverHolder for details. Also the callback is issed only if the
 * boolean ISSUE_CALLBACKS_TO_CACHE_OBSERVER present in org.apache.geode.internal.cache.LocalRegion
 * is made true
 * 
 */
public interface CacheObserver {

  /**
   * Called just after the region's Map is cleared & before Listener callback is issued. The call to
   * this method is synchronous
   */
  void afterRegionClear(RegionEvent event);

  /**
   * Called just beforeclearing the DiskRegion.
   *
   */
  void beforeDiskClear();

  /**
   * callback to test flushing efficieny. This callback is issued just before the flushing of the
   * buffer that is before writing data to the Oplog, but after setting the logical offsets in the
   * DiskIds contained in the PendingWrite Buffer
   * 
   */
  void goingToFlush();

  /**
   * called immediately after bytes are written to the disk Region. In case of asynch mode, it gets
   * called immedaitely after the asynch writer has written it to disk & just before releasing the
   * ByteBuffer to the pool.
   * 
   */
  public void afterWritingBytes();

  /**
   * 
   * Compacting is about to compact
   */
  public void beforeGoingToCompact();

  /**
   * Just finished Compacting
   * 
   */
  public void afterHavingCompacted();

  /**
   * Callback just after calculating the conflated byte buffer. This function can get called only in
   * the asynch mode where conflation can happen
   * 
   * @param origBB Original ByteBuffer object for the operation without considering conflation
   * @param conflatedBB Resultant ByteBuffer object after conflation
   */
  public void afterConflation(ByteBuffer origBB, ByteBuffer conflatedBB);

  /**
   * Callback just after setting oplog offset . The Oplog Offset will be set to non negative number
   * in case it is a synch mode operation as the offset for synch mode is available in the context
   * of thread performing the operation & to -1 for an asynch mode of operation as in case of asynch
   * mode of operation the actual offset is determined only when asynch writer performs the write
   * operation.
   * 
   * @param offset A non negative number for synch mode of operation indicating the start position
   *        in the Oplog for the operation & -1 for asynch mode of operation
   * 
   */
  public void afterSettingOplogOffSet(long offset);

  /**
   * Callback given by the thread performing the operation which causes the switching of the Oplog.
   * This function gets invoked before a new Oplog gets created. Thus if the compacting is on , this
   * function will get called before the compacter thread gets notified
   * 
   */
  public void beforeSwitchingOplog();

  /**
   * Callback given by the thread performing the operation which causes the switching of the Oplog.
   * This function gets invoked after a new Oplog gets created. Thus if the compacting is on , this
   * function will get called after the compacter thread has been notified & the switching thread
   * has been able to create a new Oplog
   * 
   * 
   */
  public void afterSwitchingOplog();

  /**
   * Callback given by the thread which creates krfs.
   */
  public void afterKrfCreated();

  /**
   * Callback given immediately before any thread invokes ComplexDiskRegion.OplogCompactor's
   * stopCompactor method. This method normally gets invoked by clear/destory/close methods of the
   * region.
   * 
   */
  public void beforeStoppingCompactor();

  /**
   * Callback given immediately after any thread invokes ComplexDiskRegion.OplogCompactor's
   * stopCompactor method. This method normally gets invoked by clear/destory/close methods of the
   * region.
   * 
   */
  public void afterStoppingCompactor();

  /**
   * Callback given immediately after the ComplexDiskRegion.OplogCompactor's stopCompactor method
   * signals the compactor to stop.
   * 
   */
  public void afterSignallingCompactor();

  /**
   * Called when GII begins
   */
  public void afterMarkingGIIStarted();

  /**
   * Called when GII ends
   */
  public void afterMarkingGIICompleted();

  /**
   * Called after the Oplog.WriterThread (asynch writer thread) swaps the pendingFlushMap and
   * pendingWriteMap for flushing.
   */
  public void afterSwitchingWriteAndFlushMaps();

  /**
   * Invoked just before setting the LBHTree reference in the thread local.
   */
  public void beforeSettingDiskRef();

  /**
   * Invoked just after setting the LBHTree reference in the thread local.
   */
  public void afterSettingDiskRef();

  /**
   * Invoked by the compactor thread just before deleting a compacted oplog
   * 
   * @param compactedOplog
   */
  public void beforeDeletingCompactedOplog(Oplog compactedOplog);

  /**
   * Invoked just before deleting an empty oplog
   * 
   * @param emptyOplog
   */
  public void beforeDeletingEmptyOplog(Oplog emptyOplog);

  /**
   * Invoked just before ShutdownAll operation
   */
  void beforeShutdownAll();
}
