Blame source/vdo/base/slabScrubber.h

Packit Service d40955
/*
Packit Service d40955
 * Copyright (c) 2020 Red Hat, Inc.
Packit Service d40955
 *
Packit Service d40955
 * This program is free software; you can redistribute it and/or
Packit Service d40955
 * modify it under the terms of the GNU General Public License
Packit Service d40955
 * as published by the Free Software Foundation; either version 2
Packit Service d40955
 * of the License, or (at your option) any later version.
Packit Service d40955
 * 
Packit Service d40955
 * This program is distributed in the hope that it will be useful,
Packit Service d40955
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d40955
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d40955
 * GNU General Public License for more details.
Packit Service d40955
 * 
Packit Service d40955
 * You should have received a copy of the GNU General Public License
Packit Service d40955
 * along with this program; if not, write to the Free Software
Packit Service d40955
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service d40955
 * 02110-1301, USA. 
Packit Service d40955
 *
Packit Service d40955
 * $Id: //eng/vdo-releases/aluminum/src/c++/vdo/base/slabScrubber.h#4 $
Packit Service d40955
 */
Packit Service d40955
Packit Service d40955
#ifndef SLAB_SCRUBBER_H
Packit Service d40955
#define SLAB_SCRUBBER_H
Packit Service d40955
Packit Service d40955
#include "completion.h"
Packit Service d40955
#include "types.h"
Packit Service d40955
#include "waitQueue.h"
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Create a slab scrubber
Packit Service d40955
 *
Packit Service d40955
 * @param layer             The physical layer of the VDO
Packit Service d40955
 * @param slabJournalSize   The size of a slab journal in blocks
Packit Service d40955
 * @param readOnlyNotifier  The context for entering read-only mode
Packit Service d40955
 * @param scrubberPtr       A pointer to hold the scrubber
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS or an error
Packit Service d40955
 **/
Packit Service d40955
int makeSlabScrubber(PhysicalLayer     *layer,
Packit Service d40955
                     BlockCount         slabJournalSize,
Packit Service d40955
                     ReadOnlyNotifier  *readOnlyNotifier,
Packit Service d40955
                     SlabScrubber     **scrubberPtr)
Packit Service d40955
  __attribute__((warn_unused_result));
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Free a slab scrubber and null out the reference to it.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubberPtr  A pointer to the scrubber to destroy
Packit Service d40955
 **/
Packit Service d40955
void freeSlabScrubber(SlabScrubber **scrubberPtr);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Check whether a scrubber has slabs to scrub.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubber  The scrubber to check
Packit Service d40955
 *
Packit Service d40955
 * @return true if the scrubber has slabs to scrub
Packit Service d40955
 **/
Packit Service d40955
bool hasSlabsToScrub(SlabScrubber *scrubber)
Packit Service d40955
  __attribute__((warn_unused_result));
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Register a slab with a scrubber.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubber      The scrubber
Packit Service d40955
 * @param slab          The slab to scrub
Packit Service d40955
 * @param highPriority  true if the slab should be put on the
Packit Service d40955
 *                      high-priority queue
Packit Service d40955
 **/
Packit Service d40955
void registerSlabForScrubbing(SlabScrubber *scrubber,
Packit Service d40955
                              Slab         *slab,
Packit Service d40955
                              bool          highPriority);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Scrub all the slabs which have been registered with a slab scrubber.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubber      The scrubber
Packit Service d40955
 * @param parent        The object to notify when scrubbing is complete
Packit Service d40955
 * @param callback      The function to run when scrubbing is complete
Packit Service d40955
 * @param errorHandler  The handler for scrubbing errors
Packit Service d40955
 **/
Packit Service d40955
void scrubSlabs(SlabScrubber *scrubber,
Packit Service d40955
                void         *parent,
Packit Service d40955
                VDOAction    *callback,
Packit Service d40955
                VDOAction    *errorHandler);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Scrub any slabs which have been registered at high priority with a slab
Packit Service d40955
 * scrubber.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubber         The scrubber
Packit Service d40955
 * @param scrubAtLeastOne  true if one slab should always be
Packit Service d40955
 *                         scrubbed, even if there are no high-priority slabs
Packit Service d40955
 *                         (and there is at least one low priority slab)
Packit Service d40955
 * @param parent           The completion to notify when scrubbing is complete
Packit Service d40955
 * @param callback         The function to run when scrubbing is complete
Packit Service d40955
 * @param errorHandler     The handler for scrubbing errors
Packit Service d40955
 **/
Packit Service d40955
void scrubHighPrioritySlabs(SlabScrubber  *scrubber,
Packit Service d40955
                            bool           scrubAtLeastOne,
Packit Service d40955
                            VDOCompletion *parent,
Packit Service d40955
                            VDOAction     *callback,
Packit Service d40955
                            VDOAction     *errorHandler);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Tell the scrubber to stop scrubbing after it finishes the slab it is
Packit Service d40955
 * currently working on.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubber  The scrubber to stop
Packit Service d40955
 * @param parent    The completion to notify when scrubbing has stopped
Packit Service d40955
 **/
Packit Service d40955
void stopScrubbing(SlabScrubber *scrubber, VDOCompletion *parent);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Tell the scrubber to resume scrubbing if it has been stopped.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubber  The scrubber to resume
Packit Service d40955
 * @param parent    The object to notify once scrubbing has resumed
Packit Service d40955
 **/
Packit Service d40955
void resumeScrubbing(SlabScrubber *scrubber, VDOCompletion *parent);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Wait for a clean slab.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubber  The scrubber on which to wait
Packit Service d40955
 * @param waiter    The waiter
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS if the waiter was queued, VDO_NO_SPACE if there are no
Packit Service d40955
 *         slabs to scrub, and some other error otherwise
Packit Service d40955
 **/
Packit Service d40955
int enqueueCleanSlabWaiter(SlabScrubber *scrubber, Waiter *waiter);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Get the number of slabs that are unrecovered or being scrubbed.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubber  The scrubber to query
Packit Service d40955
 *
Packit Service d40955
 * @return the number of slabs that are unrecovered or being scrubbed
Packit Service d40955
 **/
Packit Service d40955
SlabCount getScrubberSlabCount(const SlabScrubber *scrubber)
Packit Service d40955
  __attribute__((warn_unused_result));
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Dump information about a slab scrubber to the log for debugging.
Packit Service d40955
 *
Packit Service d40955
 * @param scrubber   The scrubber to dump
Packit Service d40955
 **/
Packit Service d40955
void dumpSlabScrubber(const SlabScrubber *scrubber);
Packit Service d40955
Packit Service d40955
#endif /* SLAB_SCRUBBER_H */