Blame vdo/base/slabScrubber.h

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