Switch branches/tags
v2.2.0-alpha.00000000 v2.1.0-beta.20181015 v2.1.0-beta.20181008 v2.1.0-beta.20181001 v2.1.0-beta.20180924 v2.1.0-beta.20180917 v2.1.0-beta.20180910 v2.1.0-beta.20180904 v2.1.0-beta.20180827 v2.1.0-alpha.20180730 v2.1.0-alpha.20180702 v2.1.0-alpha.20180604 v2.1.0-alpha.20180507 v2.1.0-alpha.20180416 v2.1.0-alpha.00000000 v2.0.6 v2.0.6-rc.1 v2.0.5 v2.0.4 v2.0.3 v2.0.2 v2.0.1 v2.0.0 v2.0-rc.1 v2.0-beta.20180326 v2.0-beta.20180319 v2.0-beta.20180312 v2.0-beta.20180305 v2.0-alpha.20180212 v2.0-alpha.20180129 v2.0-alpha.20180122 v2.0-alpha.20180116 v2.0-alpha.20171218 v2.0-alpha.20171218-plus-left-join-fix v1.2-alpha.20171211 v1.2-alpha.20171204 v1.2-alpha.20171113 v1.2-alpha.20171026 v1.2-alpha.20170901 v1.1.9 v1.1.9-rc.1 v1.1.8 v1.1.7 v1.1.6 v1.1.5 v1.1.4 v1.1.3 v1.1.2 v1.1.1 v1.1.0 v1.1.0-rc.1 v1.1-beta.20170928 v1.1-beta.20170921 v1.1-beta.20170907 v1.1-alpha.20170817 v1.1-alpha.20170810 v1.1-alpha.20170803 v1.1-alpha.20170720 v1.1-alpha.20170713 v1.1-alpha.20170629 v1.1-alpha.20170622 v1.1-alpha.20170608 v1.1-alpha.20170601 v1.0.7 v1.0.6 v1.0.5 v1.0.4 v1.0.3 v1.0.2 v1.0.1 v1.0 v1.0-rc.3 v1.0-rc.2 v1.0-rc.1 v0.1-alpha beta-20170420 beta-20170413 beta-20170406 beta-20170330 beta-20170323 beta-20170309 beta-20170223 beta-20170216 beta-20170209 beta-20170126 beta-20170112 beta-20170105 beta-20161215 beta-20161208 beta-20161201 beta-20161110 beta-20161103 beta-20161027 beta-20161013 beta-20161006 beta-20160929 beta-20160915 beta-20160908 beta-20160829 beta-20160728
Nothing to show
Find file History
petermattis RFCS: update readme
Add initial sections that go into more detail of the when and how of
RFCs and mention the benefits of prototyping. Add a separate
PROTOTYPING.md doc that goes into more details.

Trim the "RFC Process" section, replacing the FCP with the judgment of
the author and reviewers. Trim the "RFC Status" section as that level of
formalism seems like overkill. The template lists the states and
mistakes here aren't really a problem.

