This is an automated email from the ASF dual-hosted git repository.
jlewandowski pushed a commit to branch cep-21-tcm-review
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/cep-21-tcm-review by this push:
new 341dd2c95c Add JavaDoc - jacek - wip
341dd2c95c is described below
commit 341dd2c95c59aad831ed668ce4377a93958a3ead
Author: Jacek Lewandowski <[email protected]>
AuthorDate: Tue Oct 17 18:41:45 2023 +0200
Add JavaDoc - jacek - wip
---
src/java/org/apache/cassandra/db/SystemKeyspace.java | 2 ++
.../org/apache/cassandra/tcm/ClusterMetadata.java | 19 +++++++++++++++++++
.../apache/cassandra/tcm/ClusterMetadataService.java | 11 +++++++++++
.../org/apache/cassandra/tcm/InProgressSequence.java | 4 ++++
.../org/apache/cassandra/tcm/RemoteProcessor.java | 3 +++
src/java/org/apache/cassandra/tcm/log/LocalLog.java | 1 +
.../cassandra/tcm/sequences/InProgressSequences.java | 3 +++
.../cassandra/tcm/sequences/ProgressBarrier.java | 4 ++--
8 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java
b/src/java/org/apache/cassandra/db/SystemKeyspace.java
index 51074de248..402c17219f 100644
--- a/src/java/org/apache/cassandra/db/SystemKeyspace.java
+++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java
@@ -164,6 +164,8 @@ public final class SystemKeyspace
public static final String PREPARED_STATEMENTS = "prepared_statements";
public static final String REPAIRS = "repairs";
public static final String TOP_PARTITIONS = "top_partitions";
+
+ // --- TCM tables ---
public static final String METADATA_LOG = "local_metadata_log";
public static final String SNAPSHOT_TABLE_NAME = "metadata_snapshots";
public static final String SEALED_PERIODS_TABLE_NAME =
"metadata_sealed_periods";
diff --git a/src/java/org/apache/cassandra/tcm/ClusterMetadata.java
b/src/java/org/apache/cassandra/tcm/ClusterMetadata.java
index f9b08fccd7..022910d0fb 100644
--- a/src/java/org/apache/cassandra/tcm/ClusterMetadata.java
+++ b/src/java/org/apache/cassandra/tcm/ClusterMetadata.java
@@ -37,6 +37,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.dht.Range;
@@ -54,6 +55,8 @@ import org.apache.cassandra.schema.Keyspaces;
import org.apache.cassandra.schema.ReplicationParams;
import org.apache.cassandra.tcm.extensions.ExtensionKey;
import org.apache.cassandra.tcm.extensions.ExtensionValue;
+import org.apache.cassandra.tcm.listeners.MetadataSnapshotListener;
+import org.apache.cassandra.tcm.log.LocalLog;
import org.apache.cassandra.tcm.membership.Directory;
import org.apache.cassandra.tcm.membership.Location;
import org.apache.cassandra.tcm.membership.NodeAddresses;
@@ -79,6 +82,18 @@ import org.apache.cassandra.utils.vint.VIntCoding;
import static
org.apache.cassandra.config.CassandraRelevantProperties.LINE_SEPARATOR;
import static org.apache.cassandra.db.TypeSizes.sizeof;
+/**
+ * Represents all transactional metadata of the cluster. It is versioned,
immutable and serializable.
+ * CMS guarantees that all the nodes in the cluster see the same cluster
metadata for the given epoch.
+ * When the metadata gets updated by a node, the new version must be
associated with the new epoch.
+ *
+ * Epochs are groupped into periods. The number of epoch that can fit into a
period is defined by
+ * {@link DatabaseDescriptor#getMetadataSnapshotFrequency()}. When a period is
completed, its number is incremented by
+ * {@link LocalLog#snapshotListener()}, and then, a snapshot is created by the
{@link MetadataSnapshotListener}.
+ * Both are triggered by the {@link LocalLog#processPendingInternal()} method,
which processes the log entries.
+ *
+ * @see MetadataSnapshots for more information about cluster metadata snapshots
+ */
public class ClusterMetadata
{
public static final Serializer serializer = new Serializer();
@@ -356,6 +371,10 @@ public class ClusterMetadata
return VersionedEndpoints.forToken(writeEndpoints.lastModified(),
endpointsForToken.build());
}
+ /**
+ * Builds a new cluster metadata based on top of the provided one,
registering the keys of all the overridden
+ * items.
+ */
public static class Transformer
{
private final ClusterMetadata base;
diff --git a/src/java/org/apache/cassandra/tcm/ClusterMetadataService.java
b/src/java/org/apache/cassandra/tcm/ClusterMetadataService.java
index 6871289e27..6ca65f2931 100644
--- a/src/java/org/apache/cassandra/tcm/ClusterMetadataService.java
+++ b/src/java/org/apache/cassandra/tcm/ClusterMetadataService.java
@@ -81,6 +81,17 @@ import static
org.apache.cassandra.tcm.compatibility.GossipHelper.emptyWithSchem
import static org.apache.cassandra.utils.Clock.Global.nanoTime;
import static org.apache.cassandra.utils.Collectors3.toImmutableSet;
+/**
+ * the entry point to TCM. It is responsible for transforming cluster metadata
consistently in the cluster.
+ * Transformation is performed by the current {@link Processor}.
+ *
+ * There are 3 processors availabe that are used depending on the node state:
+ * <ul>
+ * <li>gossip - the processor is used during upgrade</li>
+ * <li>local - when the node fully started and registered in CMS - that
is, it is a replica which joined the ring</li>
+ * <li>remote - when the node is not a replica / didn't join the ring</li>
+ * </ul>
+ */
public class ClusterMetadataService
{
private static final Logger logger =
LoggerFactory.getLogger(ClusterMetadataService.class);
diff --git a/src/java/org/apache/cassandra/tcm/InProgressSequence.java
b/src/java/org/apache/cassandra/tcm/InProgressSequence.java
index b7a3c01924..c0c70396cb 100644
--- a/src/java/org/apache/cassandra/tcm/InProgressSequence.java
+++ b/src/java/org/apache/cassandra/tcm/InProgressSequence.java
@@ -23,6 +23,10 @@ import
org.apache.cassandra.tcm.sequences.InProgressSequences;
import org.apache.cassandra.tcm.sequences.SequenceState;
import org.apache.cassandra.tcm.sequences.ProgressBarrier;
+/**
+ * A sequence of transformations associated with a node. When a node is
executing a sequence, the order of transformations
+ * is strictly defined. The node also cannot execute any other sequences until
the current one is completed.
+ */
public abstract class InProgressSequence<T extends InProgressSequence<T>>
{
public abstract InProgressSequences.Kind kind();
diff --git a/src/java/org/apache/cassandra/tcm/RemoteProcessor.java
b/src/java/org/apache/cassandra/tcm/RemoteProcessor.java
index c1d5c6b62b..188c88820a 100644
--- a/src/java/org/apache/cassandra/tcm/RemoteProcessor.java
+++ b/src/java/org/apache/cassandra/tcm/RemoteProcessor.java
@@ -55,6 +55,9 @@ import static
org.apache.cassandra.exceptions.ExceptionCode.SERVER_ERROR;
import static org.apache.cassandra.net.NoPayload.noPayload;
import static org.apache.cassandra.tcm.ClusterMetadataService.State.REMOTE;
+/**
+ * This processor delegates commit operation to some other node, a member of
the CMS.
+ */
public final class RemoteProcessor implements Processor
{
private static final Logger logger =
LoggerFactory.getLogger(RemoteProcessor.class);
diff --git a/src/java/org/apache/cassandra/tcm/log/LocalLog.java
b/src/java/org/apache/cassandra/tcm/log/LocalLog.java
index c1219aaa3e..8caf80df9a 100644
--- a/src/java/org/apache/cassandra/tcm/log/LocalLog.java
+++ b/src/java/org/apache/cassandra/tcm/log/LocalLog.java
@@ -659,6 +659,7 @@ public abstract class LocalLog implements Closeable
}
}
+ @VisibleForTesting // only for testing
private static class Sync extends LocalLog
{
private Sync(ClusterMetadata initial, LogStorage logStorage, boolean
addListeners, boolean isReset)
diff --git
a/src/java/org/apache/cassandra/tcm/sequences/InProgressSequences.java
b/src/java/org/apache/cassandra/tcm/sequences/InProgressSequences.java
index 412cb18b78..cf32fcf737 100644
--- a/src/java/org/apache/cassandra/tcm/sequences/InProgressSequences.java
+++ b/src/java/org/apache/cassandra/tcm/sequences/InProgressSequences.java
@@ -43,6 +43,9 @@ import org.apache.cassandra.tcm.serialization.Version;
import static org.apache.cassandra.db.TypeSizes.sizeof;
import static
org.apache.cassandra.tcm.sequences.InProgressSequences.Kind.LEAVE;
+/**
+ * A set of in-progress sequences per node. Each node can take part in only
one sequence at a time.
+ */
public class InProgressSequences implements MetadataValue<InProgressSequences>
{
public static final Serializer serializer = new Serializer();
diff --git a/src/java/org/apache/cassandra/tcm/sequences/ProgressBarrier.java
b/src/java/org/apache/cassandra/tcm/sequences/ProgressBarrier.java
index afa3db5926..7a2c64860a 100644
--- a/src/java/org/apache/cassandra/tcm/sequences/ProgressBarrier.java
+++ b/src/java/org/apache/cassandra/tcm/sequences/ProgressBarrier.java
@@ -62,7 +62,7 @@ import org.apache.cassandra.utils.concurrent.AsyncPromise;
* ProgressBarrier is responsible for ensuring that epoch visibility plays
together with quorum consistency.
*
* When bootstrapping a node, streaming will not start until (by default)
EACH_QUORUM of nodes has seen the epoch that
- * adds the joining jode to the write replica set.
+ * adds the joining node to the write replica set.
*
* Each subsequent step will be gated by waiting for (by default) EACH_QUORUM
of nodes in or proposed to be in the replica set
* to see the previous epoch.
@@ -246,7 +246,7 @@ public class ProgressBarrier
return false;
}
- public static ConsistencyLevel relaxConsistency(ConsistencyLevel cl)
+ private static ConsistencyLevel relaxConsistency(ConsistencyLevel cl)
{
logger.debug("Relaxing ProgressBarrier consistency level {}", cl);
TCMMetrics.instance.progressBarrierCLRelax.mark();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]