[Broker] Other old values are still valid when updating resource group (#13543)

diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ResourceGroupsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ResourceGroupsBase.java
index 71fb6aa..1ce3aa5 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ResourceGroupsBase.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ResourceGroupsBase.java
@@ -63,10 +63,18 @@
             /*
              * assuming read-modify-write
              */
-            resourceGroup.setPublishRateInMsgs(rgConfig.getPublishRateInMsgs());
-            resourceGroup.setPublishRateInBytes(rgConfig.getPublishRateInBytes());
-            resourceGroup.setDispatchRateInMsgs(rgConfig.getDispatchRateInMsgs());
-            resourceGroup.setDispatchRateInBytes(rgConfig.getDispatchRateInBytes());
+            if (rgConfig.getPublishRateInMsgs() != null) {
+                resourceGroup.setPublishRateInMsgs(rgConfig.getPublishRateInMsgs());
+            }
+            if (rgConfig.getPublishRateInBytes() != null) {
+                resourceGroup.setPublishRateInBytes(rgConfig.getPublishRateInBytes());
+            }
+            if (rgConfig.getDispatchRateInMsgs() != null) {
+                resourceGroup.setDispatchRateInMsgs(rgConfig.getDispatchRateInMsgs());
+            }
+            if (rgConfig.getDispatchRateInBytes() != null) {
+                resourceGroup.setDispatchRateInBytes(rgConfig.getDispatchRateInBytes());
+            }
 
             // write back the new ResourceGroup config.
             resourceGroupResources().updateResourceGroup(rgName, r -> resourceGroup);
@@ -80,6 +88,14 @@
     }
 
     protected void internalCreateResourceGroup(String rgName, ResourceGroup rgConfig) {
+        rgConfig.setPublishRateInMsgs(rgConfig.getPublishRateInMsgs() == null
+                ? -1 : rgConfig.getPublishRateInMsgs());
+        rgConfig.setPublishRateInBytes(rgConfig.getPublishRateInBytes() == null
+                ? -1 : rgConfig.getPublishRateInBytes());
+        rgConfig.setDispatchRateInMsgs(rgConfig.getDispatchRateInMsgs() == null
+                ? -1 : rgConfig.getDispatchRateInMsgs());
+        rgConfig.setDispatchRateInBytes(rgConfig.getDispatchRateInBytes() == null
+                ? -1 : rgConfig.getDispatchRateInBytes());
         try {
             resourceGroupResources().createResourceGroup(rgName, rgConfig);
             log.info("[{}] Created ResourceGroup {}", clientAppId(), rgName);
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/resourcegroup/ResourceGroup.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/resourcegroup/ResourceGroup.java
index afd3bd5..79db7da 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/resourcegroup/ResourceGroup.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/resourcegroup/ResourceGroup.java
@@ -556,12 +556,16 @@
         int idx;
 
         idx = ResourceGroupMonitoringClass.Publish.ordinal();
-        this.monitoringClassFields[idx].configValuesPerPeriod.bytes = rgConfig.getPublishRateInBytes();
-        this.monitoringClassFields[idx].configValuesPerPeriod.messages = rgConfig.getPublishRateInMsgs();
+        this.monitoringClassFields[idx].configValuesPerPeriod.bytes = rgConfig.getPublishRateInBytes() == null
+                ? -1 : rgConfig.getPublishRateInBytes();
+        this.monitoringClassFields[idx].configValuesPerPeriod.messages = rgConfig.getPublishRateInMsgs() == null
+                ? -1 : rgConfig.getPublishRateInMsgs();
 
         idx = ResourceGroupMonitoringClass.Dispatch.ordinal();
-        this.monitoringClassFields[idx].configValuesPerPeriod.bytes = rgConfig.getDispatchRateInBytes();
-        this.monitoringClassFields[idx].configValuesPerPeriod.messages = rgConfig.getDispatchRateInMsgs();
+        this.monitoringClassFields[idx].configValuesPerPeriod.bytes = rgConfig.getDispatchRateInBytes() == null
+                ? -1 : rgConfig.getDispatchRateInBytes();
+        this.monitoringClassFields[idx].configValuesPerPeriod.messages = rgConfig.getDispatchRateInMsgs() == null
+                ? -1 : rgConfig.getDispatchRateInMsgs();
     }
 
     private void setDefaultResourceUsageTransportHandlers() {
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupPublishLimiter.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupPublishLimiter.java
index 2e48445..f2f6bcd 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupPublishLimiter.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupPublishLimiter.java
@@ -89,8 +89,10 @@
     public void update(ResourceGroup resourceGroup) {
         long publishRateInMsgs = 0, publishRateInBytes = 0;
         if (resourceGroup != null) {
-            publishRateInBytes = resourceGroup.getPublishRateInBytes();
-            publishRateInMsgs = resourceGroup.getPublishRateInMsgs();
+            publishRateInBytes = resourceGroup.getPublishRateInBytes() == null
+                    ? -1 : resourceGroup.getPublishRateInBytes();
+            publishRateInMsgs = resourceGroup.getPublishRateInMsgs() == null
+                    ? -1 : resourceGroup.getPublishRateInMsgs();
         }
 
         update(publishRateInMsgs, publishRateInBytes);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/ResourceGroupsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/ResourceGroupsTest.java
index 347b271..bdf1c3b 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/ResourceGroupsTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/ResourceGroupsTest.java
@@ -85,10 +85,10 @@
 
         // create resourcegroup with non default values.
         ResourceGroup testResourceGroupTwo = new ResourceGroup();
-        testResourceGroupTwo.setDispatchRateInBytes(10000);
+        testResourceGroupTwo.setDispatchRateInBytes(10000L);
         testResourceGroupTwo.setDispatchRateInMsgs(100);
         testResourceGroupTwo.setPublishRateInMsgs(100);
-        testResourceGroupTwo.setPublishRateInBytes(10000);
+        testResourceGroupTwo.setPublishRateInBytes(10000L);
 
         resourcegroups.createOrUpdateResourceGroup("test-resourcegroup-two", testResourceGroupTwo);
         expectedRgNames.add("test-resourcegroup-two");
@@ -104,9 +104,9 @@
         // update with some real values
         ResourceGroup testResourceGroupOneUpdate = new ResourceGroup();
         testResourceGroupOneUpdate.setDispatchRateInMsgs(50);
-        testResourceGroupOneUpdate.setDispatchRateInBytes(5000);
+        testResourceGroupOneUpdate.setDispatchRateInBytes(5000L);
         testResourceGroupOneUpdate.setPublishRateInMsgs(10);
-        testResourceGroupOneUpdate.setPublishRateInBytes(1000);
+        testResourceGroupOneUpdate.setPublishRateInBytes(1000L);
         resourcegroups.createOrUpdateResourceGroup("test-resourcegroup-one", testResourceGroupOneUpdate);
 
         // get a non existent resourcegroup
@@ -143,10 +143,10 @@
     public void testNamespaceResourceGroup() throws Exception {
         // create resourcegroup with non default values.
         ResourceGroup testResourceGroupTwo = new ResourceGroup();
-        testResourceGroupTwo.setDispatchRateInBytes(10000);
+        testResourceGroupTwo.setDispatchRateInBytes(10000L);
         testResourceGroupTwo.setDispatchRateInMsgs(100);
         testResourceGroupTwo.setPublishRateInMsgs(100);
-        testResourceGroupTwo.setPublishRateInBytes(10000);
+        testResourceGroupTwo.setPublishRateInBytes(10000L);
 
         resourcegroups.createOrUpdateResourceGroup("test-resourcegroup-three", testResourceGroupTwo);
         admin.namespaces().createNamespace(testNameSpace);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/RGUsageMTAggrWaitForAllMsgsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/RGUsageMTAggrWaitForAllMsgsTest.java
index 87b3d5a..386e8bf 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/RGUsageMTAggrWaitForAllMsgsTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/RGUsageMTAggrWaitForAllMsgsTest.java
@@ -902,9 +902,9 @@
         final int NumProducerMessages = NUM_MESSAGES_PER_PRODUCER * NUM_PRODUCERS;
         Assert.assertTrue(NUM_MESSAGES_PER_CONSUMER > 0 && NumConsumerMessages == NumProducerMessages);
 
-        rgConfig.setPublishRateInBytes(1500);
+        rgConfig.setPublishRateInBytes(1500L);
         rgConfig.setPublishRateInMsgs(100);
-        rgConfig.setDispatchRateInBytes(4000);
+        rgConfig.setDispatchRateInBytes(4000L);
         rgConfig.setDispatchRateInMsgs(500);
 
         // Set up the RG names; creation of RGs will be done elsewhere.
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupConfigListenerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupConfigListenerTest.java
index 8a85d4f..38cae32 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupConfigListenerTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupConfigListenerTest.java
@@ -109,6 +109,70 @@
     }
 
     @Test
+    public void testResourceGroupUpdatePart() throws Exception {
+        testAddRg = new ResourceGroup();
+        testAddRg.setPublishRateInBytes(1024 * 1024L);
+        createResourceGroup(rgName, testAddRg);
+        ResourceGroup resourceGroup = admin.resourcegroups().getResourceGroup(rgName);
+        assertEquals(resourceGroup.getPublishRateInBytes().longValue(), 1024 * 1024);
+        assertEquals(resourceGroup.getPublishRateInMsgs().intValue(), -1);
+        assertEquals(resourceGroup.getDispatchRateInBytes().longValue(), -1);
+        assertEquals(resourceGroup.getDispatchRateInMsgs().longValue(), -1);
+
+        // automatically set publishRateInMsgs to 200000 in updateResourceGroup()
+        testAddRg = new ResourceGroup();
+        updateResourceGroup(rgName, testAddRg);
+        resourceGroup = admin.resourcegroups().getResourceGroup(rgName);
+        assertEquals(resourceGroup.getPublishRateInBytes().longValue(), 1024 * 1024);
+        assertEquals(resourceGroup.getPublishRateInMsgs().intValue(), 200000);
+        assertEquals(resourceGroup.getDispatchRateInBytes().longValue(), -1);
+        assertEquals(resourceGroup.getDispatchRateInMsgs().intValue(), -1);
+
+        // manually set dispatchRateInBytes to 2*1024*1024
+        testAddRg = new ResourceGroup();
+        testAddRg.setDispatchRateInBytes(2 * 1024 * 1024L);
+        updateResourceGroup(rgName, testAddRg);
+        resourceGroup = admin.resourcegroups().getResourceGroup(rgName);
+        assertEquals(resourceGroup.getPublishRateInBytes().longValue(), 1024 * 1024);
+        assertEquals(resourceGroup.getPublishRateInMsgs().intValue(), 200000);
+        assertEquals(resourceGroup.getDispatchRateInBytes().longValue(), 2 * 1024 * 1024);
+        assertEquals(resourceGroup.getDispatchRateInMsgs().intValue(), -1);
+
+        // manually update dispatchRateInBytes to 3*1024*1024
+        testAddRg = new ResourceGroup();
+        testAddRg.setDispatchRateInBytes(3 * 1024 * 1024L);
+        updateResourceGroup(rgName, testAddRg);
+        resourceGroup = admin.resourcegroups().getResourceGroup(rgName);
+        assertEquals(resourceGroup.getPublishRateInBytes().longValue(), 1024 * 1024);
+        assertEquals(resourceGroup.getPublishRateInMsgs().intValue(), 200000);
+        assertEquals(resourceGroup.getDispatchRateInBytes().longValue(), 3 * 1024 * 1024);
+        assertEquals(resourceGroup.getDispatchRateInMsgs().intValue(), -1);
+
+        // manually update dispatchRateInBytes to 4*1024*1024 and set dispatchRateInMsgs to 400000
+        testAddRg = new ResourceGroup();
+        testAddRg.setDispatchRateInBytes(4 * 1024 * 1024L);
+        testAddRg.setDispatchRateInMsgs(400000);
+        updateResourceGroup(rgName, testAddRg);
+        resourceGroup = admin.resourcegroups().getResourceGroup(rgName);
+        assertEquals(resourceGroup.getPublishRateInBytes().longValue(), 1024 * 1024);
+        assertEquals(resourceGroup.getPublishRateInMsgs().intValue(), 200000);
+        assertEquals(resourceGroup.getDispatchRateInBytes().longValue(), 4 * 1024 * 1024);
+        assertEquals(resourceGroup.getDispatchRateInMsgs().intValue(), 400000);
+
+        // manually update dispatchRateInBytes to -1
+        testAddRg = new ResourceGroup();
+        testAddRg.setDispatchRateInBytes(-1L);
+        updateResourceGroup(rgName, testAddRg);
+        resourceGroup = admin.resourcegroups().getResourceGroup(rgName);
+        assertEquals(resourceGroup.getPublishRateInBytes().longValue(), 1024 * 1024);
+        assertEquals(resourceGroup.getPublishRateInMsgs().intValue(), 200000);
+        assertEquals(resourceGroup.getDispatchRateInBytes().longValue(), -1);
+        assertEquals(resourceGroup.getDispatchRateInMsgs().intValue(), 400000);
+
+        deleteResourceGroup(rgName);
+    }
+
+    @Test
     public void testResourceGroupCreateDeleteCreate() throws Exception {
         createResourceGroup(rgName, testAddRg);
         deleteResourceGroup(rgName);
@@ -143,10 +207,10 @@
 
         for (int i = 0; i < MAX_RGS; i++) {
             String rgName = String.format("testRg-%d", i);
-            testAddRg.setDispatchRateInBytes(random.nextInt());
-            testAddRg.setDispatchRateInMsgs(random.nextInt());
-            testAddRg.setPublishRateInBytes(random.nextInt());
-            testAddRg.setPublishRateInMsgs(random.nextInt());
+            testAddRg.setDispatchRateInBytes(Long.valueOf(random.nextInt()));
+            testAddRg.setDispatchRateInMsgs(Integer.valueOf(random.nextInt()));
+            testAddRg.setPublishRateInBytes(Long.valueOf(random.nextInt()));
+            testAddRg.setPublishRateInMsgs(Integer.valueOf(random.nextInt()));
 
             admin.resourcegroups().createResourceGroup(rgName, testAddRg);
         }
@@ -202,9 +266,9 @@
         );
         ResourceGroup rg = new ResourceGroup();
         rg.setPublishRateInMsgs(-1);
-        rg.setPublishRateInBytes(10);
+        rg.setPublishRateInBytes(10L);
         rg.setDispatchRateInMsgs(10);
-        rg.setDispatchRateInBytes(20);
+        rg.setDispatchRateInBytes(20L);
         createResourceGroup("myrg", rg);
 
         for (int i = 0; i < 100; i++) {
@@ -218,10 +282,10 @@
     private void prepareData() throws PulsarAdminException {
         admin.clusters().createCluster(clusterName, ClusterData.builder().serviceUrl(pulsar.getWebServiceAddress()).build());
 
-        testAddRg.setPublishRateInBytes(10000);
+        testAddRg.setPublishRateInBytes(10000L);
         testAddRg.setPublishRateInMsgs(100);
         testAddRg.setDispatchRateInMsgs(20000);
-        testAddRg.setDispatchRateInBytes(200);
+        testAddRg.setDispatchRateInBytes(200L);
 
     }
 }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupRateLimiterTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupRateLimiterTest.java
index 1887801..a12d551 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupRateLimiterTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupRateLimiterTest.java
@@ -148,9 +148,9 @@
     }
 
     private void prepareData() {
-        testAddRg.setPublishRateInBytes(MESSAGE_SIZE);
+        testAddRg.setPublishRateInBytes(Long.valueOf(MESSAGE_SIZE));
         testAddRg.setPublishRateInMsgs(1);
         testAddRg.setDispatchRateInMsgs(-1);
-        testAddRg.setDispatchRateInBytes(-1);
+        testAddRg.setDispatchRateInBytes(Long.valueOf(-1));
     }
 }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupServiceTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupServiceTest.java
index 4b84760..e0e3ec9 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupServiceTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupServiceTest.java
@@ -149,9 +149,9 @@
           new org.apache.pulsar.common.policies.data.ResourceGroup();
         final String rgName = "testRG";
         final String randomRgName = "Something";
-        rgConfig.setPublishRateInBytes(15000);
+        rgConfig.setPublishRateInBytes(15000L);
         rgConfig.setPublishRateInMsgs(100);
-        rgConfig.setDispatchRateInBytes(40000);
+        rgConfig.setDispatchRateInBytes(40000L);
         rgConfig.setDispatchRateInMsgs(500);
 
         int initialNumQuotaCalculations = numAnonymousQuotaCalculations;
@@ -179,11 +179,11 @@
 
         PerMonitoringClassFields monClassFields;
         monClassFields = retRG.monitoringClassFields[ResourceGroupMonitoringClass.Publish.ordinal()];
-        Assert.assertEquals(monClassFields.configValuesPerPeriod.bytes, rgConfig.getPublishRateInBytes());
-        Assert.assertEquals(monClassFields.configValuesPerPeriod.messages, rgConfig.getPublishRateInMsgs());
+        Assert.assertEquals(monClassFields.configValuesPerPeriod.bytes, rgConfig.getPublishRateInBytes().longValue());
+        Assert.assertEquals(monClassFields.configValuesPerPeriod.messages, rgConfig.getPublishRateInMsgs().intValue());
         monClassFields = retRG.monitoringClassFields[ResourceGroupMonitoringClass.Dispatch.ordinal()];
-        Assert.assertEquals(monClassFields.configValuesPerPeriod.bytes, rgConfig.getDispatchRateInBytes());
-        Assert.assertEquals(monClassFields.configValuesPerPeriod.messages, rgConfig.getDispatchRateInMsgs());
+        Assert.assertEquals(monClassFields.configValuesPerPeriod.bytes, rgConfig.getDispatchRateInBytes().longValue());
+        Assert.assertEquals(monClassFields.configValuesPerPeriod.messages, rgConfig.getDispatchRateInMsgs().intValue());
 
         Assert.assertThrows(PulsarAdminException.class, () -> rgs.resourceGroupDelete(randomRgName));
 
@@ -238,8 +238,8 @@
         int numQuotaCalcsDuringTest = numAnonymousQuotaCalculations - initialNumQuotaCalculations;
         if (numQuotaCalcsDuringTest == 0) {
             // Quota calculations were not done yet during this test; we expect to see the default "initial" setting.
-            Assert.assertEquals(publishQuota.messages, rgConfig.getPublishRateInMsgs());
-            Assert.assertEquals(publishQuota.bytes, rgConfig.getPublishRateInBytes());
+            Assert.assertEquals(publishQuota.messages, rgConfig.getPublishRateInMsgs().intValue());
+            Assert.assertEquals(publishQuota.bytes, rgConfig.getPublishRateInBytes().longValue());
         }
 
         // Calculate the quota synchronously to avoid waiting for a periodic call within ResourceGroupService.
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupUsageAggregationTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupUsageAggregationTest.java
index a2b3b21..c562e39 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupUsageAggregationTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupUsageAggregationTest.java
@@ -104,9 +104,9 @@
             }
         };
 
