summaryrefslogtreecommitdiffstats
path: root/src/os/bluestore/zoned_types.h
blob: 6ff5d5f313e4361139b63fde52560b1acc7bd155 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
#ifndef CEPH_OS_BLUESTORE_ZONED_TYPES_H
#define CEPH_OS_BLUESTORE_ZONED_TYPES_H

#include "include/types.h"
#include "kv/KeyValueDB.h"
#include "os/kv.h"

// Tracks two bits of information about the state of a zone: (1) number of dead
// bytes in a zone and (2) the write pointer.  We assume that for now 32 bits is
// enough for the zone capacity and represent these as uint32_t, and we store
// them as a single 64-bit value in RocksDB so that we can use the existing
// Int64ArrayMergeOperator for merge and avoid the cost of point queries.
//
// We use the same struct for an on-disk and in-memory representation of the
// state.
struct zone_state_t {
  uint32_t num_dead_bytes = 0;
  uint32_t write_pointer = 0;

  void encode(ceph::buffer::list &bl) const;
  void decode(ceph::buffer::list::const_iterator &p);

  uint64_t get_num_dead_bytes() const {
    return num_dead_bytes;
  }

  uint64_t get_write_pointer() const {
    return write_pointer;
  }

  void increment_num_dead_bytes(uint64_t num_bytes) {
    num_dead_bytes += num_bytes;
  }

  void increment_write_pointer(uint64_t num_bytes) {
    write_pointer += num_bytes;
  }
};

std::ostream& operator<<(std::ostream& out, const zone_state_t& zone_state);

#endif