Release note: none
Latest commit 44ce01a Jan 14, 2018
Permalink
..
Failed to load latest commit information.
images RFCS: SQL optimizer statistics Nov 10, 2017
00000000_template.md fix link to anchor Dec 13, 2017
20150720_schema_gossip.md rfc: update the RFC process Aug 25, 2017
20150729_bounds_generation.md rfc: update the RFC process Aug 25, 2017
20150729_range_replica_naming.md rfc: update the RFC process Aug 25, 2017
20150729_replica_tombstone.md rfc: update the RFC process Aug 25, 2017
20150729_segmented_storage.md rfc: update the RFC process Aug 25, 2017
20150731_local_intent_resolution.md rfc: update the RFC process Aug 25, 2017
20150806_gateway_batch.md rfc: update the RFC process Aug 25, 2017
20150810_select_from_index.md rfc: update the RFC process Aug 25, 2017
20150810_sql_privileges.md rfc: update the RFC process Aug 25, 2017
20150811_replica_batch.md rfc: update the RFC process Aug 25, 2017
20150819_stateless_replica_relocation.md rfc: update the RFC process Aug 25, 2017
20150820_store_pool.md rfc: update the RFC process Aug 25, 2017
20150820_structured_configs.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20151009_table_descriptor_lease.md docs: fix backticks and comments in SQL code snippet of table lease RFC Nov 2, 2017
20151014_online_schema_change.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20151111_txn_gc.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20151207_grpc.md rfc: update the RFC process Aug 25, 2017
20151213_dismantle_multiraft.md rfc: update the RFC process Aug 25, 2017
20151214_sql_column_families.md rfc: update the RFC process Aug 25, 2017
20160201_remove_sql_cli.md rfc: update the RFC process Aug 25, 2017
20160203_typing.md rfc: update the RFC process Aug 25, 2017
20160210_raft_consistency_checker.md rfc: update the RFC process Aug 25, 2017
20160210_range_leases.md rfc: update the RFC process Aug 25, 2017
20160218_freeze.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20160331_index_hints.md rfc: update the RFC process Aug 25, 2017
20160418_dump.md rfc: update the RFC process Aug 25, 2017
20160420_proposer_evaluated_kv.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20160421_distributed_sql.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20160425_drain_modes.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20160426_fk.md rfc: update the RFC process Aug 25, 2017
20160426_upsert.md rfc: update the RFC process Aug 25, 2017
20160426_version_upgrades.md rfc: update the RFC process Aug 25, 2017
20160503_rebalancing_v2.md docs: Fix all broken links referring to RFCs Sep 7, 2017
20160524_time_travel.md rfc: update the RFC process Aug 25, 2017
20160525_type_annotations.md rfc: update the RFC process Aug 25, 2017
20160624_sql_interleaved_tables.md docs: Fix all broken links referring to RFCs Sep 7, 2017
20160706_expressive_zone_config.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20160720_backup_restore.md RFCS: mark backup RFC completed Dec 4, 2017
20160721_information_schema.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20160730_streaming_snapshots.md rfc: update the RFC process Aug 25, 2017
20160824_quiesce_ranges.md RFCS: mark quiesce ranges RFC as obsolete Dec 4, 2017
20160830_views.md rfcs: Add missing closing parenthesis in views RFC Dec 20, 2017
20160901_time_series_culling.md rfc: update the RFC process Aug 25, 2017
20161006_time_conversion.md rfc: update the RFC process Aug 25, 2017
20161024_cluster_upgrade_tool.md rfc: update the RFC process Aug 25, 2017
20161026_leaseholder_rebalancing.md docs: fix remaining broken links caused by RFC renames Sep 7, 2017
20161215_join_filters.md rfc: update the RFC process Aug 25, 2017
20170117_enterprise.md docs: Fix all broken links referring to RFCs Sep 7, 2017
20170124_sql_parallelization.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170125_leaseholder_locality.md rfcs: Change "follow the user" to "follow the workload" Nov 15, 2017
20170215_system_jobs.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170314_sql_split_syntax.md rfc: update the status of some RFCs Dec 4, 2017
20170317_settings_table.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170318_init_command.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170319_certificate_rotation.md rfc: update the RFC process Aug 25, 2017
20170424_postgres_syntax.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170505_monitoring_queries_and_sessions.md lint: 🇺🇸🇺🇸🇺🇸 use US locale in TestMisspell 🇺🇸🇺🇸🇺🇸 Nov 30, 2017
20170517_algebraic_data_types.md rfc: update the RFC process Aug 25, 2017
20170518_array_encoding.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170522_external_storage.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170601_pause_resume_cancel.md rfc: update the RFC process Aug 25, 2017
20170601_raft_sstable_sideloading.md rfc: update the RFC process Aug 25, 2017
20170602_distsql_limit.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170602_rebalancing_for_1_1.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170605_dedicated_raft_storage.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170608_decommission.md setting: move back to a global registry Aug 30, 2017
20170608_query_cancellation.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20170613_change_feeds_storage_primitive.md RFC: Storage-Level Primitive for Change Feeds Dec 6, 2017
20170620_streaming_results.md rfc: update the RFC process Aug 25, 2017
20170628_web_session_login.md rfc: update the RFC process Aug 25, 2017
20170701_jobs_monitoring.md docs: fix remaining broken links caused by RFC renames Sep 7, 2017
20170719_distsql_buffering_router.md rfc: update the RFC process Aug 25, 2017
20170815_version_migration.md RFCS: mark version migration RFC as completed Aug 31, 2017
20170908_sql_optimizer_statistics.md rfc: update the status of some RFCs Dec 4, 2017
20170921_sql_partitioning.md sql,sqlccl: support sparse range partitionings Jan 9, 2018
20170925_jsonb_scope.md rfc: JSONB Scope Oct 11, 2017
20170926_sql_aux_data.md RFCS: update status fields and clean up issue/PR links Dec 4, 2017
20171005_jsonb_encoding.md rfc: JSONB encoding Oct 18, 2017
20171011_adding_sql_syntax.md RFC: suggestions on adding new SQL syntax Oct 11, 2017
20171020_inverted_indexes.md rfc: Inverted Indexes Oct 20, 2017
20171024_select_for_update.md rfc: SELECT FOR UPDATE Nov 13, 2017
20171025_interleaved_table_joins.md sql: rename MultiRowFetcher to RowFetcher Jan 18, 2018
20171025_scrub_sql_consistency_check_command.md rfcs: Update SQL scrub command RFC to add AS OF SYSTEM TIME Dec 6, 2017
20171102_sql_sequences.md rfc: SQL sequences Nov 2, 2017
20171120_scrub_index_and_physical_implementation.md sql: rename MultiRowFetcher to RowFetcher Jan 18, 2018
20171201_cascade.md sql: rename MultiRowFetcher to RowFetcher Jan 18, 2018
20171206_single_use_common_table_expressions.md sql: single-use common table expression support Dec 27, 2017
20171213_sql_query_planning.md RFCS: SQL query planning Dec 13, 2017
20171214_computed_columns.md rfc: computed column change to information_schema Jan 22, 2018
20171220_encryption_at_rest.md RFC: encryption at rest Dec 20, 2017
20171220_sql_role_based_access_control.md RFC edit: sql role-based access control. Jan 8, 2018
PROTOTYPING.md RFCS: update readme Jan 25, 2018
README.md RFCS: update readme Jan 25, 2018

