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

Reply via email to