-        rgConfig.setPublishRateInBytes(1500);
+        rgConfig.setPublishRateInBytes(1500L);
         rgConfig.setPublishRateInMsgs(100);
-        rgConfig.setDispatchRateInBytes(4000);
+        rgConfig.setDispatchRateInBytes(4000L);
         rgConfig.setPublishRateInMsgs(500);
         rgs.resourceGroupCreate(activeRgName, rgConfig, ruP, ruC);
 
diff --git a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/policies/data/ResourceGroup.java b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/policies/data/ResourceGroup.java
index 78d695c..0bfc386 100644
--- a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/policies/data/ResourceGroup.java
+++ b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/policies/data/ResourceGroup.java
@@ -22,8 +22,8 @@
 
 @Data
 public class ResourceGroup {
-    private int publishRateInMsgs = -1;
-    private long publishRateInBytes = -1;
-    private int dispatchRateInMsgs = -1;
-    private long dispatchRateInBytes = -1;
+    private Integer publishRateInMsgs;
+    private Long publishRateInBytes;
+    private Integer dispatchRateInMsgs;
+    private Long dispatchRateInBytes;
 }
diff --git a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdResourceGroups.java b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdResourceGroups.java
index 8d5fa97..afc9fc1 100644
--- a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdResourceGroups.java
+++ b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdResourceGroups.java
@@ -55,23 +55,23 @@
         @Parameter(names = { "--msg-publish-rate",
                 "-mp" }, description = "message-publish-rate "
                 + "(default -1 will be overwrite if not passed)", required = false)
