Skip to content

feat(parquet): RFC0013 red — store module skeleton + §5 ignored stubs - #230

Merged
jensholdgaard merged 5 commits into
mainfrom
rfc0013-red
Jun 15, 2026
Merged

feat(parquet): RFC0013 red — store module skeleton + §5 ignored stubs#230
jensholdgaard merged 5 commits into
mainfrom
rfc0013-red

Conversation

@jensholdgaard

@jensholdgaard jensholdgaard commented Jun 15, 2026

Copy link
Copy Markdown
Owner

What

Starts the red stage for RFC 0013 (object-storage backend) — the first code of the shipping milestone. Lands the scaffold the green work fills; flips RFC 0013 specified → red.

  • object_store is now a direct dep of ourios-parquet (was transitive via DataFusion; 0.13 unifies with the in-tree version).
  • crates/ourios-parquet/src/store.rs — a Store type wrapping Arc<dyn ObjectStore> + a key prefix, with local() (real, LocalFileSystem-backed), s3() (stubbed — green), object_store() (for handing to DataFusion on the read path), and S3Config/StoreError. Re-exported from lib.rs.
  • tests/rfc0013_object_store.rs — the 8 §5 scenarios (RFC0013.1–.8) as #[ignore]d stubs that todo!(). Ignored so CI stays green and this red scaffold merges; green un-ignores + implements each.

Decision resolved at red

Crate shape (RFC 0013 §3.7 / §7 first open question): a store module in ourios-parquet, not a new crate. The dep graph confirms it — ourios-querier, -ingester, -server already depend on ourios-parquet, so the type is visible to every storage consumer without the CLAUDE.md §7 new-crate commitment. Extracting an ourios-store crate later (if a non-Parquet consumer appears) is mechanical.

Verified locally

cargo fmt, cargo clippy -p ourios-parquet --all-targets (clean), cargo test -p ourios-parquet (the rfc0013 binary reports 8 ignored, 0 failed; the rest of the suite green), cargo deny check (advisories/bans/licenses/sources ok — the now-direct object_store adds no new graph entries).

green next (separate PRs)

S3 backend (object_store aws feature) + conditional-PUT atomic publish (RFC0013.3/.4); migrate writer/reader/compaction/audit from bucket_root: &Path onto Store; un-#[ignore] the stubs. The remaining §7 questions (lease mechanism, conditional-PUT portability, multipart, creds, cache, migration) get decided there.

Invariants

Adds a storage seam; no behaviour change yet (consumers still use the &Path path). Serves §3.6 (object storage = truth); WAL stays local (§3.4). The store skeleton's s3() is unimplemented!() (red), not on any production path.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added object storage backend abstraction enabling local filesystem-based data persistence.
    • Established framework for S3-compatible storage (S3 backend implementation coming in future release).
  • Documentation

    • Updated RFC documentation with implementation progress and acceptance test scenarios.

@jensholdgaard
jensholdgaard requested a review from Copilot June 15, 2026 15:05
@coderabbitai

coderabbitai Bot commented Jun 15, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@jensholdgaard, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 35 minutes and 2 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 748a2487-73a9-4ab5-9acb-f3de65e7fc1f

📥 Commits

Reviewing files that changed from the base of the PR and between 47e2fd7 and 82231c3.

📒 Files selected for processing (2)
  • crates/ourios-parquet/src/store.rs
  • crates/ourios-parquet/tests/rfc0013_object_store.rs
📝 Walkthrough

Walkthrough

Introduces the RFC 0013 "red" scaffold in ourios-parquet: adds object_store v0.13 as a direct dependency, creates store.rs with Store, S3Config, and StoreError types (live local() constructor, stubbed s3()), wires the module into the crate public API, adds eight #[ignore]d acceptance test stubs, and advances RFC/roadmap documents to red status.

Changes

RFC 0013 Red Scaffold

