Blame source/vdo/base/packer.h

Packit Service 75d76b
/*
Packit Service 75d76b
 * Copyright (c) 2020 Red Hat, Inc.
Packit Service 75d76b
 *
Packit Service 75d76b
 * This program is free software; you can redistribute it and/or
Packit Service 75d76b
 * modify it under the terms of the GNU General Public License
Packit Service 75d76b
 * as published by the Free Software Foundation; either version 2
Packit Service 75d76b
 * of the License, or (at your option) any later version.
Packit Service 75d76b
 * 
Packit Service 75d76b
 * This program is distributed in the hope that it will be useful,
Packit Service 75d76b
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 75d76b
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 75d76b
 * GNU General Public License for more details.
Packit Service 75d76b
 * 
Packit Service 75d76b
 * You should have received a copy of the GNU General Public License
Packit Service 75d76b
 * along with this program; if not, write to the Free Software
Packit Service 75d76b
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service 75d76b
 * 02110-1301, USA. 
Packit Service 75d76b
 *
Packit Service 75d76b
 * $Id: //eng/vdo-releases/aluminum/src/c++/vdo/base/packer.h#3 $
Packit Service 75d76b
 */
Packit Service 75d76b
Packit Service 75d76b
#ifndef PACKER_H
Packit Service 75d76b
#define PACKER_H
Packit Service 75d76b
Packit Service 75d76b
#include "completion.h"
Packit Service 75d76b
#include "physicalLayer.h"
Packit Service 75d76b
#include "statistics.h"
Packit Service 75d76b
#include "threadConfig.h"
Packit Service 75d76b
#include "types.h"
Packit Service 75d76b
Packit Service 75d76b
enum {
Packit Service 75d76b
  DEFAULT_PACKER_INPUT_BINS  = 16,
Packit Service 75d76b
  DEFAULT_PACKER_OUTPUT_BINS = 256,
Packit Service 75d76b
};
Packit Service 75d76b
Packit Service 75d76b
typedef struct packer Packer;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Make a new block packer.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param [in]  layer           The physical layer to which compressed blocks
Packit Service 75d76b
 *                              will be written
Packit Service 75d76b
 * @param [in]  inputBinCount   The number of partial bins to keep in memory
Packit Service 75d76b
 * @param [in]  outputBinCount  The number of compressed blocks that can be
Packit Service 75d76b
 *                              written concurrently
Packit Service 75d76b
 * @param [in]  threadConfig    The thread configuration of the VDO
Packit Service 75d76b
 * @param [out] packerPtr       A pointer to hold the new packer
Packit Service 75d76b
 *
Packit Service 75d76b
 * @return VDO_SUCCESS or an error
Packit Service 75d76b
 **/
Packit Service 75d76b
int makePacker(PhysicalLayer       *layer,
Packit Service 75d76b
               BlockCount           inputBinCount,
Packit Service 75d76b
               BlockCount           outputBinCount,
Packit Service 75d76b
               const ThreadConfig  *threadConfig,
Packit Service 75d76b
               Packer             **packerPtr)
Packit Service 75d76b
  __attribute__((warn_unused_result));
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Free a block packer and null out the reference to it.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param packerPtr  A pointer to the packer to free
Packit Service 75d76b
 **/
Packit Service 75d76b
void freePacker(Packer **packerPtr);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Check whether the compressed data in a DataVIO will fit in a packer bin.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param dataVIO  The DataVIO
Packit Service 75d76b
 *
Packit Service 75d76b
 * @return true if the DataVIO will fit in a bin
Packit Service 75d76b
 **/
Packit Service 75d76b
bool isSufficientlyCompressible(DataVIO *dataVIO)
Packit Service 75d76b
  __attribute__((warn_unused_result));
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Get the thread ID of the packer's zone.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param packer  The packer
Packit Service 75d76b
 *
Packit Service 75d76b
 * @return The packer's thread ID
Packit Service 75d76b
 **/
Packit Service 75d76b
ThreadID getPackerThreadID(Packer *packer);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Get the current statistics from the packer.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param packer  The packer to query
Packit Service 75d76b
 *
Packit Service 75d76b
 * @return a copy of the current statistics for the packer
Packit Service 75d76b
 **/
Packit Service 75d76b
PackerStatistics getPackerStatistics(const Packer *packer)
Packit Service 75d76b
  __attribute__((warn_unused_result));
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Attempt to rewrite the data in this DataVIO as part of a compressed block.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param dataVIO  The DataVIO to pack
Packit Service 75d76b
 **/
Packit Service 75d76b
void attemptPacking(DataVIO *dataVIO);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Request that the packer flush asynchronously. All bins with at least two
Packit Service 75d76b
 * compressed data blocks will be written out, and any solitary pending VIOs
Packit Service 75d76b
 * will be released from the packer. While flushing is in progress, any VIOs
Packit Service 75d76b
 * submitted to attemptPacking() will be continued immediately without
Packit Service 75d76b
 * attempting to pack them.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param packer  The packer to flush
Packit Service 75d76b
 **/
Packit Service 75d76b
void flushPacker(Packer *packer);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Remove a lock holder from the packer.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param completion  The DataVIO which needs a lock held by a DataVIO in the
Packit Service 75d76b
 *                    packer. The dataVIO's compressedVIO.lockHolder field will
Packit Service 75d76b
 *                    point to the DataVIO to remove.
Packit Service 75d76b
 **/
Packit Service 75d76b
void removeLockHolderFromPacker(VDOCompletion *completion);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Increment the flush generation in the packer. This will also cause the
Packit Service 75d76b
 * packer to flush so that any VIOs from previous generations will exit the
Packit Service 75d76b
 * packer.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param packer  The packer
Packit Service 75d76b
 **/
Packit Service 75d76b
void incrementPackerFlushGeneration(Packer *packer);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Drain the packer by preventing any more VIOs from entering the packer and
Packit Service 75d76b
 * then flushing.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param packer      The packer to drain
Packit Service 75d76b
 * @param completion  The completion to finish when the packer has drained
Packit Service 75d76b
 **/
Packit Service 75d76b
void drainPacker(Packer *packer, VDOCompletion *completion);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Resume a packer which has been suspended.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param packer  The packer to resume
Packit Service 75d76b
 * @param parent  The completion to finish when the packer has resumed
Packit Service 75d76b
 *
Packit Service 75d76b
 * @return VDO_SUCCESS or an error
Packit Service 75d76b
 **/
Packit Service 75d76b
void resumePacker(Packer *packer, VDOCompletion *parent);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Dump the packer, in a thread-unsafe fashion.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param packer  The packer
Packit Service 75d76b
 **/
Packit Service 75d76b
void dumpPacker(const Packer *packer);
Packit Service 75d76b
Packit Service 75d76b
#endif /* PACKER_H */