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 
> system_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  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
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 

Reply via email to