// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab /* * Ceph - scalable distributed file system * * Copyright (C) 2004-2006 Sage Weil * * This is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software * Foundation. See file COPYING. * */ #ifndef OS_COLLECTIONINDEX_H #define OS_COLLECTIONINDEX_H #include #include #include "include/memory.h" #include "osd/osd_types.h" #include "include/object.h" #include "common/RWLock.h" /** CollectionIndex provides an interface for manipulating indexed collections */ class CollectionIndex { public: CephContext* cct; protected: /** * Object encapsulating a returned path. * * A path to an object (existent or non-existent) becomes invalid * when a different object is created in the index. Path stores * a shared_ptr to the CollectionIndex to keep the index alive * during its lifetime. * @see IndexManager * @see self_ref * @see set_ref */ class Path { public: /// Returned path string full_path; /// Ref to parent Index CollectionIndex* parent_ref; /// coll_t for parent Index coll_t parent_coll; /// Normal Constructor Path( string path, ///< [in] Path to return. CollectionIndex* ref) : full_path(path), parent_ref(ref), parent_coll(parent_ref->coll()) {} /// Debugging Constructor Path( string path, ///< [in] Path to return. const coll_t& coll) ///< [in] collection : full_path(path), parent_coll(coll) {} /// Getter for the stored path. const char *path() const { return full_path.c_str(); } /// Getter for collection const coll_t& coll() const { return parent_coll; } /// Getter for parent CollectionIndex* get_index() const { return parent_ref; } }; public: RWLock access_lock; /// Type of returned paths typedef ceph::shared_ptr IndexedPath; static IndexedPath get_testing_path(string path, coll_t collection) { return std::make_shared(path, collection); } static const uint32_t FLAT_INDEX_TAG = 0; static const uint32_t HASH_INDEX_TAG = 1; static const uint32_t HASH_INDEX_TAG_2 = 2; static const uint32_t HOBJECT_WITH_POOL = 3; /** * For tracking Filestore collection versions. * * @return Collection version represented by the Index implementation */ virtual uint32_t collection_version() = 0; /** * Returns the collection managed by this CollectionIndex */ virtual coll_t coll() const = 0; /** * Initializes the index. * * @return Error Code, 0 for success */ virtual int init() = 0; /** * Cleanup before replaying journal * * Index implemenations may need to perform compound operations * which may leave the collection unstable if interupted. cleanup * is called on mount to allow the CollectionIndex implementation * to stabilize. * * @see HashIndex * @return Error Code, 0 for success */ virtual int cleanup() = 0; /** * Call when a file is created using a path returned from lookup. * * @return Error Code, 0 for success */ virtual int created( const ghobject_t &oid, ///< [in] Created object. const char *path ///< [in] Path to created object. ) = 0; /** * Removes oid from the collection * * @return Error Code, 0 for success */ virtual int unlink( const ghobject_t &oid ///< [in] Object to remove ) = 0; /** * Gets the IndexedPath for oid. * * @return Error Code, 0 for success */ virtual int lookup( const ghobject_t &oid, ///< [in] Object to lookup IndexedPath *path, ///< [out] Path to object int *hardlink ///< [out] number of hard links of this object. *hardlink=0 mean object no-exist. ) = 0; /** * Moves objects matching @e match in the lsb @e bits * * dest and this must be the same subclass * * @return Error Code, 0 for success */ virtual int split( uint32_t match, //< [in] value to match uint32_t bits, //< [in] bits to check CollectionIndex* dest //< [in] destination index ) { ceph_abort(); return 0; } /// List contents of collection by hash virtual int collection_list_partial( const ghobject_t &start, ///< [in] object at which to start const ghobject_t &end, ///< [in] list only objects < end int max_count, ///< [in] return at most max_count objects vector *ls, ///< [out] Listed objects ghobject_t *next ///< [out] Next object to list ) = 0; /// Call prior to removing directory virtual int prep_delete() { return 0; } CollectionIndex(CephContext* cct, const coll_t& collection) : cct(cct), access_lock("CollectionIndex::access_lock", true, false) {} /* * Pre-hash the collection, this collection should map to a PG folder. * * @param pg_num - pg number of the pool this collection belongs to. * @param expected_num_objs - expected number of objects in this collection. * @Return 0 on success, an error code otherwise. */ virtual int pre_hash_collection( uint32_t pg_num, ///< [in] pg number of the pool this collection belongs to uint64_t expected_num_objs ///< [in] expected number of objects this collection has ) { ceph_abort(); return 0; } virtual int apply_layout_settings() { ceph_abort(); return 0; } /// Read index-wide settings (should be called after construction) virtual int read_settings() { return 0; } /// Virtual destructor virtual ~CollectionIndex() {} }; #endif