[ https://issues.apache.org/jira/browse/GEODE-8711?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17234732#comment-17234732 ]
ASF GitHub Bot commented on GEODE-8711: --------------------------------------- sabbey37 commented on a change in pull request #5749: URL: https://github.com/apache/geode/pull/5749#discussion_r526168133 ########## File path: geode-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/server/AbstractSlowlogIntegrationTest.java ########## @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.redis.internal.executor.server; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.Protocol; +import redis.clients.jedis.util.Slowlog; + +import org.apache.geode.test.awaitility.GeodeAwaitility; +import org.apache.geode.test.dunit.rules.RedisPortSupplier; + +public abstract class AbstractSlowlogIntegrationTest implements RedisPortSupplier { + + private Jedis jedis; + private static final int REDIS_CLIENT_TIMEOUT = + Math.toIntExact(GeodeAwaitility.getTimeout().toMillis()); + + @Before + public void setUp() { + jedis = new Jedis("localhost", getPort(), REDIS_CLIENT_TIMEOUT); + } + + @After + public void tearDown() { + jedis.close(); + } + + abstract int getExposedPort(); + + @Test + public void shouldReturnEmptyArray_whenGetSubcommandSpecified() { + List<Slowlog> actualResult = jedis.slowlogGet(); + + assertThat(actualResult.size()).isEqualTo(0); Review comment: We could use `assertThat(actualResult).isEmpty()` here (and for the ones below) . This might be preferable because if the result is not empty, the error message will display the contents of the array rather than just the length. Sorry I didn't notice this in the first review. ########## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/ParameterRequirements/SlowlogParameterRequirements.java ########## @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.redis.internal.ParameterRequirements; + +import static org.apache.geode.redis.internal.RedisConstants.ERROR_NOT_INTEGER; +import static org.apache.geode.redis.internal.RedisConstants.ERROR_UNKNOWN_SLOWLOG_SUBCOMMAND; + +import org.apache.geode.redis.internal.netty.Command; +import org.apache.geode.redis.internal.netty.ExecutionHandlerContext; + +public class SlowlogParameterRequirements implements ParameterRequirements { + @Override + public void checkParameters(Command command, ExecutionHandlerContext context) { + int numberOfArguments = command.getProcessedCommand().size(); + + if (numberOfArguments < 2) { + throw new RedisParametersMismatchException(command.wrongNumberOfArgumentsErrorMessage()); + } else if (numberOfArguments == 2) { + confirmKnownSubcommands(command); + } else if (numberOfArguments == 3) { + confirmArgumentsToGetSubcommand(command); + } else if (numberOfArguments > 3) { Review comment: I think LGTM is suggesting that this could just be an `else`, instead of an `else if` ########## File path: geode-redis/README.md ########## @@ -200,16 +200,16 @@ start server \ | | SINTER | CLUSTER INFO | | | SINTERSTORE | CLUSTER KEYSLOT | | | SISMEMBER | CLUSTER MEET | -| | SMOVE | CLUSTER MYID | -| | SPOP | CLUSTER NODES | -| | SRANDMEMBER | CLUSTER REPLICAS | -| | SSCAN | CLUSTER REPLICATE | -| | STRLEN | CLUSTER RESET | -| | SUNION | CLUSTER SAVECONFIG | -| | SUNIONSTORE | CLUSTER SET-CONFIG-EPOCH | -| | TIME | CLUSTER SETSLOT | -| | UNLINK [1] | CLUSTER SLAVES | -| | | CLUSTER SLOTS | +| | SLOWLOG | CLUSTER MYID | Review comment: Good call adding this to the README! We also need to add it to the list of unsupported commands in this file: `redis_api_for_geode.html.md.erb` ########## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/ParameterRequirements/SlowlogParameterRequirements.java ########## @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.redis.internal.ParameterRequirements; + +import static org.apache.geode.redis.internal.RedisConstants.ERROR_NOT_INTEGER; +import static org.apache.geode.redis.internal.RedisConstants.ERROR_UNKNOWN_SLOWLOG_SUBCOMMAND; + +import org.apache.geode.redis.internal.netty.Command; +import org.apache.geode.redis.internal.netty.ExecutionHandlerContext; + +public class SlowlogParameterRequirements implements ParameterRequirements { + @Override + public void checkParameters(Command command, ExecutionHandlerContext context) { + int numberOfArguments = command.getProcessedCommand().size(); + + if (numberOfArguments < 2) { + throw new RedisParametersMismatchException(command.wrongNumberOfArgumentsErrorMessage()); + } else if (numberOfArguments == 2) { + confirmKnownSubcommands(command); + } else if (numberOfArguments == 3) { + confirmArgumentsToGetSubcommand(command); + } else if (numberOfArguments > 3) { + throw new RedisParametersMismatchException( + String.format(ERROR_UNKNOWN_SLOWLOG_SUBCOMMAND, command.getStringKey())); + } + } + + private void confirmKnownSubcommands(Command command) { + if (!command.getStringKey().toLowerCase().equals("reset") && + !command.getStringKey().toLowerCase().equals("len") && + !command.getStringKey().toLowerCase().equals("get")) { + throw new RedisParametersMismatchException( + String.format(ERROR_UNKNOWN_SLOWLOG_SUBCOMMAND, command.getStringKey())); + } + } + + private void confirmArgumentsToGetSubcommand(Command command) { + if (!command.getStringKey().toLowerCase().equals("get")) { + throw new RedisParametersMismatchException( + String.format(ERROR_UNKNOWN_SLOWLOG_SUBCOMMAND, command.getStringKey())); + } + try { + Integer.parseInt(new String(command.getProcessedCommand().get(2))); Review comment: Looks like this is one of those situations where Redis uses a long instead of an integer. We could also add a test for this. ########## File path: geode-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/executor/server/SlowlogNativeRedisAcceptanceTest.java ########## @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.redis.internal.executor.server; + +import org.junit.ClassRule; + +import org.apache.geode.NativeRedisTestRule; + +public class SlowlogNativeRedisAcceptanceTest extends AbstractSlowlogIntegrationTest { + + @ClassRule + public static NativeRedisTestRule redis = new NativeRedisTestRule(); + + @Override + public int getPort() { + return redis.getPort(); + } + + @Override + int getExposedPort() { + return redis.getExposedPort(); + } Review comment: You can delete this since the method is never used. ########## File path: geode-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/server/AbstractSlowlogIntegrationTest.java ########## @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.redis.internal.executor.server; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.Protocol; +import redis.clients.jedis.util.Slowlog; + +import org.apache.geode.test.awaitility.GeodeAwaitility; +import org.apache.geode.test.dunit.rules.RedisPortSupplier; + +public abstract class AbstractSlowlogIntegrationTest implements RedisPortSupplier { + + private Jedis jedis; + private static final int REDIS_CLIENT_TIMEOUT = + Math.toIntExact(GeodeAwaitility.getTimeout().toMillis()); + + @Before + public void setUp() { + jedis = new Jedis("localhost", getPort(), REDIS_CLIENT_TIMEOUT); + } + + @After + public void tearDown() { + jedis.close(); + } + + abstract int getExposedPort(); Review comment: This method is never used. Sorry I didn't notice this in the first review. ########## File path: geode-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/server/SlowlogIntegrationTest.java ########## @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.redis.internal.executor.server; + +import static org.apache.geode.distributed.ConfigurationProperties.LOG_LEVEL; + +import org.junit.ClassRule; + +import org.apache.geode.redis.GeodeRedisServerRule; + +public class SlowlogIntegrationTest extends AbstractSlowlogIntegrationTest { + + @ClassRule + public static GeodeRedisServerRule server = new GeodeRedisServerRule() + .withProperty(LOG_LEVEL, "info"); + + @Override + public int getPort() { + return server.getPort(); + } + + @Override + public int getExposedPort() { + return getPort(); + } Review comment: You can delete this since the method is never used. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org > Enable SLOWLOG command to support Redis monitoring tools > -------------------------------------------------------- > > Key: GEODE-8711 > URL: https://issues.apache.org/jira/browse/GEODE-8711 > Project: Geode > Issue Type: Improvement > Components: redis > Affects Versions: 1.14.0 > Reporter: Raymond Ingles > Priority: Major > Labels: pull-request-available > > The Redis SLOWLOG command tracks slow-executing commands. This will implement > a placeholder to prevent errors in tools like Datadog or Redis Insights. -- This message was sent by Atlassian Jira (v8.3.4#803005)