and yes, you need to set the consistency level to ONE in the cassandra.yaml if it's running in your local machine
denylist_consistency_level: ONE On Tue, Oct 25, 2022 at 10:41 AM Cheng Wang <che...@netflix.com> wrote: > Awesome! That's great to hear! > Pls feel free to let me know if you have any questions! > > Thanks, > Cheng > > On Tue, Oct 25, 2022 at 10:36 AM Aaron Ploetz <aaronplo...@gmail.com> > wrote: > >> Works! >> >> So I was running on my *local*, and all of my attempts to add to the >> denylist were failing because the denylist_consistency_level was set to >> QUORUM: >> >> WARN [main] 2022-10-25 11:57:27,238 NoSpamLogger.java:108 - Attempting >> to load denylist and not enough nodes are available for a QUORUM refresh. >> Reload the denylist when unavailable nodes are recovered to ensure your >> denylist remains in sync. >> INFO [main] 2022-10-25 11:57:27,238 PartitionDenylist.java:163 - >> Insufficient nodes while loading partition denylist cache. Scheduled retry >> in 5 seconds. >> >> Adjusted that setting to ONE, and now everything is working. >> >> Thanks again, Cheng! >> >> Aaron >> >> >> On Fri, Oct 21, 2022 at 9:48 AM Aaron Ploetz <aaronplo...@gmail.com> >> wrote: >> >>> Awesome. Thank you, Cheng! I’ll give this a shot and let you know. >>> >>> Thanks, >>> >>> Aaron >>> >>> >>> On Oct 21, 2022, at 12:45 AM, Cheng Wang <che...@netflix.com> wrote: >>> >>> >>> Hi Aaron, >>> >>> After reading through the code, I finally figured out the issue. So back >>> to your original question where you failed to run >>> $>run denylistKey stackoverflow weather_sensor_data "'Minneapolis, >>> MN',202210" >>> #IllegalArgumentException: Operation denylistKey with 4 parameters >>> doesn't exist in bean org.apache.cassandra.db:type=StorageProxy >>> >>> It's not a Cassandra issue since it failed at the JMX parser stage, >>> even before it goes to the Cassandra internal StorageProxy::denylistKey >>> method. >>> Yes, you got the right gist. It's because of the extra space between >>> "Minneapolis" and "MN". To avoid the error, you need to add "\\" before the >>> white space as below : >>> >>> $>run denylistKey "stackoverflow" "weather_sensor_data" "Minneapolis,\\ >>> MN:202210" >>> >>> #calling operation denylistKey of mbean >>> org.apache.cassandra.db:type=StorageProxy with params [stackoverflow, >>> weather_sensor_data, Minneapolis, MN:202210] >>> >>> #operation returns: >>> >>> true >>> >>> And yes, the composite key is delimited by ":" . You can find more >>> examples from the test code as it used composite keys >>> >>> https://github.com/apache/cassandra/blob/trunk/test/unit/org/apache/cassandra/service/PartitionDenylistTest.java >>> >>> And then when you select the key, it will get denylisted: >>> >>> cqlsh> select ks_name, table_name, key from >>> system_distributed.partition_denylist; >>> >>> >>> ks_name | table_name | key >>> >>> >>> ---------------+---------------------+------------------------------------------------------ >>> >>> stackoverflow | weather_sensor_data | >>> 0x000f4d696e6e6561706f6c69732c204d4e000004000315e200 >>> >>> >>> (2 rows) >>> >>> cqlsh> select * from stackoverflow.weather_sensor_data where city = >>> 'Minneapolis, MN' AND month = 202210; >>> >>> InvalidRequest: Error from server: code=2200 [Invalid query] >>> message="Unable to read denylisted partition >>> [0xDecoratedKey(8132598509541575594, >>> 000f4d696e6e6561706f6c69732c204d4e000004000315e200)] in >>> stackoverflow/weather_sensor_data" >>> >>> cqlsh> >>> >>> >>> For your second question why even a single partition key doesn't work, >>> my apologies my previous answer on direct insert to the s >>> ystem_distributed.partition_denylist like >>> insert into system_distributed.partition_denylist (ks_name, table_name, >>> key) values ('stackoverflow', 'weather_sensor_data', >>> textAsBlob('''Minneapolis, MN'', 202210')); >>> is wrong. It's because the way Cassandra stores the key in the system >>> table is it converts the string into a hexadecimal literal. You can find >>> the source code here >>> >>> https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/schema/PartitionDenylist.java >>> And check out the function addKeyToDenylist >>> final String insert = String.format("INSERT INTO system_distributed. >>> partition_denylist (ks_name, table_name, key) VALUES ('%s', '%s', 0x%s)" >>> , >>> keyspace, table, ByteBufferUtil.bytesToHex(key)); >>> >>> You can see that it's different from the way of textAsBlob. A better >>> (yet general) explanation is here >>> >>> https://stackoverflow.com/questions/31994880/why-cassandra-cql-query-with-hexadecimal-literal-works-but-textasbinary-does-not >>> >>> So... the short answer is, I get back my previous answer. My apologies! >>> It's not recommended to directly insert rows into >>> the system_distributed.partition_denylist table.You'd better go with the >>> JMX interface since it will go to the StorageProxy which handles more logic >>> like the hex string conversion and other error handling stuff. >>> >>> Hope the answer is helpful! Pls feel free to let me know if you have any >>> questions! >>> >>> Thanks, >>> Cheng >>> >>> >>> On Thu, Oct 20, 2022 at 7:07 AM Aaron Ploetz <aaronplo...@gmail.com> >>> wrote: >>> >>>> No worries, Cheng! >>>> >>>> So I actually pivoted a little and adjusted my example table to use a >>>> single integer-based partition key. >>>> >>>> aaron@cqlsh:stackoverflow> SELECT ks_name, table_name, blobAsint(key) >>>> FROM system_distributed.partition_denylist WHERE ks_name='stackoverflow' >>>> AND table_name='weather_sensor_data_by_month'; >>>> >>>> ks_name | table_name | system.blobasint(key) >>>> ---------------+------------------------------+----------------------- >>>> stackoverflow | weather_sensor_data_by_month | 202210 >>>> >>>> But even with the yaml changes, it still allows me to SELECT that >>>> partition. >>>> >>>> aaron@cqlsh:stackoverflow> SELECT * FROM weather_sensor_data_by_month >>>> WHERE month=202210 LIMIT 1; >>>> >>>> month | city | recorded_time | temp >>>> --------+----------------+---------------------------------+------ >>>> 202210 | Minneapolis,MN | 2022-10-17 11:30:00.000000+0000 | 1 >>>> >>>> Just wondering what I should do to get it to deny access? >>>> >>>> Thanks, >>>> >>>> Aaron >>>> >>>> >>>> >>>> On Wed, Oct 19, 2022 at 5:34 PM Cheng Wang <che...@netflix.com> wrote: >>>> >>>>> Hi Aaron, >>>>> >>>>> Sorry for the late reply, was dealing with a production issue (maybe >>>>> another topic for Cassandra Summit :-)). Are you running on your local >>>>> machine? Then yes, you do need to enable the config for all the following >>>>> >>>>> enable_partition_denylist: true >>>>> >>>>> enable_denylist_writes: true >>>>> enable_denylist_reads: true >>>>> enable_denylist_range_reads: true >>>>> >>>>> I am not sure enable_partition_denylist will enable for the rest of >>>>> three @Jordan West <jord...@netflix.com> maybe you can confirm for >>>>> that? But it's better to enable for all just to be safe. >>>>> I will play by my side and get back to you soon about the >>>>> composite keys. >>>>> >>>>> Thanks >>>>> Cheng >>>>> >>>>> On Wed, Oct 19, 2022 at 1:42 PM Aaron Ploetz <aaronplo...@gmail.com> >>>>> wrote: >>>>> >>>>>> Just checking, but for this to work, do I have to mess with these >>>>>> settings in the YAML at all? >>>>>> >>>>>> partition_denylist_enabled: true >>>>>> denylist_reads_enabled: true >>>>>> >>>>>> They're commented out by default. >>>>>> >>>>>> Thanks, >>>>>> >>>>>> Aaron >>>>>> >>>>>> >>>>>> On Mon, Oct 17, 2022 at 4:53 PM Aaron Ploetz <aaronplo...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Thanks for the help with the INSERT, Cheng! I'm further along than >>>>>>> before. But it still must not be matching up quite right, because I can >>>>>>> still select that partition. >>>>>>> >>>>>>> I have several different combinations of the two keys (and I removed >>>>>>> the space) of "Minneapolis,MN" and 202210. Here's what I've got out >>>>>>> there >>>>>>> so far: >>>>>>> >>>>>>> aaron@cqlsh:stackoverflow> select ks_name, table_name, >>>>>>> blobAsText(key) from system_distributed.partition_denylist; >>>>>>> >>>>>>> ks_name | table_name | system.blobastext(key) >>>>>>> ---------------+---------------------+-------------------------- >>>>>>> stackoverflow | weather_sensor_data | 'Minneapolis,MN', 202210 >>>>>>> stackoverflow | weather_sensor_data | 'Minneapolis,MN',202210 >>>>>>> stackoverflow | weather_sensor_data | 'Minneapolis,MN':202210 >>>>>>> stackoverflow | weather_sensor_data | Minneapolis,MN, 202210 >>>>>>> stackoverflow | weather_sensor_data | Minneapolis,MN202210 >>>>>>> stackoverflow | weather_sensor_data | Minneapolis,MN:202210 >>>>>>> >>>>>>> (6 rows) >>>>>>> >>>>>>> aaron@cqlsh:stackoverflow> SELECT * FROM weather_sensor_data WHERE >>>>>>> city='Minneapolis,MN' AND month=202210; >>>>>>> >>>>>>> city | month | recorded_time | temp >>>>>>> ----------------+--------+---------------------------------+------ >>>>>>> Minneapolis,MN | 202210 | 2022-10-17 11:30:00.000000+0000 | 1 >>>>>>> Minneapolis,MN | 202210 | 2022-10-17 11:25:00.000000+0000 | 1 >>>>>>> Minneapolis,MN | 202210 | 2022-10-17 11:20:00.000000+0000 | 1 >>>>>>> Minneapolis,MN | 202210 | 2022-10-17 11:15:00.000000+0000 | 1 >>>>>>> Minneapolis,MN | 202210 | 2022-10-17 11:10:00.000000+0000 | 2 >>>>>>> Minneapolis,MN | 202210 | 2022-10-17 11:05:00.000000+0000 | 2 >>>>>>> Minneapolis,MN | 202210 | 2022-10-17 11:00:00.000000+0000 | 2 >>>>>>> >>>>>>> (7 rows) >>>>>>> >>>>>>> As you can see, I can still select the partition. I was really >>>>>>> hoping one of those combinations would do it. >>>>>>> >>>>>>> Looking at the StorageProxyTest.java in the project, I saw that it >>>>>>> was delimited by a colon ":", which is why I tried that, too. >>>>>>> >>>>>>> Still looking for the right way to enter both of those keys. >>>>>>> >>>>>>> Thanks, >>>>>>> >>>>>>> Aaron >>>>>>> >>>>>>> >>>>>>> On Mon, Oct 17, 2022 at 4:40 PM Cheng Wang <che...@netflix.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Another approach is, instead of using $$, you can put additional >>>>>>>> pair of single quote around the 'Minneapolis, MN' >>>>>>>> >>>>>>>> cqlsh> insert into system_distributed.partition_denylist (ks_name, >>>>>>>> table_name, key) values ('stackoverflow', 'weather_sensor_data', >>>>>>>> textAsBlob('''Minneapolis, MN'', 202210')); >>>>>>>> >>>>>>>> cqlsh> select ks_name, table_name, blobAsText(key) from >>>>>>>> system_distributed.partition_denylist; >>>>>>>> >>>>>>>> >>>>>>>> ks_name | table_name | system.blobastext(key) >>>>>>>> >>>>>>>> ---------------+---------------------+--------------------------- >>>>>>>> >>>>>>>> stackoverflow | weather_sensor_data | 'Minneapolis, MN', 202210 >>>>>>>> >>>>>>>> On Mon, Oct 17, 2022 at 2:30 PM Cheng Wang <che...@netflix.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Hi Aaron, >>>>>>>>> >>>>>>>>> Yes, you can directly insert into the >>>>>>>>> system_distributed.partition_denylist >>>>>>>>> instead of using JMX. Jordan wrote a blog post for denylist >>>>>>>>> >>>>>>>>> https://cassandra.apache.org/_/blog/Apache-Cassandra-4.1-Denylisting-Partitions.html >>>>>>>>> >>>>>>>>> And the syntax error, one way around is to put $$ around like below >>>>>>>>> >>>>>>>>> cqlsh> insert into system_distributed.partition_denylist (ks_name, >>>>>>>>> table_name, key) values ('stackoverflow', 'weather_sensor_data', >>>>>>>>> textAsBlob($$'Minneapolis, MN', 202210$$)); >>>>>>>>> >>>>>>>>> There is post about this >>>>>>>>> >>>>>>>>> https://docs.datastax.com/en/cql-oss/3.3/cql/cql_reference/escape_char_r.html#:~:text=Column%20names%20that%20contain%20characters,using%20a%20single%20quotation%20mark >>>>>>>>> . >>>>>>>>> >>>>>>>>> and then you can verify the insert by doing >>>>>>>>> >>>>>>>>> cqlsh> select ks_name, table_name, blobAsText(key) from >>>>>>>>> system_distributed.partition_denylist; >>>>>>>>> >>>>>>>>> >>>>>>>>> ks_name | table_name | system.blobastext(key) >>>>>>>>> >>>>>>>>> ---------------+---------------------+--------------------------- >>>>>>>>> >>>>>>>>> stackoverflow | weather_sensor_data | 'Minneapolis, MN', 202210 >>>>>>>>> Pls let me know if it works for you. >>>>>>>>> >>>>>>>>> >>>>>>>>> On Mon, Oct 17, 2022 at 1:35 PM Aaron Ploetz < >>>>>>>>> aaronplo...@gmail.com> wrote: >>>>>>>>> >>>>>>>>>> I have this table definition: >>>>>>>>>> >>>>>>>>>> CREATE TABLE stackoverflow.weather_sensor_data ( >>>>>>>>>> city text, >>>>>>>>>> month int, >>>>>>>>>> recorded_time timestamp, >>>>>>>>>> temp float, >>>>>>>>>> PRIMARY KEY ((city, month), recorded_time) >>>>>>>>>> ) WITH CLUSTERING ORDER BY (recorded_time DESC) >>>>>>>>>> >>>>>>>>>> Sample data looks like this: >>>>>>>>>> >>>>>>>>>> > SELECT * FROM weather_sensor_data WHERE city='Minneapolis, MN' >>>>>>>>>> AND month=202111; >>>>>>>>>> >>>>>>>>>> city | month | recorded_time | temp >>>>>>>>>> >>>>>>>>>> -----------------+--------+---------------------------------+------ >>>>>>>>>> Minneapolis, MN | 202111 | 2021-11-01 08:35:00.000000+0000 | 3 >>>>>>>>>> Minneapolis, MN | 202111 | 2021-11-01 08:30:00.000000+0000 | 3 >>>>>>>>>> Minneapolis, MN | 202111 | 2021-11-01 08:25:00.000000+0000 | 2 >>>>>>>>>> Minneapolis, MN | 202111 | 2021-11-01 08:20:00.000000+0000 | 2 >>>>>>>>>> Minneapolis, MN | 202111 | 2021-11-01 08:15:00.000000+0000 | 2 >>>>>>>>>> >>>>>>>>>> (5 rows) >>>>>>>>>> >>>>>>>>>> Using JMX Term, I've tried to denylist that partition, but I must >>>>>>>>>> have the syntax for composite keys incorrect: >>>>>>>>>> >>>>>>>>>> $>bean org.apache.cassandra.db:type=StorageProxy >>>>>>>>>> $>run denylistKey stackoverflow weather_sensor_data >>>>>>>>>> "'Minneapolis, MN',202210" >>>>>>>>>> #IllegalArgumentException: Operation denylistKey with 4 >>>>>>>>>> parameters doesn't exist in bean >>>>>>>>>> org.apache.cassandra.db:type=StorageProxy >>>>>>>>>> >>>>>>>>>> Obviously, it's reading the space between "Minneapolis," and "MN" >>>>>>>>>> as a delimiter. What's the right way to handle commas, spaces, and >>>>>>>>>> composite keys for this? >>>>>>>>>> >>>>>>>>>> Also, is there another way to accomplish this without using JMX? >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> >>>>>>>>>> Aaron >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>