Layer / File(s) Summary
Store types, constructors, and crate wiring
crates/ourios-parquet/Cargo.toml, crates/ourios-parquet/src/store.rs, crates/ourios-parquet/src/lib.rs
Adds object_store v0.13 dependency; introduces Store (wraps Arc<dyn ObjectStore> + ObjectPath prefix), S3Config, and StoreError; implements Store::local via LocalFileSystem and stubs Store::s3 as StoreError::Unimplemented; re-exports all three types from the crate root.
RFC 0013 §5 ignored acceptance test stubs
crates/ourios-parquet/tests/rfc0013_object_store.rs
Adds eight #[ignore]d #[test] functions for S3 round-trip, local-backend regression, atomic publish, conditional-PUT manifest swap, tenant prefix isolation, WAL locality, S3-compatible endpoint override, and reader forward-compat; stubs reference Store::s3 and S3Config::default() to keep the public seam compile-anchored.
RFC and roadmap status advanced to red
docs/rfcs/0013-object-storage.md, docs/roadmap.md
Updates RFC 0013 status from specified to red, adds "red scaffold landed" paragraph with "green work" checklist, resolves §3.7 crate-shape as a module inside ourios-parquet, marks that open question done, and updates roadmap.md with red-stage details.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐇 A skeleton store for objects galore,
local() hops free, s3() is in store—
Eight stubs lie quiet, all #[ignore]d tight,
The RFC turns red (that's progress, alright!).
Green awaits the next burrow to dig! 🌿

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: landing the red-stage scaffold for RFC 0013 with a store module skeleton and ignored test stubs, matching the changeset precisely.
Description check ✅ Passed The description comprehensively covers all required template sections: clear summary of changes, related RFC 0013 reference, and detailed verification of all checklist items (cargo fmt, clippy, tests, docs/RFC updated).
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch rfc0013-red

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Starts the RFC 0013 “red” stage by adding an ourios-parquet object-store seam (Store) plus ignored acceptance-scenario test stubs, and updates the RFC/roadmap status to reflect the new gate.

Changes:

  • Adds ourios_parquet::store with a Store wrapper over Arc<dyn ObjectStore>, a wired local() constructor, and an s3() placeholder for upcoming green work.
  • Introduces RFC 0013 §5 scenario test stubs as #[ignore]d todo!() tests.
  • Promotes RFC 0013 status to red in docs (RFC + roadmap) and makes object_store a direct dependency of ourios-parquet.

Reviewed changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
docs/roadmap.md Updates the roadmap entry to reflect RFC 0013 moving to red and landing the store skeleton + stubs.
docs/rfcs/0013-object-storage.md Flips RFC status to red and records the crate-shape decision plus the new scaffold.
crates/ourios-parquet/tests/rfc0013_object_store.rs Adds the eight RFC §5 scenario stubs as ignored tests (red-gate scaffolding).
crates/ourios-parquet/src/store.rs Introduces the Store/S3Config/StoreError skeleton and a working local backend constructor.
crates/ourios-parquet/src/lib.rs Exposes the new store module and re-exports Store/S3Config/StoreError.
crates/ourios-parquet/Cargo.toml Adds object_store as a direct dependency for the new storage seam.
Cargo.lock Records the new direct dependency linkage for ourios-parquet.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated 9 comments.

Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/src/store.rs

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated 8 comments.

Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated 8 comments.

Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs
Comment thread crates/ourios-parquet/tests/rfc0013_object_store.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
crates/ourios-parquet/src/store.rs (1)

33-47: ⚡ Quick win

S3Config::default() produces an invalid configuration.

The #[derive(Default)] on S3Config generates a default with an empty bucket string, which is semantically invalid. An S3 configuration without a bucket name cannot be used.

Consider removing the Default derive or implementing Default manually to return a configuration that is either explicitly invalid (e.g., with a marker value) or documenting that the default is not usable as-is.

♻️ Option 1: Remove Default derive
-#[derive(Debug, Clone, Default)]
+#[derive(Debug, Clone)]
 #[non_exhaustive]
 pub struct S3Config {

Alternatively, if Default is needed for the test stub at line 63 in tests/rfc0013_object_store.rs, document that the default is not a usable configuration:

♻️ Option 2: Document the default as a placeholder
 /// Configuration for the S3 / S3-compatible backend (RFC0013.7). Populated
 /// from RFC 0004 config at `green`; a placeholder here so the `red`
 /// constructor signature is stable.
+///
+/// Note: The `Default` impl produces an invalid configuration (empty bucket).
+/// It exists only for test scaffolding during the `red` stage.
 #[derive(Debug, Clone, Default)]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/ourios-parquet/src/store.rs` around lines 33 - 47, The S3Config struct
derives Default, which produces a configuration with an empty bucket string that
is semantically invalid and cannot be used. Either remove the #[derive(Default)]
attribute from S3Config to prevent invalid default instances, or implement
Default manually for S3Config with clear documentation that the default is a
placeholder configuration not intended for actual use. If a manual Default
implementation is chosen, ensure it returns a S3Config that makes the
placeholder nature explicit (such as with a marker bucket name) or document this
limitation prominently.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/ourios-parquet/src/store.rs`:
- Around line 95-113: The `#[allow(clippy::needless_pass_by_value,
unused_variables)]` attribute on the s3 function lacks a required explanation
comment per coding guidelines. Add a `//` comment above or inline with this
attribute explaining why the lints are being suppressed. The explanation should
note that the cfg parameter and unused variables are acceptable in the current
red (stub) implementation because they will be used once the green
implementation is completed.

---

Nitpick comments:
In `@crates/ourios-parquet/src/store.rs`:
- Around line 33-47: The S3Config struct derives Default, which produces a
configuration with an empty bucket string that is semantically invalid and
cannot be used. Either remove the #[derive(Default)] attribute from S3Config to
prevent invalid default instances, or implement Default manually for S3Config
with clear documentation that the default is a placeholder configuration not
intended for actual use. If a manual Default implementation is chosen, ensure it
returns a S3Config that makes the placeholder nature explicit (such as with a
marker bucket name) or document this limitation prominently.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 511b01bf-6128-43f7-a84e-c2a2adb1930e

📥 Commits

Reviewing files that changed from the base of the PR and between ef22095 and 47e2fd7.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • crates/ourios-parquet/Cargo.toml
  • crates/ourios-parquet/src/lib.rs
  • crates/ourios-parquet/src/store.rs
  • crates/ourios-parquet/tests/rfc0013_object_store.rs
  • docs/rfcs/0013-object-storage.md
  • docs/roadmap.md

Comment thread crates/ourios-parquet/src/store.rs

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated 2 comments.

Comment thread crates/ourios-parquet/src/store.rs
Comment thread crates/ourios-parquet/src/store.rs Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated no new comments.

@jensholdgaard
jensholdgaard merged commit eb0caea into main Jun 15, 2026
13 checks passed
@jensholdgaard
jensholdgaard deleted the rfc0013-red branch June 15, 2026 16:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants