[
https://issues.apache.org/jira/browse/CASSANDRA-9425?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15826564#comment-15826564
]
Aleksey Yeschenko commented on CASSANDRA-9425:
----------------------------------------------
Alright. Fixed the failing tests ({{TableId}} patch broke Paxos, and index
metadata patch altered custom index handling a bit - for the better - but broke
{{CustomIndexTests}}), and addressed some of the comments.
In addition got rid of {{DataResource}} in {{TableMetadata}}, and undid a tiny
bit of of the related CASSANDRA-10410 optimisation I hope you don’t mind.
bq. I'd rename {{TableMetadata.table}} to {{TableMetadata.name}} for
consistency with other classes ({{KeyspaceMetadata}} and {{IndexMetadata}} at
least). While at it, I'd also rename {{ksName}} to {{keyspace}} and
{{viewName}} to {{name}} in {{ViewMetadata}}.
Both done.
bq. I'd also probably rename {{PartitionColumns}} to
{{RegularAndStaticColumns}} now.
Done.
bq. Nit: In {{SSTableTxnWriter}}, it feels slightly inconsistent that
{{createRangeAware}} takes a {{TableMetadata}}, but create takes a
{{TableMetadataRef}}.
I try to use {{TableMetadata}} directly whenever possible, only pass the Ref
when unavoidable. In this case it’s no big deal, though, so done.
bq. In {{Indexes.validate()}}, not sure it's worth doing the duplicate name
check since we do it at the keyspace level already (and only doing it within a
single table is a false sense of safety).
Problem is, in announce for {{CREATE INDEX}} we do not call {{KSM.validate()}},
yet. So for the time being, until the next patch, where we always validate the
entirety of the resulting schema
before applying anything, it has to stay here, even if imperfect. Removing it
will fail some tests. And some checks - for now - are still better than no
checks. Verdict: left be until the next patch.
bq. I'd rename {{addRegularColumn}} and {{alterColumnType}} in {{ViewMetadata}}
as they are not modifying the {{ViewMetadata}} but creating copies (say to
{{withAddedRegularColumn()}} and {{withAlteredColumnType}}).
Done.
bq. Is there a rational for notifying everything at the end, versus calling
each notification in the "appropriate" sub-method (notifying table alter in
{{alterTable()}}, ....)? The later would feels a tad more readable to me as
it's slightly easier to check we haven't forgotten something.
I prefer it stylistically. But I also want to get schema and related DB objects
({{Keyspace}}, {{CFS}}, and everything downstream) to get to the consistent
state as fast as possible. For that reason
I’m delaying potentially blocking change event handlers until the very end. On
that note, we should probably eventually move their processing elsewhere, away
from the sensitive path - just enqueue them into some queue and have something
poll and process the queue from time to time.
bq. I'd maybe suggest adding a private {{handleDiff(mapDiff, Function
onDropped, Function onAdded, Function onUpdated)}} method to simplify a bit.
It’s a very minor case of duplication that doesn’t worry me, I’d rather not
factor it wouldn’t strictly speaking make things simpler. Also see the previous
point.
bq. There is a TODO FIXME in {{SchemaKeyspace}} (and not 100% sure what it's
about).
It’s an ugly pre-existing piece of code to avoid re-compiling the UDFs; It
annoys me immensely that a method in {{SchemaKeyspace}} is referencing
{{Schema.instance}}, hence the TODO. I want to get rid of it eventually, but
it’s not important enough to spend my time on it atm.
bq. There is TODO: FIXME in {{ColumnFamilyStore.setCompressionParameters}}.
See CASSANDRA-12949. The method in its current implementation (1.1+) is broken
and unsafe, so I’ve disabled it for safety reasons. Hopefully someone will get
around to dealing with it some time, but I don’t have the time. Either way,
committed a clarification for that TODO.
bq. {{Keyspaces has both a {{get(String)}} that return {{Optional}} and a
{{getNullable(String)}}. We should probably remove one.
Not just {{Keyspaces}}. I prefer to have both options available, as there are
multiple things that can tolerate null return. The alternative would be using
{{get(name).orElse(null)}}, which I personally find unappealing.
bq. The patch changes some system table options (compared to current trunk)
I removed the explicit setting or {{readRepairChance}} to 0.0 as it was
redundant. We made {{readRepairChance}} default to be 0.0 a while ago. Only
{{dcLocalReadRepairChance}} needs resetting.
{{system_distributed}} was switched to default gc gs because gc gs of 0 is a
bug. {{view_build_status}} table accepts deletes, which can be compacted away
before propagation with 0 gc gs. See CASSANDRA-12954. Other tables in that
keyspace should be unaffected, as they don’t use TTL nor explicit deletes.
As for {{system_auth}}, it was never intended to have a special memtable flush
period setting, it was just an accidental reuse.
Should’ve probably commented on all of these 3 in patch comments, but all of
these changes are intentional. Sorry.
bq. I'm unclear on the changes to {{AlterTypeStatement}}. The patch removes the
code that propagate type changes to other table/view/types, but I neither see
where that has moved, nor why that wouldn't be needed anymore (as an aside, if
it does is not needed anymore, than we could remove the {{updateTypes()}} and
{{updateWith()}} methods that are unused in the patch).
They aren’t needed because since 3.0 we started using only the CQL type name in
all system tables. As such, we do not need to update individual UDTs, UDFs,
UDAs, tables, and views. Propagating the type change alone is sufficient. When
the merge happens, the difference will be picked up anyway, and the affected
tables/types/etc. will also be reloaded. Should’ve removed this in 3.0 schema
rewrite.
Removed {{updateTypes()}} and {{updateWith()}} though, thanks for noticing
(IDEA didn’t as they call each other recursively).
Will address the remaining few points shortly, but this is ready for a minor
follow up review. Thank you.
> Make node-local schema fully immutable
> --------------------------------------
>
> Key: CASSANDRA-9425
> URL: https://issues.apache.org/jira/browse/CASSANDRA-9425
> Project: Cassandra
> Issue Type: Sub-task
> Reporter: Aleksey Yeschenko
> Assignee: Aleksey Yeschenko
> Fix For: 4.0
>
>
> The way we handle schema changes currently is inherently racy.
> All of our {{SchemaAlteringStatement}} s perform validation on a schema state
> that's won't necessarily be there when the statement gets executed and
> mutates schema.
> We should make all the *Metadata classes ({{KeyspaceMetadata,
> TableMetadata}}, {{ColumnMetadata}}, immutable, and local schema persistently
> snapshottable, with a single top-level {{AtomicReference}} to the current
> snapshot. Have DDL statements perform validation and transformation on the
> same state.
> In pseudo-code, think
> {code}
> public interface DDLStatement
> {
> /**
> * Validates that the DDL statement can be applied to the provided schema
> snapshot.
> *
> * @param schema snapshot of schema before executing CREATE KEYSPACE
> */
> void validate(SchemaSnapshot schema);
>
> /**
> * Applies the DDL statement to the provided schema snapshot.
> * Implies that validate() has already been called on the provided
> snapshot.
> *
> * @param schema snapshot of schema before executing the statement
> * @return snapshot of schema as it would be after executing the statement
> */
> SchemaSnapshot transform(SchemaSnapshot schema);
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)