Skip to content
This repository has been archived by the owner on Jan 3, 2024. It is now read-only.

S3gw rebase 09 2023 #211

Closed
wants to merge 4,520 commits into from
Closed

S3gw rebase 09 2023 #211

wants to merge 4,520 commits into from

Conversation

0xavi0
Copy link

@0xavi0 0xavi0 commented Sep 15, 2023

THIS IS A TEST PR FOR TESTING CI

jecluis and others added 30 commits September 15, 2023 09:36
Because otherwise we might have conflicting upload ids if there are too
many multipart uploads starting in parallel.

Signed-off-by: Joao Eduardo Luis <[email protected]>
Signed-off-by: Joao Eduardo Luis <[email protected]>
Signed-off-by: Joao Eduardo Luis <[email protected]>
Signed-off-by: Joao Eduardo Luis <[email protected]>
Signed-off-by: Joao Eduardo Luis <[email protected]>
After delete bucket is implemented we'd need to identify buckets and
objects owned by that bucket in a unique way.
This implements the changes needed in metadata and code related to
identify bucket and objects in a bucket with bucket_id instead of bucket
name.

Fixes: https://github.com/aquarist-labs/s3gw/issues/128
Signed-off-by: Xavi Garcia <[email protected]>
Fixes compilation issue introduced after merging the PR:
#44

Fixes: https://github.com/aquarist-labs/s3gw/issues/133
Signed-off-by: Xavi Garcia <[email protected]>
run rgw/sfs unit test suite on every pull request submission.

Fixes: https://github.com/aquarist-labs/s3gw/issues/94
Signed-off-by: Giuseppe Baccini <[email protected]>
Returns only the buckets owned by the SFSUser being called.

It also includes SFSUser tests.

Fixes: aquarist-labs/s3gw-tools#33
Signed-off-by: Xavi Garcia <[email protected]>
Added a new table in sqlite's metadata to store the access keys related
to a user.
That way, when querying by access key we query first that table to
obtain the user id.

Could not implement in the user table itself because access keys are
stored in a blob and we'd need to first decode the blob in order to
query by access key.

Removed the helper columsn in users table for access keys as it was only
supporting the first key and it's no longer used.

Fixes: aquarist-labs/s3gw-tools#83
Signed-off-by: Xavi Garcia <[email protected]>
Because we were obtaining 'obj_map_lock' (through 'Bucket::finish()') after
acquiring 'multipart_map_lock', we introduced a circular dependency with
'Bucket::abort_multiparts()'.

By ensuring we acquire the locks in the intended order ('obj_map_lock'
first, then 'multipart_part_lock'), matching the other function, we
avoid getting stuck in a deadlock situation.

Signed-off-by: Joao Eduardo Luis <[email protected]>
A few user operations were not acquiring the connection lock, either at
all or at some stage of their execution. This was leading to operations
failing/asserting because the database would be locked by a concurrent
operation.

Signed-off-by: Joao Eduardo Luis <[email protected]>
This reverts commit 4b8053d, reversing
changes made to 4ead447.

Signed-off-by: Xavi Garcia <[email protected]>
`mtime` parameter was logged but that's an output variable and might be
`nullptr`.

Avoid logging it and check if it's `nullptr` before setting the value.

Fixes: aquarist-labs/s3gw-tools#191
Signed-off-by: Xavi Garcia <[email protected]>
This patch allows a client to invoke stat_bucket call.
The eventual actual implementation will be addressed on a dedicated
issue.

Fixes: aquarist-labs/s3gw-tools#159
Signed-off-by: Giuseppe Baccini <[email protected]>
Adds a check on metadata compatibility when the `SFStore` initialises.

It creates a temporary copy of the metadata database and tries to sync
the schema on it.
If there are issues (exeptions) or any table is dropped due to
incompatibilities between the data base and the actual metadata schema
it throws a `sqlite_sync_exception`.

The execption is catched when the `SFStore` is instantiated and the
error is logged before exiting `rgw`.

Previous database is not altered as all checks are done in the temporary
database so we don't have data loss.

Fixes: aquarist-labs/s3gw-tools#178
Signed-off-by: Xavi Garcia <[email protected]>
Adds code for adding a delete marker when deleting an object that
doesn't exist.

According to the AWS documentation https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html

when deleteing an object it should reply no errors even if the object
doesn't exist.

This means we create a delete-marker version for the object when
versioning is enabled.

This also fixes the s3-test
test_versioning_multi_object_delete_with_marker_create which is exactly
that test case.

