X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Fos%2Fbluestore%2FBlueStore.h;h=387c22373243ba6c038d45dfb59d12081ec29f1c;hb=28e407b858acd3bddc89f68583571f771bb42e46;hp=f437d5d68470f0cee1922802fc3b810835a27965;hpb=224ce89bce8186937e77bdbda572a650953f8c23;p=ceph.git diff --git a/ceph/src/os/bluestore/BlueStore.h b/ceph/src/os/bluestore/BlueStore.h index f437d5d68..387c22373 100644 --- a/ceph/src/os/bluestore/BlueStore.h +++ b/ceph/src/os/bluestore/BlueStore.h @@ -116,6 +116,7 @@ enum { l_bluestore_blob_split, l_bluestore_extent_compress, l_bluestore_gc_merged, + l_bluestore_read_eio, l_bluestore_last }; @@ -430,7 +431,8 @@ public: SharedBlobRef lookup(uint64_t sbid) { std::lock_guard l(lock); auto p = sb_map.find(sbid); - if (p == sb_map.end()) { + if (p == sb_map.end() || + p->second->nref == 0) { return nullptr; } return p->second; @@ -442,20 +444,23 @@ public: sb->coll = coll; } - bool remove(SharedBlob *sb) { + void remove(SharedBlob *sb) { std::lock_guard l(lock); - if (sb->nref == 0) { - assert(sb->get_parent() == this); - sb_map.erase(sb->get_sbid()); - return true; + assert(sb->get_parent() == this); + // only remove if it still points to us + auto p = sb_map.find(sb->get_sbid()); + if (p != sb_map.end() && + p->second == sb) { + sb_map.erase(p); } - return false; } bool empty() { std::lock_guard l(lock); return sb_map.empty(); } + + void dump(CephContext *cct, int lvl); }; //#define CACHE_BLOB_BL // not sure if this is a win yet or not... :/ @@ -1318,6 +1323,8 @@ public: void clear(); bool empty(); + void dump(CephContext *cct, int lvl); + /// return true if f true for any item bool map_any(std::function f); }; @@ -1556,8 +1563,6 @@ public: IOContext ioc; bool had_ios = false; ///< true if we submitted IOs before our kv txn - CollectionRef first_collection; ///< first referenced collection - uint64_t seq = 0; utime_t start; utime_t last_stamp; @@ -1843,11 +1848,12 @@ private: interval_set bluefs_extents; ///< block extents owned by bluefs interval_set bluefs_extents_reclaiming; ///< currently reclaiming - std::mutex deferred_lock, deferred_submit_lock; + std::mutex deferred_lock; std::atomic deferred_seq = {0}; deferred_osr_queue_t deferred_queue; ///< osr's with deferred io pending int deferred_queue_size = 0; ///< num txc's queued across all osrs atomic_int deferred_aggressive = {0}; ///< aggressive wakeup of kv thread + Finisher deferred_finisher; int m_finisher_num = 1; vector finishers; @@ -1855,6 +1861,7 @@ private: KVSyncThread kv_sync_thread; std::mutex kv_lock; std::condition_variable kv_cond; + bool _kv_only = false; bool kv_sync_started = false; bool kv_stop = false; bool kv_finalize_started = false; @@ -1873,7 +1880,6 @@ private: PerfCounters *logger = nullptr; - std::mutex reap_lock; list removed_collections; RWLock debug_read_error_lock = {"BlueStore::debug_read_error_lock"}; @@ -1979,8 +1985,9 @@ private: int _setup_block_symlink_or_file(string name, string path, uint64_t size, bool create); - int _write_bdev_label(string path, bluestore_bdev_label_t label); public: + static int _write_bdev_label(CephContext* cct, + string path, bluestore_bdev_label_t label); static int _read_bdev_label(CephContext* cct, string path, bluestore_bdev_label_t *label); private: @@ -2003,7 +2010,7 @@ private: void _assign_nid(TransContext *txc, OnodeRef o); uint64_t _assign_blobid(TransContext *txc); - void _dump_onode(OnodeRef o, int log_level=30); + void _dump_onode(const OnodeRef& o, int log_level=30); void _dump_extent_map(ExtentMap& em, int log_level=30); void _dump_transaction(Transaction *t, int log_level = 30); @@ -2037,7 +2044,9 @@ private: bluestore_deferred_op_t *_get_deferred_op(TransContext *txc, OnodeRef o); void _deferred_queue(TransContext *txc); +public: void deferred_try_submit(); +private: void _deferred_submit_unlock(OpSequencer *osr); void _deferred_aio_finish(OpSequencer *osr); int _deferred_replay(); @@ -2053,6 +2062,7 @@ private: const PExtentVector& extents, bool compressed, mempool_dynamic_bitset &used_blocks, + uint64_t granularity, store_statfs_t& expected_statfs); void _buffer_cache_write( @@ -2111,6 +2121,7 @@ public: bool allows_journal() override { return false; }; bool is_rotational() override; + bool is_journal_rotational() override; string get_default_device_class() override { string device_class; @@ -2144,7 +2155,17 @@ public: return 0; } - int fsck(bool deep) override; + int write_meta(const std::string& key, const std::string& value) override; + int read_meta(const std::string& key, std::string *value) override; + + + int fsck(bool deep) override { + return _fsck(deep, false); + } + int repair(bool deep) override { + return _fsck(deep, true); + } + int _fsck(bool deep, bool repair); void set_cache_shards(unsigned num) override; @@ -2357,8 +2378,8 @@ public: objectstore_perf_stat_t get_cur_stats() const { objectstore_perf_stat_t ret; - ret.os_commit_latency = os_commit_latency.avg(); - ret.os_apply_latency = os_apply_latency.avg(); + ret.os_commit_latency = os_commit_latency.current_avg(); + ret.os_apply_latency = os_apply_latency.current_avg(); return ret; } @@ -2392,7 +2413,10 @@ public: assert(db); db->compact(); } - + bool has_builtin_csum() const override { + return true; + } + private: bool _debug_data_eio(const ghobject_t& o) { if (!cct->_conf->bluestore_debug_inject_read_err) { @@ -2452,6 +2476,10 @@ private: bool mark_unused; bool new_blob; ///< whether new blob was created + bool compressed = false; + bufferlist compressed_bl; + size_t compressed_len = 0; + write_item( uint64_t logical_offs, BlobRef b, @@ -2592,7 +2620,7 @@ private: OnodeRef o, uint64_t offset, set *maybe_unshared_blobs=0); - void _truncate(TransContext *txc, + int _truncate(TransContext *txc, CollectionRef& c, OnodeRef& o, uint64_t offset);