README.md

About This Directory

This directory contains RFCs (design documents) that describe proposed major changes to CockroachDB.

The Why of RFCs

An RFC provides a high-level description of a major change or enhancement to Cockroach. The high-level description allows a reviewer to critique and poke holes in a design without getting lost in the particulars of code.

An RFC is a form of communication aimed at both spreading and gathering knowledge, though it is not the sole means of accomplishing either task. Prototypes, tech notes, github issues, comments in code, commit messages and in-person discussions are valid alternatives depending on the situation.

At its best, an RFC clearly and concisely describes the high-level architecture of a project giving confidence to all involved. At its worst, an RFC focuses on unimportant details, fosters discussion that stymies progress, or demoralizes the author with the complexity of their undertaking.

The When and How of RFCs

When to write an RFC is nuanced and there are no firm rules. General guidance is to write an RFC before embarking on a significant or complex project that will be spread over multiple pull requests (PRs), and when multiple alternatives need to be considered and there is no obvious best approach. A project involving multiple people is a good signal an RFC is warranted. (Similarly, a project worthy of an RFC often requires multiple engineers worth of effort). Note that this guidance is intentionally vague. Many complex projects spread over multiple PRs do not require an RFC, though they do require adequate communication and discussion.1

It is encouraged to develop a prototype concurrently with writing the RFC. One of the significant benefits of an RFC is that it forces bigger picture thinking which reviewers can then disect. In contrast, a prototype forces the details to be considered, shedding light on the unknown unknowns and helping to ensure that the RFC focuses on the important design considerations.

An RFC should be a high-level description which does not require formal correctness. There is utility in conciseness. Do not overspecify the details in the RFC as doing so can bury the reviewer in minutiae.1 If you've never written an RFC before consider partnering with a more experienced engineer for guidance and to help shepherd your RFC through the process.

RFC Process

  1. Every RFC should have a dedicated reviewer familiar with the RFC's subject area.

  2. Copy 00000000_template.md to a new file and fill in the details. Commit this version in your own fork of the repository or a branch.

  3. Submit a pull request (PR) to add your new file to the main repository. Each RFC should get its own pull request; do not combine RFCs with other files.

    Note: you can send a PR before the RFC is complete in order to solicit input about what to write in the RFC. In this case, include the term "[WIP]" (work in progress) in the PR title and use the label do-not-merge, until you are confident the RFC is complete and can be reviewed.

  4. Go through the PR review, iterating on the RFC to answer questions and concerns from the reviewer(s). The duration of this process should be related to the complexity of the project. If you or the reviewers seem to be at an impasse, consider in-person discussions or a prototype. There is no minimum time required to leave an RFC open for review. There is also no prohibition about halting or reversing work on an accepted RFC if a problem is discovered during implementation.

    Reviewers should be conscious of their own limitations and ask for other engineers to look at specific areas if necessary.

  5. Once discussion has settled and the RFC has received an LGTM from the reviewer(s):

    • change the Status field of the document to in-progress;
    • rename the RFC document to prefix it with the current date (YYYYMMDD_);
    • update the RFC PR field;
    • and merge the PR.
  6. Once the changes in the RFC have been implemented and merged, change the Status field of the document from in-progress to completed. If subsequent developments render an RFC obsolete, change its status to obsolete. When you mark a RFC as obsolete, ensure that its text references the other RFCs or PRs that make it obsolete.

Footnotes

1: An exception to the general guidance on when an RFC is warranted is that anything more than trivial changes and extensions to SQL syntax require discussion within an RFC. Additionally, SQL syntax is a detail that an RFC should mention.