Cloud DDC Support for AWS Keyspaces

Great, thank you!

I will add this to my backlog and get back to you once its submitted. May need a few weeks as I am in the middle of some larger changes that should be submitted first.

[Attachment Removed]

Hey Nate

I have commited change 51581874 which adds the table options needed for TTL. We have some bigger changes that was just deployed so per our policy we will let this sit in our prod for 2 weeks and then make a official release with these changes. So expect to see a release by EOM unless we find some major issues in it.

If you have the time syncing down this change and confirming that it does indeed work for you would be helpful as I am unable to test this myself.

[Attachment Removed]

Hey Joakim - sorry about the late follow up here. I can definitely test 51581874. Is that still a good change to test or is there a newer one I should focus on?

Thanks again,

Nate

[Attachment Removed]

Absolutely! We’re out for the rest of the year as well. Will check back in for this in the new year. Thanks and have a great holiday!

[Attachment Removed]

No rush, but we’re back in the office on our side now, so whenever you’re thinking about picking this up we’re available.

[Attachment Removed]

I have commited change 49650969 with a option to indicate that we are using AWS Keyspace (that should also let you remove the UseAzureCosmosDB as that option also disable all the scylla specific commands).

Note that this change is completely untested.

Let me know if you run into any more issues with keyspaces that you would like me to add tweaks around.

[Attachment Removed]

Thanks! Testing it out. Also, we typically don’t like deviating far off from what Epics practices are. I was curious if there was a fundamental reason why y’all prefer/use scylla over an offering like Keyspaces?

[Attachment Removed]

It is good news that Keyspaces seems to be working out for you!

Epic uses a geo location DNS (AWS Route53 Geo record) as long as DNS requests are not internal they work out well (we have needed to configure some VPNs to not route these requests). But there are for sure cases were that breaks.

So a alternative (or I guess rather a complement because we use both) is to change the Hostname in the ini to be semicolon seperated list. We have that were the first entry (which is used by default if its unable to pick a better one) is the geo record and then we specify one endpoint per region . The editor will attempt to connect to all of these on startup and see which one is the best (fastest response time), using that.

So our ini looks like this (removed everything but the host entry for easier reading)

[StorageServers]
Cloud=(Host="https://jupiter.devtools.epicgames.com;https://use.jupiter.devtools.epicgames.com;https://usw.jupiter.devtools.epicgames.com;https://euc.jupiter.devtools.epicgames.com;https://sae.jupiter.devtools.epicgames.com;https://apne.jupiter.devtools.epicgames.com;https://apse.jupiter.devtools.epicgames.com")

[Attachment Removed]

main schema

CREATE KEYSPACE cloudddc_demo WITH replication = {'class': 'NetworkTopologyStrategy', 'ap-southeast-2': '3', 'us-west-2': '3'}  AND durable_writes = true;
 
CREATE TYPE cloudddc_demo.blob_identifier (
    hash blob
);
 
CREATE TYPE cloudddc_demo.object_reference (
    bucket text,
    key text
);
 
CREATE TABLE cloudddc_demo.buckets_v2 (
    namespace text,
    bucket text,
    PRIMARY KEY (namespace, bucket)
) WITH CLUSTERING ORDER BY (bucket ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo.object_last_access_v2 (
    namespace text,
    bucket text,
    name text,
    last_access_time timestamp,
    PRIMARY KEY ((namespace, bucket, name))
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo.buckets (
    namespace text PRIMARY KEY,
    bucket set<text>
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo.blob_index_v2 (
    namespace text,
    blob_id blob,
    region text,
    PRIMARY KEY ((namespace, blob_id), region)
) WITH CLUSTERING ORDER BY (region ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo.bucket_referenced_blobs (
    namespace text,
    bucket_id text,
    hash_prefix text,
    blob_id blob,
    size bigint,
    PRIMARY KEY ((namespace, bucket_id, hash_prefix), blob_id)
) WITH CLUSTERING ORDER BY (blob_id ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo.objects (
    namespace text,
    bucket text,
    name text,
    inline_payload blob,
    is_finalized boolean,
    last_access_time timestamp,
    payload_hash blob_identifier,
    PRIMARY KEY ((namespace, bucket, name))
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo.bucket_referenced_ref (
    namespace text,
    bucket_id text,
    hash_prefix text,
    reference_id text,
    PRIMARY KEY ((namespace, bucket_id, hash_prefix), reference_id)
) WITH CLUSTERING ORDER BY (reference_id ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo.blob_incoming_references (
    namespace text,
    blob_id blob,
    reference_id blob,
    bucket_id text,
    reference_type smallint,
    PRIMARY KEY ((namespace, blob_id), reference_id)
) WITH CLUSTERING ORDER BY (reference_id ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo.blob_index (
    namespace text,
    blob_id blob,
    references set<frozen<object_reference>>,
    regions set<text>,
    PRIMARY KEY ((namespace, blob_id))
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo.content_id (
    content_id blob,
    content_weight int,
    chunks set<blob>,
    PRIMARY KEY (content_id, content_weight)
) WITH CLUSTERING ORDER BY (content_weight ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

[Attachment Removed]

replication schema

# Replication Schema
CREATE KEYSPACE cloudddc_demo_local_usw2 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'}  AND durable_writes = true;
 
CREATE TYPE cloudddc_demo_local_usw2.blob_identifier (
    hash blob
);
 
CREATE TABLE cloudddc_demo_local_usw2.blob_replication_log (
    namespace text,
    replication_bucket bigint,
    replication_id timeuuid,
    blob_id blob,
    bucket_hint text,
    type int,
    PRIMARY KEY ((namespace, replication_bucket), replication_id)
) WITH CLUSTERING ORDER BY (replication_id ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo_local_usw2.replication_state (
    namespace text,
    name text,
    last_bucket text,
    last_event uuid,
    PRIMARY KEY (namespace, name)
) WITH CLUSTERING ORDER BY (name ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo_local_usw2.replication_snapshot (
    namespace text,
    id timeuuid,
    blob_namespace text,
    blob_snapshot blob_identifier,
    PRIMARY KEY (namespace, id)
) WITH CLUSTERING ORDER BY (id DESC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo_local_usw2.replication_log (
    namespace text,
    replication_bucket bigint,
    replication_id timeuuid,
    bucket text,
    key text,
    type int,
    object_identifier blob_identifier,
    PRIMARY KEY ((namespace, replication_bucket), replication_id)
) WITH CLUSTERING ORDER BY (replication_id ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';
 
CREATE TABLE cloudddc_demo_local_usw2.replication_namespace (
    namespace text PRIMARY KEY
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
    AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 7776000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 3600000
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

[Attachment Removed]

Sorry for the late reply, was out for easter holiday.

That is still a good change to test, running a bit behind on getting the official release out (due to competing priorities) so we any testing you can provide would be very helpful

[Attachment Removed]

Everything is looking good so far! I just deployed today and pushed some sample data directly through the API. I will have someone push a cook/build session through the system to confirm.

[Attachment Removed]

Hey Nate

Just wanted to mention we released Cloud DDC 1.5.0 now which includes the AWS keyspace support in a public release.

As such I will close this EPS now, feel free to just post in in again if you run into any issues with this or anything else.

[Attachment Removed]

thank you Joakim! I think we can go ahead and close this out if it isn’t already. Really appreciate all your help here. We’ll open a new ticket if we run into any issues.

Thanks again!

[Attachment Removed]