When undeleting delete markers (or deleting all versions of an object),
if the object ends up having no version we just remove it from the
in-memory objects map.

The Garbage collector could then permanently remove those objects
without a version which are, in fact, no longer reachable.

Fixes: aquarist-labs/s3gw-tools#186
Signed-off-by: Xavi Garcia <[email protected]>
This adds an initial GC approach just starting a thread and running
 a basic remove deleted buckets operation.

The implementation of how the thread is started and stopped are taken
from rgw's code for consistency across stores.

It uses 2 parameters from rgw:

- `rgw_gc_processor_period` : defines the time GC waits to be triggered
- `rgw_gc_max_objs` : defines the maximum number of items the GC can
  remove per iteration.

Any possible actions done to the `sqlite` metadata is considered an item
(object) when taking into account the maxium number of items to be
processed in a single iteration as those actions block the metadata
database.

Fixes: aquarist-labs/s3gw-tools#165
Signed-off-by: Xavi Garcia <[email protected]>
Signed-off-by: Volker Theile <[email protected]>
Adds newly added unit tests so they're found when running the
testcontainer.

It also fixes the `unittest_rgw_sfs_gc` that was throwing an exception
in certain circumstances when converting a version object.

Fix is done in this same commit as the goal is to have the newly added
tests and prevent other open PRs to be blocked.

Signed-off-by: Xavi Garcia <[email protected]>
Signed-off-by: Giuseppe Baccini <[email protected]>
Add new 'status' RGW frontend serving status pages on 127.0.0.1:9999.
Includes a beast-based HTTP server, a rudimentary status page
registry and a metrics page.

Activate by setting 'rgw frontends'
(e.g `rgw frontends = beast port=7480, status`)

Signed-off-by: Marcel Lauhoff <[email protected]>
Add and carry around the perf counter index. This makes the index
available when iterating, for example to print / export the counters.

This is useful when exporting histograms in the prometheus exposition
format that includes a running sum for histograms. These are not
included in the perf counter histograms and require a second counter.
To print both perf counters at the same time the index is needed to
match them from different collections.

Signed-off-by: Marcel Lauhoff <[email protected]>
Add string conversion (function, <<operator) and a last element to
make iteration possible.

Signed-off-by: Marcel Lauhoff <[email protected]>
Add perf counter collection 'rgw_op' containing one counter per RGW
operation. Increment counter during init_processing().

Signed-off-by: Marcel Lauhoff <[email protected]>
Add two new perf counter collections to capture operation service time
as one-dimensional histograms and time counters. This combination
allows conversion to the Prometheus histogram format that requires not
only counter buckets, but also a running sum of all values.

Signed-off-by: Marcel Lauhoff <[email protected]>
0xavi0 and others added 5 commits September 15, 2023 09:51
After the multipart code was merged there are a few s3tests that pass
and were not enabled.

This PR enables those s3tests.

Fixes: aquarist-labs/s3gw-tools#185
Signed-off-by: Xavi Garcia <[email protected]>
To allow access to secrets, run PRs labeled with ci/build-s3gw-image in
the target repository.

Signed-off-by: Marcel Lauhoff <[email protected]>
env.s3gw_telemetry is only valid when using the sfs store.  If you
try to run the radosgw binary using, say, dbstore, it will segfault
on exit due to a null pointer dereference.

Fixes: 9b02b73
Signed-off-by: Tim Serong <[email protected]>
It's not safe for DBConn::check_metadata_is_compatible()
to make a copy of the database file while it's already open
via SQLite, because the close() that happens after the file
is copied cancels all POSIX advisory locks, which can later
lead to database corruption.  For details, see:

https://www.sqlite.org/howtocorrupt.html#_posix_advisory_locks_canceled_by_a_separate_thread_doing_close_

This change replaces fs::copy() with use of SQLite's Backup API
(https://www.sqlite.org/backup.html) which is safe to use with
open databases.

Fixes: https://github.com/aquarist-labs/s3gw/issues/702
Signed-off-by: Tim Serong <[email protected]>
This fixes the copy_object operation, in which we were not returning the
right mtime and etag in the response.

It also adds an integration test file for testing this and other
copy_oject tests that are not covered in the upstream s3tests.

When s3tests is forked and our CI is configured to use it, the tests in
that integration tests file should be moved to s3tests and the file
should be deleted. (To avoid having repeated tests)

Fixes: https://github.com/aquarist-labs/s3gw/issues/662
Signed-off-by: Xavi Garcia <[email protected]>
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants