From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sage Weil Subject: Re: Adding compression support for bluestore. Date: Thu, 31 Mar 2016 17:56:18 -0400 (EDT) Message-ID: References: <56C1FCF3.4030505@mirantis.com> <56C3BAA3.3070804@mirantis.com> <56CDF40C.9060405@mirantis.com> <56D08E30.20308@mirantis.com> <56E9A727.1030400@mirantis.com> <56EACAAD.90002@mirantis.com> <56EC248E.3060502@mirantis.com> <56F013FB.4040002@mirantis.com> <56F3E157.2090004@mirantis.com> Mime-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Return-path: Received: from cobra.newdream.net ([66.33.216.30]:57914 "EHLO cobra.newdream.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752003AbcCaV42 (ORCPT ); Thu, 31 Mar 2016 17:56:28 -0400 In-Reply-To: <56F3E157.2090004@mirantis.com> Sender: ceph-devel-owner@vger.kernel.org List-ID: To: Igor Fedotov Cc: Allen Samuels , ceph-devel How about this: // in the onode: map data_map; map blob_map; // in the enode map blob_map; struct bluestore_lextent_t { enum { FLAG_SHARED = 1, ///< pextent lives in enode }; uint64_t logical_length; ///< length of logical bytes we represent uint32_t pextent_id; ///< id of pextent in onode or enode uint32_t x_off, x_len; ///< relative portion of pextent with our data uint32_t flags; ///< FLAG_* }; struct bluestore_pextent_t { uint64_t offset; ///< offset on disk uint64_t length; ///< length on disk }; struct bluestore_blob_t { enum { CSUM_XXHASH32 = 1, CSUM_XXHASH64 = 2, CSUM_CRC32C = 3, CSUM_CRC16 = 4, }; enum { FLAG_IMMUTABLE = 1, ///< no overwrites allowed FLAG_COMPRESSED = 2, ///< extent is compressed; alg is in first byte of data }; enum { COMP_ZLIB = 1, COMP_SNAPPY = 2, COMP_LZO = 3, }; vector extents; ///< extents on disk uint32_t logical_length; ///< uncompressed length uint32_t flags; ///< FLAG_* uint8_t csum_type; ///< CSUM_* uint8_t csum_block_order; uint16_t num_refs; ///< reference count (always 1 when in onode) vector csum_data; ///< opaque vector of csum data uint32_t get_ondisk_length() const { uint32_t len = 0; for (auto &p : extentes) { len += p.length; } return len; } uint32_t get_csum_block_size() const { return 1 << csum_block_order; } size_t get_csum_value_size() const { switch (csum_type) { case CSUM_XXHASH32: return 4; case CSUM_XXHASH64: return 8; case CSUM_CRC32C: return 4; case CSUM_CRC16: return 2; default: return 0; } } // assert (ondisk_length / csum_block_size) * csum_value_size == // csum_data.length() };