Details

    • Type: Sub-task
    • Status: Resolved
    • Priority: Normal
    • Resolution: Fixed
    • Fix Version/s: 3.0.0 rc1
    • Component/s: None
    • Labels:
    • Impacts:
      Clients

      Description

      There is a few problems/improvements that can be done with the way we store schema:

      1. CASSANDRA-4988: as explained on the ticket, storing the comparator is now redundant (or almost, we'd need to store whether the table is COMPACT or not too, which we don't currently is easy and probably a good idea anyway), it can be entirely reconstructed from the infos in schema_columns (the same is true of key_validator and subcomparator, and replacing default_validator by a COMPACT_VALUE column in all case is relatively simple). And storing the comparator as an opaque string broke concurrent updates of sub-part of said comparator (concurrent collection addition or altering 2 separate clustering columns typically) so it's really worth removing it.
      2. CASSANDRA-4603: it's time to get rid of those ugly json maps. I'll note that schema_keyspaces is a problem due to its use of COMPACT STORAGE, but I think we should fix it once and for-all nonetheless (see below).
      3. For CASSANDRA-6382 and to allow indexing both map keys and values at the same time, we'd need to be able to have more than one index definition for a given column.
      4. There is a few mismatches in table options between the one stored in the schema and the one used when declaring/altering a table which would be nice to fix. The compaction, compression and replication maps are one already mentioned from CASSANDRA-4603, but also for some reason 'dclocal_read_repair_chance' in CQL is called just 'local_read_repair_chance' in the schema table, and 'min/max_compaction_threshold' are column families option in the schema but just compaction options for CQL (which makes more sense).

      None of those issues are major, and we could probably deal with them independently but it might be simpler to just fix them all in one shot so I wanted to sum them all up here. In particular, the fact that 'schema_keyspaces' uses COMPACT STORAGE is annoying (for the replication map, but it may limit future stuff too) which suggest we should migrate it to a new, non COMPACT table. And while that's arguably a detail, it wouldn't hurt to rename schema_columnfamilies to schema_tables for the years to come since that's the prefered vernacular for CQL.

      Overall, what I would suggest is to move all schema tables to a new keyspace, named 'schema' for instance (or 'system_schema' but I prefer the shorter version), and fix all the issues above at once. Since we currently don't exchange schema between nodes of different versions, all we'd need to do that is a one shot startup migration, and overall, I think it could be simpler for clients to deal with one clear migration than to have to handle minor individual changes all over the place. I also think it's somewhat cleaner conceptually to have schema tables in their own keyspace since they are replicated through a different mechanism than other system tables.

      If we do that, we could, for instance, migrate to the following schema tables (details up for discussion of course):

      CREATE TYPE user_type (
        name text,
        column_names list<text>,
        column_types list<text>
      )
      
      CREATE TABLE keyspaces (
        name text PRIMARY KEY,
        durable_writes boolean,
        replication map<string, string>,
        user_types map<string, user_type>
      )
      
      CREATE TYPE trigger_definition (
        name text,
        options map<tex, text>
      )
      
      CREATE TABLE tables (
        keyspace text,
        name text,
        id uuid,
        table_type text, // COMPACT, CQL or SUPER
        dropped_columns map<text, bigint>,
        triggers map<text, trigger_definition>,
      
        // options
        comment text,
        compaction map<text, text>,
        compression map<text, text>,
        read_repair_chance double,
        dclocal_read_repair_chance double,
        gc_grace_seconds int,
        caching text,
        rows_per_partition_to_cache text,
        default_time_to_live int,
        min_index_interval int,
        max_index_interval int,
        speculative_retry text,
        populate_io_cache_on_flush boolean,
        bloom_filter_fp_chance double
        memtable_flush_period_in_ms int,
      
        PRIMARY KEY (keyspace, name)
      )
      
      CREATE TYPE index_definition (
        name text,
        index_type text,
        options map<text, text>
      )
      
      CREATE TABLE columns (
        keyspace text,
        table text,
        name text,
        kind text, // PARTITION_KEY, CLUSTERING_COLUMN, REGULAR or COMPACT_VALUE
        component_index int;
        type text,
        indexes map<text, index_definition>,
      
        PRIMARY KEY (keyspace, table, name)
      )
      

      Nit: wouldn't hurt to create a simple enum that is reuse by both CFMetaData and CFPropDefs for table options names while we're at it once they are the same instead of repeating string constants which is fragile.

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                aleksey Aleksey Yeschenko
                Reporter:
                slebresne Sylvain Lebresne
                Authors:
                Aleksey Yeschenko
                Reviewers:
                Sam Tunnicliffe
              • Votes:
                1 Vote for this issue
                Watchers:
                31 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: