This is an automated email from the ASF dual-hosted git repository.

lushiji pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new a3e3668fbd [cli] Fix: recover command doesn't accept rate limit 
parameter (#4535)
a3e3668fbd is described below

commit a3e3668fbd1c5bb024a3ce793867248546f9ad75
Author: Andrey Yegorov <[email protected]>
AuthorDate: Thu Feb 13 17:42:44 2025 -0800

    [cli] Fix: recover command doesn't accept rate limit parameter (#4535)
    
    * Fix: recover command didn't accept rate limit parameter
---
 .../org/apache/bookkeeper/bookie/BookieShell.java  |  2 +-
 .../apache/bookkeeper/bookie/BookieShellTest.java  | 97 +++++++++++++++-------
 2 files changed, 68 insertions(+), 31 deletions(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java
index 00869c7fc8..b969e143d2 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java
@@ -524,7 +524,7 @@ public class BookieShell implements Tool {
             opts.addOption("sk", "skipOpenLedgers", false, "Skip recovering 
open ledgers");
             opts.addOption("d", "deleteCookie", false, "Delete cookie node for 
the bookie.");
             opts.addOption("sku", "skipUnrecoverableLedgers", false, "Skip 
unrecoverable ledgers.");
-            opts.addOption("rate", "replicationRate", false, "Replication rate 
by bytes");
+            opts.addOption("rate", "replicationRate", true, "Replication rate 
by bytes");
         }
 
         @Override
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieShellTest.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieShellTest.java
index fce3ce8bb3..a802fc4f6c 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieShellTest.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieShellTest.java
@@ -21,6 +21,7 @@ package org.apache.bookkeeper.bookie;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
@@ -35,6 +36,8 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import com.google.common.collect.Maps;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.function.Function;
@@ -189,6 +192,14 @@ public class BookieShellTest {
         verify(admin, times(1)).close();
     }
 
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testRecoverLedgerWithRateLimit() throws Exception {
+        testRecoverCmdRecoverLedger(
+                12345, false, false, false,
+                "-force", "-l", "12345", "-rate", "10000", "127.0.0.1:3181");
+    }
+
     @Test
     public void testRecoverCmdRecoverLedgerDefault() throws Exception {
         // default behavior
@@ -235,21 +246,30 @@ public class BookieShellTest {
                                      boolean skipOpenLedgers,
                                      boolean removeCookies,
                                      String... args) throws Exception {
-        RecoverCmd cmd = (RecoverCmd) shell.commands.get("recover");
-        CommandLine cmdLine = parseCommandLine(cmd, args);
-        assertEquals(0, cmd.runCmd(cmdLine));
-        bookKeeperAdminMockedStatic.verify(() -> 
BookKeeperAdmin.newBookKeeperAdmin(any(ClientConfiguration.class)),
-                times(1));
-        verify(admin, times(1))
-            .recoverBookieData(eq(ledgerId), any(Set.class), eq(dryrun), 
eq(skipOpenLedgers));
-        verify(admin, times(1)).close();
-        if (removeCookies) {
-            
MetadataDrivers.runFunctionWithRegistrationManager(any(ServerConfiguration.class),
 any(Function.class));
-            verify(rm, times(1)).readCookie(any(BookieId.class));
-            verify(rm, times(1)).removeCookie(any(BookieId.class), 
eq(version));
-        } else {
-            verify(rm, times(0)).readCookie(any(BookieId.class));
-            verify(rm, times(0)).removeCookie(any(BookieId.class), 
eq(version));
+        final PrintStream oldPs = System.err;
+        try (ByteArrayOutputStream outContent = new ByteArrayOutputStream()) {
+            System.setErr(new PrintStream(outContent));
+
+            RecoverCmd cmd = (RecoverCmd) shell.commands.get("recover");
+            CommandLine cmdLine = parseCommandLine(cmd, args);
+            assertEquals(0, cmd.runCmd(cmdLine));
+            bookKeeperAdminMockedStatic.verify(() -> 
BookKeeperAdmin.newBookKeeperAdmin(any(ClientConfiguration.class)),
+                    times(1));
+            verify(admin, times(1))
+                .recoverBookieData(eq(ledgerId), any(Set.class), eq(dryrun), 
eq(skipOpenLedgers));
+            verify(admin, times(1)).close();
+            if (removeCookies) {
+                
MetadataDrivers.runFunctionWithRegistrationManager(any(ServerConfiguration.class),
 any(Function.class));
+                verify(rm, times(1)).readCookie(any(BookieId.class));
+                verify(rm, times(1)).removeCookie(any(BookieId.class), 
eq(version));
+            } else {
+                verify(rm, times(0)).readCookie(any(BookieId.class));
+                verify(rm, times(0)).removeCookie(any(BookieId.class), 
eq(version));
+            }
+            assertFalse("invalid value for option detected:\n" + outContent,
+                    outContent.toString().contains("invalid value for 
option"));
+        } finally {
+            System.setErr(oldPs);
         }
     }
 
@@ -261,6 +281,14 @@ public class BookieShellTest {
             "-force", "127.0.0.1:3181");
     }
 
+    @Test
+    public void testRecoverWithRateLimit() throws Exception {
+        // default behavior
+        testRecoverCmdRecover(
+                false, false, false, false,
+                "-force", "127.0.0.1:3181");
+    }
+
     @Test
     public void testRecoverCmdRecoverDeleteCookie() throws Exception {
         // dryrun
@@ -307,21 +335,30 @@ public class BookieShellTest {
                                boolean removeCookies,
                                boolean skipUnrecoverableLedgers,
                                String... args) throws Exception {
-        RecoverCmd cmd = (RecoverCmd) shell.commands.get("recover");
-        CommandLine cmdLine = parseCommandLine(cmd, args);
-        assertEquals(0, cmd.runCmd(cmdLine));
-        bookKeeperAdminMockedStatic.verify(() -> 
BookKeeperAdmin.newBookKeeperAdmin(any(ClientConfiguration.class)),
-                times(1));
-        verify(admin, times(1))
-            .recoverBookieData(any(Set.class), eq(dryrun), 
eq(skipOpenLedgers), eq(skipUnrecoverableLedgers));
-        verify(admin, times(1)).close();
-        if (removeCookies) {
-            
MetadataDrivers.runFunctionWithRegistrationManager(any(ServerConfiguration.class),
 any(Function.class));
-            verify(rm, times(1)).readCookie(any(BookieId.class));
-            verify(rm, times(1)).removeCookie(any(BookieId.class), 
eq(version));
-        } else {
-            verify(rm, times(0)).readCookie(any(BookieId.class));
-            verify(rm, times(0)).removeCookie(any(BookieId.class), 
eq(version));
+        final PrintStream oldPs = System.err;
+        try (ByteArrayOutputStream outContent = new ByteArrayOutputStream()) {
+            System.setErr(new PrintStream(outContent));
+
+            RecoverCmd cmd = (RecoverCmd) shell.commands.get("recover");
+            CommandLine cmdLine = parseCommandLine(cmd, args);
+            assertEquals(0, cmd.runCmd(cmdLine));
+            bookKeeperAdminMockedStatic.verify(() -> 
BookKeeperAdmin.newBookKeeperAdmin(any(ClientConfiguration.class)),
+                    times(1));
+            verify(admin, times(1))
+                .recoverBookieData(any(Set.class), eq(dryrun), 
eq(skipOpenLedgers), eq(skipUnrecoverableLedgers));
+            verify(admin, times(1)).close();
+            if (removeCookies) {
+                
MetadataDrivers.runFunctionWithRegistrationManager(any(ServerConfiguration.class),
 any(Function.class));
+                verify(rm, times(1)).readCookie(any(BookieId.class));
+                verify(rm, times(1)).removeCookie(any(BookieId.class), 
eq(version));
+            } else {
+                verify(rm, times(0)).readCookie(any(BookieId.class));
+                verify(rm, times(0)).removeCookie(any(BookieId.class), 
eq(version));
+            }
+            assertFalse("invalid value for option detected:\n" + outContent,
+                    outContent.toString().contains("invalid value for 
option"));
+        } finally {
+            System.setErr(oldPs);
         }
     }
 

Reply via email to