aboutsummaryrefslogtreecommitdiff
path: root/pw_blob_store/docs.rst
blob: a418f58af475f5ad741ceda5ae3504263fb95a9f (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
.. _module-pw_blob_store:

=============
pw_blob_store
=============
``pw_blob_store`` is a storage container library for storing a single blob of
data. ``BlobStore`` is a flash-backed persistent storage system with integrated
data integrity checking that serves as a lightweight alternative to a file
system.

-----
Usage
-----
Most operations on a ``BlobStore`` are done using ``BlobReader`` and
``BlobWriter`` objects that have been constructed using a ``BlobStore``. Though
a ``BlobStore`` may have multiple open ``BlobReader`` objects, no other
readers/writers may be active if a ``BlobWriter`` is opened on a blob store.

The data state of a blob can be checked using the ``HasData()`` method.
The method returns true if the blob is currenty valid and has at least one data
byte. This allows checking if a blob has stored data without needing to
instantiate and open a reader or writer.

Write buffer
============

BlobStore uses a write buffer to allow writes smaller than and/or unaligned to
the flash write aligment. BlobStore also supports using the write buffer for
deferred writes that can be enqueued and written to flash at a later time or by
a different thread/context.

BlobStore can be used with a zero-size write buffer to reduce memory
requirements. When using zero-size write buffer, the user is required to write
maintain write sizes that are a multiple of the flash write size the blob is
configured for.

If a non-zero sized write buffer is used, the write buffer size must be a
multiple of the flash write size.

Writing to a BlobStore
----------------------
``BlobWriter`` objects are ``pw::stream::Writer`` compatible, but do not support
reading any of the blob's contents. Opening a ``BlobWriter`` on a ``BlobStore``
that contains data will discard any existing data if ``Discard()``, ``Write
()``, or ``Erase()`` are called. There is currently no mechanism to allow
appending to existing data.

.. code-block:: cpp

  BlobStore::BlobWriterWithBuffer writer(my_blob_store);
  writer.Open();
  writer.Write(my_data);

  // ...

  // A close is implied when a BlobWriter is destroyed. Manually closing a
  // BlobWriter enables error handling on Close() failure.
  writer.Close();

Erasing a BlobStore
===================
There are two distinctly different mechanisms to "erase" the contents of a BlobStore:

#. ``Discard()``: Discards any ongoing writes and ensures ``BlobReader`` objects
   see the ``BlobStore`` as empty. This is the fastest way to logically erase a
   ``BlobStore``.
#. ``Erase()``: Performs an explicit flash erase of the ``BlobStore``'s
   underlying partition. This is useful for manually controlling when a flash
   erase is performed before a ``BlobWriter`` starts to write data (as flash
   erase operations may be time-consuming).

Naming a BlobStore's contents
=============================
Data in a ``BlobStore`` May be named similarly to a file. This enables
identification of a BlobStore's contents in cases where different data may be
stored to a shared blob store. This requires an additional RAM buffer that can
be used to encode the BlobStore's KVS metadata entry. Calling
``MaxFileNameLength()`` on a ``BlobWriter`` will provide the max file name
length based on the ``BlobWriter``'s metadata encode buffer size.

``SetFileName()`` performs a copy of the provided file name, meaning it's safe
for the ``std::string_view`` to be invalidated after the function returns.

.. code-block:: cpp

  constexpr size_t kMaxFileNameLength = 48;
  BlobStore::BlobWriterWithBuffer<kMaxFileNameLength> writer(my_blob_store);
  writer.Open();
  writer.SetFileName("stonks.jpg");
  writer.Write(my_data);
  // ...
  writer.Close();

Reading from a BlobStore
------------------------
A ``BlobStore`` may have multiple open ``BlobReader`` objects. No other
readers/writers may be open/active if a ``BlobWriter`` is opened on a blob
store.

  0) Create BlobReader instance
  1) BlobReader::Open().
  2) Read data using BlobReader::Read() or
     BlobReader::GetMemoryMappedBlob(). BlobReader is seekable. Use
     BlobReader::Seek() to read from a desired offset.
  3) BlobReader::Close().

--------------------------
FileSystem RPC integration
--------------------------
``pw_blob_store`` provides an optional ``FileSystemEntry`` implementation for
use with ``pw_file``'s ``FlatFileSystemService``. This simplifies the process of
enumerating ``BlobStore`` objects as files via ``pw_file``'s ``FileSystem`` RPC
service.

-----------
Size report
-----------
The following size report showcases the memory usage of the blob store.

.. include:: blob_size


.. note::
  The documentation for this module is currently incomplete.