Ver código fonte

Improve toString() on Releasables utils (#94626)

Today both `Releasables#wrap` implementations return a lambda which does
not render well in logs or exception messages. This commit improves
that. It also adds tests for these methods and moves the test suite to
the correct module.
David Turner 2 anos atrás
pai
commit
aef7dc0826

+ 23 - 2
libs/core/src/main/java/org/elasticsearch/core/Releasables.java

@@ -10,6 +10,7 @@ package org.elasticsearch.core;
 
 import java.io.IOException;
 import java.io.UncheckedIOException;
+import java.util.Arrays;
 import java.util.concurrent.atomic.AtomicReference;
 
 /** Utility methods to work with {@link Releasable}s. */
@@ -89,12 +90,32 @@ public enum Releasables {
      *  </pre>
      */
     public static Releasable wrap(final Iterable<Releasable> releasables) {
-        return () -> close(releasables);
+        return new Releasable() {
+            @Override
+            public void close() {
+                Releasables.close(releasables);
+            }
+
+            @Override
+            public String toString() {
+                return "wrapped[" + releasables + "]";
+            }
+        };
     }
 
     /** @see #wrap(Iterable) */
     public static Releasable wrap(final Releasable... releasables) {
-        return () -> close(releasables);
+        return new Releasable() {
+            @Override
+            public void close() {
+                Releasables.close(releasables);
+            }
+
+            @Override
+            public String toString() {
+                return "wrapped" + Arrays.toString(releasables);
+            }
+        };
     }
 
     /**

+ 38 - 4
server/src/test/java/org/elasticsearch/common/ReleasablesTests.java → libs/core/src/test/java/org/elasticsearch/core/ReleasablesTests.java

@@ -5,15 +5,14 @@
  * in compliance with, at your election, the Elastic License 2.0 or the Server
  * Side Public License, v 1.
  */
-package org.elasticsearch.common;
+package org.elasticsearch.core;
 
-import org.elasticsearch.core.Assertions;
-import org.elasticsearch.core.Releasable;
-import org.elasticsearch.core.Releasables;
 import org.elasticsearch.test.ESTestCase;
 import org.elasticsearch.test.ReachabilityChecker;
 
 import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
 public class ReleasablesTests extends ESTestCase {
@@ -74,4 +73,39 @@ public class ReleasablesTests extends ESTestCase {
                 .anyMatch(ste -> ste.toString().contains("CloserWithIdentifiableMethodNames.closeMethod1"))
         );
     }
+
+    public void testWrap() {
+        final var count = new AtomicInteger(0);
+        final Releasable releasable = new Releasable() {
+            @Override
+            public void close() {
+                count.incrementAndGet();
+            }
+
+            @Override
+            public String toString() {
+                return "increment count";
+            }
+        };
+
+        final var wrapVarArgs = Releasables.wrap(releasable, releasable);
+        assertEquals("wrapped[increment count, increment count]", wrapVarArgs.toString());
+        wrapVarArgs.close();
+        assertEquals(2, count.get());
+
+        final var wrapIterable = Releasables.wrap(new Iterable<>() {
+            @Override
+            public Iterator<Releasable> iterator() {
+                return List.of(releasable, releasable, releasable).iterator();
+            }
+
+            @Override
+            public String toString() {
+                return "list";
+            }
+        });
+        assertEquals("wrapped[list]", wrapIterable.toString());
+        wrapIterable.close();
+        assertEquals(5, count.get());
+    }
 }