-        private int publishRateInMsgs = -1;
+        private Integer publishRateInMsgs;
 
         @Parameter(names = { "--byte-publish-rate",
                 "-bp" }, description = "byte-publish-rate "
                 + "(default -1 will be overwrite if not passed)", required = false)
-        private long publishRateInBytes = -1;
+        private Long publishRateInBytes;
 
 
         @Parameter(names = { "--msg-dispatch-rate",
                 "-md" }, description = "message-dispatch-rate "
                 + "(default -1 will be overwrite if not passed)", required = false)
-        private int dispatchRateInMsgs = -1;
+        private Integer dispatchRateInMsgs;
 
         @Parameter(names = { "--byte-dispatch-rate",
                 "-bd" }, description = "byte-dispatch-rate "
                 + "(default -1 will be overwrite if not passed)", required = false)
-        private long dispatchRateInBytes = -1;
+        private Long dispatchRateInBytes;
 
         @Override
         void run() throws PulsarAdminException {
@@ -92,25 +92,21 @@
         private java.util.List<String> params;
 
         @Parameter(names = { "--msg-publish-rate",
-                "-mp" }, description = "message-publish-rate "
-                + "(default -1 will be overwrite if not passed)", required = false)
-        private int publishRateInMsgs = -1;
+                "-mp" }, description = "message-publish-rate ", required = false)
+        private Integer publishRateInMsgs;
 
         @Parameter(names = { "--byte-publish-rate",
-                "-bp" }, description = "byte-publish-rate "
-                + "(default -1 will be overwrite if not passed)", required = false)
-        private long publishRateInBytes = -1;
+                "-bp" }, description = "byte-publish-rate ", required = false)
+        private Long publishRateInBytes;
 
 
         @Parameter(names = { "--msg-dispatch-rate",
-                "-md" }, description = "message-dispatch-rate "
-                + "(default -1 will be overwrite if not passed)", required = false)
-        private int dispatchRateInMsgs = -1;
+                "-md" }, description = "message-dispatch-rate ", required = false)
+        private Integer dispatchRateInMsgs;
 
         @Parameter(names = { "--byte-dispatch-rate",
-                "-bd" }, description = "byte-dispatch-rate "
-                + "(default -1 will be overwrite if not passed)", required = false)
-        private long dispatchRateInBytes = -1;
+                "-bd" }, description = "byte-dispatch-rate ", required = false)
+        private Long dispatchRateInBytes;
 
         @Override
         void run() throws PulsarAdminException {