Sylvain Le Gouellec created KAFKA-13973:
-------------------------------------------

             Summary: block-cache-capacity metrics worth twice as much as normal
                 Key: KAFKA-13973
                 URL: https://issues.apache.org/jira/browse/KAFKA-13973
             Project: Kafka
          Issue Type: Bug
          Components: streams
    Affects Versions: 3.2.0
            Reporter: Sylvain Le Gouellec
         Attachments: Screenshot 2022-06-09 at 08.55.36.png

I have created a very simple kafka-streams application with 1 state store. I'm 
very surprised that the block-cache-capacity metrics show a {{100MB}} block 
cache capacity instead of the default one in kafka streams is {{{}50MB{}}}.
 
My topology :
StreamsBuilder sb = new StreamsBuilder();
sb.stream("input")
        .groupByKey()
        .count()
        .toStream()
        .to("output");
 
I checkout the {{kafka-streams}} code and I saw a strange thing. When the 
{{{}RocksDBTimestampedStore{}}}store is created, we try to create two column 
families for backward compatibility with a potentiel old key/value store.

In this method, {{setDbAccessor(col1, col2)}} if the first column is not valid, 
well you close this one 
([L102|https://github.com/apache/kafka/blob/4542acdc14d5ec3daa1f36d8dc24abc244ee24ff/streams/src/main/java/org/apache/kafka/streams/state/internals/RocksDBTimestampedStore.java#L102]).
 But regarding the rocksdb instance, it's seems that the column families is not 
deleted completely and the metrics exposed by [Rocksdb continue to aggregate 
(L373)|https://github.com/apache/kafka/blob/4542acdc14d5ec3daa1f36d8dc24abc244ee24ff/streams/src/main/java/org/apache/kafka/streams/state/internals/metrics/RocksDBMetricsRecorder.java#L373]
 {{block-cache-capacity }}for both column families (default and 
keyValueWithTimestamp).

Maybe you have to drop explicitly the column family, in the 
{{setDbAccessor(col1, col2)}} if the first column is not valid (like 
{{{}db.dropColumnFamily(noTimestampColumnFamily);{}}})
 
I tried to drop the {{noTimestampColumnFamily in setDbAccessor if the first 
column is not valid like : }}



 
{code:java}
private void setDbAccessor(final ColumnFamilyHandle noTimestampColumnFamily,
                           final ColumnFamilyHandle withTimestampColumnFamily) 
throws RocksDBException {
    final RocksIterator noTimestampsIter = 
db.newIterator(noTimestampColumnFamily);
    noTimestampsIter.seekToFirst();
    if (noTimestampsIter.isValid()) {
        log.info("Opening store {} in upgrade mode", name);
        dbAccessor = new DualColumnFamilyAccessor(noTimestampColumnFamily, 
withTimestampColumnFamily);
    } else {
        log.info("Opening store {} in regular mode", name);
        dbAccessor = new SingleColumnFamilyAccessor(withTimestampColumnFamily);
        noTimestampColumnFamily.close();
        db.dropColumnFamily(noTimestampColumnFamily); // try fix it
    }
    noTimestampsIter.close();
}{code}
 

 

 

{{But it's seems that you can't drop the default column family in RocksDb (see 
screenshot).}}

{{*So how can we have the real block-cache-capacity metrics value in Kafka 
Streams monitoring ?* }}



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to