Samarah [Mon, 24 Mar 2025 15:20:54 +0000 (15:20 +0000)]
rgw/d4n: squashing commits related to changing
creationTime type from time_t to double.
1. rgw/d4n: Change score calculation
2. rgw/d4n: Update creationTime calculation to include decimal value
3. rgw/d4n: changes for converting string value to
time_point, when creationTime type changed to double.
Co-authored-by: Pritha Srivastava <prsrivas@redhat.com>
Updated bucket::list to convert from string to time_point
rgw/d4n: delete older versions of an object
during an overwrite for objects belonging to
an unversioned bucket and version suspended
bucket in Writer::complete() method.
rgw/d4n: implementation of list objects for a bucket
(ordered listing) and list-object-versions.
Changes include the addition of an ordered set for
each bucket that stores the object, addition of etag
and object size to CacheObj structure needed for listing
objects, and addition of a test case to see the usage of
pipelining in Redis. Objects are fetched from the cache
and the backend store and are then merged, before returning
the final list.
Co-authored-by: sinashan <sinatak1373@live.com>
Added code for bucket listing using ObjectDirectory(this
has been removed)
Co-authored-by: Samarah <samarah.uriarte@ibm.com>
Fixed log levels in BucketDirectory and ObjectDirectory
methods. Added enum for field retrieval in Directory get
methods.
rgw/d4n: squashing following commits to address concurrency in
filter driver and ssd backed cache.
1. rgw/d4n: addressing concurrency issues by adding a refcount
to each block.
Blocks with positive refcounts are pinned (similar to dirty blocks)
and not eligible for eviction or deletion. Updating unit tests also.
2. rgw/cache: addressing concurrency issues while directories creation,
deletion, updating xattrs, get_attr and put.
Samarah [Tue, 15 Oct 2024 18:37:39 +0000 (18:37 +0000)]
rgw/d4n: squashing following commits related
to lazy deletion - delete dirty objects data
blocks in cleaning method and non-dirty objects
data blocks in eviction method
1. rgw/d4n: Implement lazy deletion
2. rgw/d4n: cleaning method now supports delete markers
also (both versioned and null). The delete markers
are written correctly to the backend store.
Also modifying the description of rgw_d4n_cache_cleaning_interval
to explicitly state that the duration is in seconds.
3. rgw/d4n: do not call invalidate_dirty_object in case
of a simple delete request for dirty objects belonging
to a versioned bucket.
In this case, a delete marker needs to be created instead of
invalidating/deleting an object.
4. rgw/d4n: Update lazy deletion in policy
Co-authored-by: Pritha Srivastava <prsrivas@redhat.com>
Added code for creation of delete marker for a simple
delete request.
rgw/d4n: support for dirty objects in delete object method.
1. ordered set to maintain versions of a dirty object
2. creation of delete marker in case of a simple delete request
3. deletion of a specific version from the ordered set
4. cleaning method deletes from ordered set for dirty objects
5. use of redis atomicity constructs wherever needed
rgw/d4n: squashing following commits that add support for
WATCH, EXEC, INCR, MULTI and DISCARD redis commands.
1. d4n/directory: support for watch, exec and incr methods in Block
and Object Directory.
2. d4n/directory: support for redis MULTI and DISCARD command,
adding a test case to exercise usage of MULTI.
Co-authored-by: Samarah <samarah.uriarte@ibm.com>
Adjusted log levels for directory methods added in this commit.
rgw/directory: support for ordered set in both ObjectDirectory
and BlockDirectory.
Adds methods to add, list a range and remove members from a
redis ordered set ordered by score passed in. Also adds unit
test cases to test the methods.
Samarah has fixed the arguments passed in to zrevrange in
ZAddZRemYield and ZAddZRevRangeYield tests.
rgw/d4n: squashing commits related to handling of
clean (non-dirty) objects for delete_obj method.
1. rgw/d4n: miscellaneous fixes that include modifying
set_head_obj_dir_entry() and delete_obj method to handle
clean objects only.
2. rgw/d4n: changes to design when write cache is turned off:
a. do not store a hash entry for latest version for versioned
buckets, the latest version will always be fetched from backend store,
to maintain correct order of versions during a delete object request.
rgw/d4n: squashing commits for supporting delete object
for unversioned buckets.
1. d4n/directory: Update logging
2. d4n/filter: Update `set_head_obj_dir_entry` to handle null versioning and update `prevVersion` for versioned head objects
3. rgw/d4n: Simplify code to only support unversioned bucket deletes
rgw/cache: implementation for organizing data in ssd cache
into bucket directory, object directory and then versions
representing file names.
This commit for extracts bucket id, object name, version,
offset, and length from input key and organizes data into
directories - with bucket id, object name being used to
create directories and filenames within them using version
and offset and length.
Data can be restored back to in memory LFUDA and dirty object
data structure once rgw is restarted.
Updating unit tests.
test/rgw: Correct RedisDriver keys and add checks for cache blocks after
write
rgw/d4n: handling special characters in object names such that
parsing file names while restoring data from cache does not result
in errors.
1. Introduce a new delimiter # instead of _ for concatening bucket_id,
objectname etc to create a key, because "_" is a valid char in object names
and is not encoded and results in incorrect values while parsing filenames
for restorin data.
2. url encode the bucket id, version and object name before all are concatenated
to form a key
3. url_decode the bucket id, version and object name after parsing the filename
from cache while restoring data back.
rgw/d4n: squashing the following commits for restoring
in-memory data for LFUDA policy and dirty objects from
cache on disk
1. rgw/d4n: restore in memory data structure for dirty
objects using the xattrs in the head block of an object
in the cache.
2. rgw/d4n: replacing string cache attr names with constexpr char.
3. rgw/d4n: restore LFUDA policy data from cache on disk.
4. rgw/d4n: correcting the key used while updating the LFUDA data structure
for the head object block in the read path.
1. use bucket id instead of name in the cache block key
as this will be helpful to differentiate between objects
belonging to buckets that have been deleted and recreated.
2. add helper methods to derive prefix and key for cache blocks.
3. comments and code cleanup, renaming of policy methods
related to adding and erasing dirty objects to and from
in-memory data structures.
4. rgw/d4n: reading in chunks of rgw_max_chunk_size instead
of rgw_obj_max_req_size since data is being written in rgw_max_chunk_size
chunks in the write back cache.
5. rgw/d4n: correctly set the version for objects
with 'null' versionId in case of a write workflow.
The version stored in the block directory was 'null',
but that does not differentiate two different versions
of objects with versionId set to 'null', hence differentiating
between objects with 'null' versionId by deriving and storing
a non-null version in the block directory, and based on this
version the name of the object in the cache is derived.
rgw/d4n: removing code that writes object entry to the
object directory in redis
Objects were being written to the directory for bucket listing
but another data structure needs to be used that allows for
ordered listing indexed by a bucket name/ id, hence removing
the entries that do not serve this purpose (they also add to the
number of calls to the redis server).
rgw/d4n: squashing the following commits that fix s3 test
failures.
1. rgw/d4n: fixing logical errors for ranged requests in iterate(), aligning
start chunk/block to beginning of the chunk/block boundary.
2. cache head object in write path in case write-cache
is disabled - for maintaining cache consistensy
3. delete dirty blocks of older versions of a non-versioned
bucket as dirty blocks are not evicted, and older versions won't
be written to the disk also.
4. remove dirty objects from the dirty objects data structure,
in case the bucket it belongs to has been deleted.
5. rgw/d4n: fixing compilation issue after rebasing with main.
6. Handle multipart objects correctly in copy object
7. Fix more ranged request errors.
8. handling part_num correctly for multipart and non-multipart objects
9. handling obect name starting with '_'.
10. bug in range request for sending back data to the client, after reading from
backend store.
11. rgw/d4n: code to populate RGW_ATTR_CRYPT_PARTS attr
in d4n filter.
12. rgw/d4n: fix for 'if-match' and 'if-nomatch' for
put object and copy object.
13. rgw/cache: Account for slashes in object name
14. d4n/filter: Handle request headers during read if `next->prepare` isn't called
15. d4n/filter: Fix overwriting of object size and instance
16. rgw/d4n: Supply attrs to `calculate_version`
17. rgw/d4n: Handle ACL and etag in copy_object
18. rgw/filter: Ensure cksum values are maintained
19. rgw/d4n: Set parts_count correctly and check for bufferlist length in calculate_version
20. rgw/d4n: adding a case for iterate method, where last
part to read is smaller than chunk size.
Samarah [Fri, 17 May 2024 19:19:12 +0000 (19:19 +0000)]
rgw/d4n: Squash the following commits related to directory, eviction and filter driver logs:
1. d4n/directory: Remove `blockHosts` and change `objHosts` to store the hosts for the block
2. d4n/directory: Remove `dirtyBlock` metadata and use the cacheObj's `dirty` flag in block logic
3. rgw/d4n: This commit introduces the following changes:
a. Fix `get_victim_block` method to correctly handle version
b. Return `0` instead of error for non-error circumstances in `eviction`
c. Switch `increase` to `decrease` for heap after localWeight update in
`eviction`
d. Update filter writer logs
4. d4n/filter: Make minor adjustments
5. test/d4n: Update `update_field` test calls
Samarah [Wed, 27 Mar 2024 17:42:41 +0000 (17:42 +0000)]
rgw/d4n: squashing the following commits for miscellaneous fixes
to policy driver, redis driver, directory and filter driver.
1. d4n/directory: Use boost::split for simpler code
2. rgw: Lower log levels for failures in D4N and redis cache files
3. rgw: Add dpp and logs to directory, cache, and policy
4. rgw: Reduce Redis calls and fix workflow
5. qa/d4n: Remove D4N task and add S3 user creation to workunit driver script
6. d4n: Use Redis transactions to serialize consecutive requests for safe
data handling and faster completion
7. d4n/directory: Remove boost lexical_cast calls
8. rgw/d4n: Add return values to error logs
9. rgw/d4n: Change directory hostsList to use `unordered_set`
10. d4n/filter: Simplify logic for storing block in `handle_data`
11. rgw/policy: Properly delete `LFUDAEntry` instances
12. rgw/d4n: Add support for `dirty` block metadata, `check_bool` for consistent values, and fix directory updates in `cleanup` method
rgw/d4n: miscellaneous corrections/additions:
1. storing objects in directory using their oid, so that the version
is included.
2. making sure that the head block corresponds to latest
version in the block directory.
3. add a directory entry for head block for every version
in case of a versioned bucket.
4. Populating hostsList correctly for blocks and objects.
rgw/d4n: squashing all commits related to caching head in the
write-back workflow, modifying set_obj_attrs(), get_obj_attrs() and
delete_obj_attrs based on the cached head and modifying the cleaning
method to use a min-heap data structure for storing dirty objects only.
1. rgw/d4n: implementation for caching head object in write-back workflow.
2. rgw/d4n: modifications to get write back cache working after cleaning
process.
3. rgw/d4n: modifications for eviction of dirty blocks.
4. rgw/d4n: modifications include adding a heap of dirty objects
which has objects ordered by their creation time and the top
element of which is fetched in the cleaning method, processed
and deleted in a loop.
5. rgw/d4n: changing the format of cached blocks to
bucket_name_version_object_name_ofs_len, to avoid checks
for versioned and non-versioned objects.
6. rgw/d4n: modifications to set_obj_attrs(), modify_obj_attrs()
and delete_obj_attrs() to check if the head object exists in a cache,
else direct the calls to backend store.
7. rgw/d4n: handling version in case of bucket versioning being suspended
while writing the object.
Co-authored by: Samarah <samarah.uriarte@ibm.com>
Changed dynamic_cast to static_cast for D4NFilterObject
in D4NFilterWriter class constructors.
mosayyebzadeh [Mon, 26 Feb 2024 15:43:01 +0000 (15:43 +0000)]
rgw/d4n: squashing all commits related to initial implementation
of write-back cache for non-multipart objects (writing objects to
cache and then to backend store in the cleaning process):
1. combining write cache with latest D4N code
2. cleaning the code
3. removing some bugs on bigger objects
4. updating iterate function to check the dirty flag
5. Updating write cache based on the pull request comments.
Read process needs to be updated based on write process. It needs to check where is the data and if it is dirty or clean.
If it is in the cache and dirty, we need to put D_ in the oid of the object before reading it from cache.
If it is clean, there is nothing to do.
6. updating flush functions and comments.
pybind: switch from pkgutil.find_loader() to importlib.util.find_spec()
Replace pkgutil.find_loader() with importlib.util.find_spec() throughout
Python bindings. This addresses the deprecation warning in Python 3.10
(scheduled for removal in 3.14) that appeared when generating librbd
Python bindings.
The importlib.util.find_spec() API has been available since Python 3.4
and is compatible with our minimum required Python version (3.9, since
commit 51f71fc1).
The warning resolved:
```
/home/kefu/dev/ceph/src/pybind/rbd/setup.py:8: DeprecationWarning: 'pkgutil.find_loader' is deprecated and slated for removal in Python 3.14; use importlib.util.find_spec() instead
if not pkgutil.find_loader('setuptools'):
```
J. Eric Ivancich [Wed, 16 Apr 2025 16:38:33 +0000 (12:38 -0400)]
rgw: prevent crash in `radosgw-admin bucket object shard ...`
This subcommand is used to ask radosgw-admin which bucket index shard
a given object in a given bucket would have its bucket index entry
on. The user is required to supply the number of shards (i.e., the
command doesn't look that up). If 0 is provided it would result in a
divide by zero runtime exception. Values less than or equal to zero
are now protected.
Signed-off-by: J. Eric Ivancich <ivancich@redhat.com>
Fix stray example command block leftover from rebase in
cloud-transition.rst.
Remove extra character > in cloud-sync-module.rst.
Add missing formatting char ` in cloud-sync-module.rst.
Remove extra empty line between example commands that
resulted in a line with just a "#" prompt.
Signed-off-by: Ville Ojamo <14869000+bluikko@users.noreply.github.com>
rbd-mirror: release lock before calling m_async_op_tracker.finish_op()
m_async_op_tracker.finish_op() in InstanceReplayer::start_image_replayers
may invoke a completion that re-enters code paths that attempt to acquire
the same mutex (m_lock), violating the non-recursive lock constraint.
This can be fixed by releasing the lock before calling
m_async_op_tracker.finish_op().
Merge pull request #62818 from ronen-fr/wip-rf-iocnt-plus
osd/scrub: performance counters: count I/Os, use unlabeled counters
Reviewed-by: Alex Ainscow <aainscow@uk.ibm.com> Reviewed-by: Radoslaw Zarzynski <rzarzyns@redhat.com> Reviewed-by: Bill Scales <bill_scales@uk.ibm.com> Reviewed-by: Samuel Just <sjust@redhat.com>
Ville Ojamo [Thu, 10 Apr 2025 10:34:57 +0000 (17:34 +0700)]
doc/radosgw: Promptify CLI, cosmetic fixes
Use the more modern prompt block for CLI commands
and use right one $ vs #.
Fix indentation on JSON example outputs and
some CLI command switches.
Add some arguably missing comma in JSON example output.
Add a full stop at the end of a one-sentence paragraph.
Remove extra comma mid-sentence in another.
Fix missing backslashes or typo at end of multiline commands.
Lines under section headings as long as heading text.
Fix hyperlinks. Fix list items prefixed with - insted of *.
Format configuration syntax in the middle of text as code.
Fix typo "PI" to "API" and remove extra space.
Remove colons at the end of section headers in a few places.
Use Title Case in section titles consistently with short words lowercase.
Possibly controversial: don't add whitespace before and
after main title section header text.
Possibly controversial: don't indent line continuation
backslashes, leave only 1 space before them.
Signed-off-by: Ville Ojamo <14869000+bluikko@users.noreply.github.com>
osd/scrub: a single counters selection mechanism - step 1
Following the preceeding PR, the Scrubber now employs
two methods for selecting the specific subset of performance
counters to update (the replicated pool set or the EC one).
The first method is using labeled counters, with 4 optional labels
(Primary/Replica X Replicated/EC Pool). The second method
is by naming the specific OSD counters to use in ScrubIoCounterSet
objects, then selecting the appropriate set based on the pool type.
This commit is the first step on the path to unifying the two
methods - discarding the use of labeled counters, and only
naming OSD counters.
osd/scrub: perf-counters for I/O performed by the scrubber
Define two sets of performance counters to track I/O performed
by the scrubber - one set to be used when scrubbing a PG
in a replicated pool, and one - for EC PGs.
https://github.com/ceph/ceph/pull/62080 tested version was **different**
from the one that got merged.
The untested change was changing the boolean returned from start_recovery_ops.
While the seastar::repeat loop in BackgroundRecoveryT<T>::start() was changed accordingly,
other do_recovery() return cases were not considered.
See Tested / Merged here: https://github.com/Matan-B/ceph/pull/2/files
start_recovery_ops used by do_recovery should return whether the iteration (i.e recovery) keep going.
Direct users to upgrade only to Squid v19.2.2, and warn readers not to
upgrade to Squid 19.2.1. This PR is raised in response to a request from
Neha Ojha.
Co-authored-by: Anthony D'Atri <anthony.datri@gmail.com> Signed-off-by: Zac Dover <zac.dover@proton.me>
rgw: metadata and data sync fairness notifications to retry upon any error case
This is a complementary fix to the earlier one described at #62156.
When the sync shard notification fails due to any failures including timeout,
this change keeps the loop going for both metadata and data sync.