Fix issue #5728 - resource leak error when executing multiple contains operation of RSet in transaction

Signed-off-by: wynn5a <winminy@163.com>
pull/5771/head
wynn5a 1 year ago
parent 0bbf5292e3
commit 6aa8dcb079

@ -1,20 +1,9 @@
package org.redisson;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import io.netty.util.ResourceLeakDetector;
import mockit.Invocation;
import mockit.Mock;
import mockit.MockUp;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.redisson.RedisRunner.FailedToStartRedisException;
@ -27,6 +16,15 @@ import org.redisson.api.TransactionOptions;
import org.redisson.client.codec.IntegerCodec;
import org.redisson.client.codec.StringCodec;
import java.io.Serializable;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
public class RedissonSetTest extends RedisDockerTest {
public static class SimpleBean implements Serializable {
@ -902,19 +900,30 @@ public class RedissonSetTest extends RedisDockerTest {
@Test
public void testAddAndContainsInTransactionShouldNotShowResourceLeak() {
int arbitraryElementsCount = 1000;
new MockUp<ResourceLeakDetector<?>>() {
@Mock
void reportTracedLeak(Invocation invocation, String resourceType, String records) {
invocation.proceed();
Assertions.fail();
}
@Mock
void reportUntracedLeak(Invocation invocation, String resourceType) {
invocation.proceed();
Assertions.fail();
}
};
RTransaction tx = redisson.createTransaction(TransactionOptions.defaults());
RSet<Integer> testSet = tx.getSet("testSet");
// Should check the log when we run this test and see if there is any resource leak error
assertThatNoException().isThrownBy(()->{
for (int index = 0; index < arbitraryElementsCount; index++) {
for (int index = 0; index < 1000; index++) {
testSet.add(index);
if (testSet.contains(index)) {
System.out.println("Element " + index + " is in the set");
// do nothing
}
}
});
tx.commit();
}
}

Loading…
Cancel
Save