You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tubemq.apache.org by yu...@apache.org on 2021/01/11 02:18:06 UTC

[incubator-tubemq] branch master updated: [TUBEMQ-500] Add setting operate API (#389)

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

yuanbo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-tubemq.git


The following commit(s) were added to refs/heads/master by this push:
     new 0b3581a  [TUBEMQ-500] Add setting operate API (#389)
0b3581a is described below

commit 0b3581a740f47abce7e91489c99d12b03b95cece
Author: gosonzhang <46...@qq.com>
AuthorDate: Mon Jan 11 10:17:54 2021 +0800

    [TUBEMQ-500] Add setting operate API (#389)
    
    Co-authored-by: gosonzhang <go...@tencent.com>
---
 .../tubemq/client/producer/AllowedSetting.java     |  61 ++++++++
 .../org/apache/tubemq/corebase/TBaseConstants.java |   1 +
 .../apache/tubemq/corebase/utils/MixedUtils.java   |   9 --
 .../tubemq/corebase/utils/SettingValidUtils.java   |  39 +++++
 .../tubemq/server/common/fielddef/WebFieldDef.java |  14 +-
 .../server/common/utils/WebParameterUtils.java     | 165 ++++++++++++++-------
 .../bdbentitys/BdbClusterSettingEntity.java        |  17 +--
 .../nodemanage/nodebroker/BrokerConfManager.java   |  62 ++------
 .../master/web/handler/WebMasterInfoHandler.java   | 119 ++++++++++++++-
 9 files changed, 353 insertions(+), 134 deletions(-)

diff --git a/tubemq-client/src/main/java/org/apache/tubemq/client/producer/AllowedSetting.java b/tubemq-client/src/main/java/org/apache/tubemq/client/producer/AllowedSetting.java
new file mode 100644
index 0000000..cabf928
--- /dev/null
+++ b/tubemq-client/src/main/java/org/apache/tubemq/client/producer/AllowedSetting.java
@@ -0,0 +1,61 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.tubemq.client.producer;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.tubemq.corebase.TBaseConstants;
+import org.apache.tubemq.corebase.protobuf.generated.ClientMaster;
+import org.apache.tubemq.corebase.utils.SettingValidUtils;
+
+/**
+ * The class class caches the dynamic settings
+ *  returned from the server.
+ */
+public class AllowedSetting {
+    private AtomicLong configId =
+            new AtomicLong(TBaseConstants.META_VALUE_UNDEFINED);
+    private AtomicInteger maxMsgSize =
+            new AtomicInteger(TBaseConstants.META_MAX_MESSAGE_DATA_SIZE);
+
+    public AllowedSetting() {
+
+    }
+
+    // set master returned configure
+    public void updAllowedSetting(ClientMaster.ApprovedClientConfig allowedConfig) {
+        if (allowedConfig != null) {
+            if (configId.get() != allowedConfig.getConfigId()) {
+                configId.set(allowedConfig.getConfigId());
+            }
+            if (allowedConfig.hasMaxMsgSize()
+                    && allowedConfig.getMaxMsgSize() != maxMsgSize.get()) {
+                maxMsgSize.set(
+                        SettingValidUtils.validAndGetMaxMsgSize(allowedConfig.getMaxMsgSize()));
+            }
+        }
+    }
+
+    public long getConfigId() {
+        return configId.get();
+    }
+
+    public int getMaxMsgSize() {
+        return maxMsgSize.get();
+    }
+}
diff --git a/tubemq-core/src/main/java/org/apache/tubemq/corebase/TBaseConstants.java b/tubemq-core/src/main/java/org/apache/tubemq/corebase/TBaseConstants.java
index 2f1be7a..d91b083 100644
--- a/tubemq-core/src/main/java/org/apache/tubemq/corebase/TBaseConstants.java
+++ b/tubemq-core/src/main/java/org/apache/tubemq/corebase/TBaseConstants.java
@@ -31,6 +31,7 @@ public class TBaseConstants {
     public static final int META_MAX_MSGTYPE_LENGTH = 255;
     public static final int META_MAX_MESSAGE_HEADER_SIZE = 1024;
     public static final int META_MAX_MESSAGE_DATA_SIZE = 1024 * 1024;
+    public static final int META_MAX_MESSAGE_DATA_SIZE_UPPER_LIMIT = 20 * 1024 * 1024;
     public static final int META_MAX_PARTITION_COUNT = 100;
     public static final int META_MAX_BROKER_IP_LENGTH = 32;
     public static final int META_MAX_USERNAME_LENGTH = 64;
diff --git a/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MixedUtils.java b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MixedUtils.java
index bcd0738..bfbedad 100644
--- a/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MixedUtils.java
+++ b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MixedUtils.java
@@ -92,13 +92,4 @@ public class MixedUtils {
         dataBuffer.flip();
         return dataBuffer.array();
     }
-
-    // get the middle data between min, max, and data
-    public static int mid(int data, int min, int max) {
-        return Math.max(min, Math.min(max, data));
-    }
-
-    public static long mid(long data, long min, long max) {
-        return Math.max(min, Math.min(max, data));
-    }
 }
diff --git a/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/SettingValidUtils.java b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/SettingValidUtils.java
new file mode 100644
index 0000000..4a206ef
--- /dev/null
+++ b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/SettingValidUtils.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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.tubemq.corebase.utils;
+
+import org.apache.tubemq.corebase.TBaseConstants;
+
+
+public class SettingValidUtils {
+
+    // get the middle data between min, max, and data
+    public static int mid(int data, int min, int max) {
+        return Math.max(min, Math.min(max, data));
+    }
+
+    public static long mid(long data, long min, long max) {
+        return Math.max(min, Math.min(max, data));
+    }
+
+    public static int validAndGetMaxMsgSize(int inMaxMsgSize) {
+        return mid(inMaxMsgSize,
+            TBaseConstants.META_MAX_MESSAGE_DATA_SIZE,
+            TBaseConstants.META_MAX_MESSAGE_DATA_SIZE_UPPER_LIMIT);
+    }
+}
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java b/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java
index a65a223..05688a7 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java
@@ -84,7 +84,19 @@ public enum WebFieldDef {
     OFFSETJSON(21, "offsetJsonInfo", "offsetInfo",
             WebFieldType.JSONTYPE, "The offset info that needs to be added or modified"),
     ONLYMEM(22, "onlyMemory", "onlyMem", WebFieldType.BOOLEAN,
-            "Only clear the offset data in the memory cache, default is false");
+            "Only clear the offset data in the memory cache, default is false"),
+    ADMINAUTHTOKEN(23, "confModAuthToken", "authToken", WebFieldType.STRING,
+            "Admin api operation authorization code",
+            TServerConstants.CFG_MODAUTHTOKEN_MAX_LENGTH),
+    MAXMSGSIZE(24, "maxMsgSize", "maxMsgSize", WebFieldType.INT,
+            "Max allowed message size", RegexDef.TMP_NUMBER),
+    CREATEDATE(25, "createDate", "cDate", WebFieldType.STRING,
+            "Record creation date", TBaseConstants.META_MAX_DATEVALUE_LENGTH),
+    MODIFYDATE(26, "modifyDate", "mDate", WebFieldType.STRING,
+            "Record modification date", TBaseConstants.META_MAX_DATEVALUE_LENGTH);
+
+
+
 
 
 
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/WebParameterUtils.java b/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/WebParameterUtils.java
index f309ab7..385fe22 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/WebParameterUtils.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/WebParameterUtils.java
@@ -246,6 +246,10 @@ public class WebParameterUtils {
         return strBuffer.append("{\"result\":true,\"errCode\":0,\"errMsg\":\"OK\"}");
     }
 
+    public static StringBuilder buildSuccessResult(StringBuilder strBuffer, String appendInfo) {
+        return strBuffer.append("{\"result\":true,\"errCode\":0,\"errMsg\":\"").
+                append(appendInfo).append("\"}");
+    }
     /**
      * Parse the parameter value from an object value to a long value
      *
@@ -273,10 +277,9 @@ public class WebParameterUtils {
             long paramIntVal = Long.parseLong(paramValue);
             result.setSuccResult(paramIntVal);
         } catch (Throwable e) {
-            result.setFailResult(400,
-                    new StringBuilder(512).append("Parameter ")
-                            .append(fieldDef.name).append(" parse error: ")
-                            .append(e.getMessage()).toString());
+            result.setFailResult(new StringBuilder(512)
+                    .append("Parameter ").append(fieldDef.name)
+                    .append(" parse error: ").append(e.getMessage()).toString());
         }
         return result.success;
     }
@@ -429,10 +432,9 @@ public class WebParameterUtils {
         // Check if the parameter exists
         if (TStringUtils.isBlank(paramValue)) {
             if (required) {
-                result.setFailResult(fieldDef.id,
-                        new StringBuilder(512).append("Parameter ")
-                                .append(fieldDef.name)
-                                .append(" is missing or value is null or blank!").toString());
+                result.setFailResult(new StringBuilder(512)
+                        .append("Parameter ").append(fieldDef.name)
+                        .append(" is missing or value is null or blank!").toString());
             } else {
                 procStringDefValue(fieldDef.isCompFieldType(), defValue, result);
             }
@@ -455,10 +457,9 @@ public class WebParameterUtils {
             // check if is empty result
             if (valItemSet.isEmpty()) {
                 if (required) {
-                    result.setFailResult(fieldDef.id,
-                            new StringBuilder(512).append("Parameter ")
-                                    .append(fieldDef.name)
-                                    .append(" is missing or value is null or blank!").toString());
+                    result.setFailResult(new StringBuilder(512)
+                            .append("Parameter ").append(fieldDef.name)
+                            .append(" is missing or value is null or blank!").toString());
                 } else {
                     procStringDefValue(fieldDef.isCompFieldType(), defValue, result);
                 }
@@ -467,11 +468,10 @@ public class WebParameterUtils {
             // check max item count
             if (fieldDef.itemMaxCnt != TBaseConstants.META_VALUE_UNDEFINED) {
                 if (valItemSet.size() > fieldDef.itemMaxCnt) {
-                    result.setFailResult(fieldDef.id,
-                            new StringBuilder(512).append("Parameter ")
-                                    .append(fieldDef.name)
-                                    .append("'s item count over max allowed count (")
-                                    .append(fieldDef.itemMaxCnt).append(")!").toString());
+                    result.setFailResult(new StringBuilder(512)
+                            .append("Parameter ").append(fieldDef.name)
+                            .append("'s item count over max allowed count (")
+                            .append(fieldDef.itemMaxCnt).append(")!").toString());
                 }
             }
             result.setSuccResult(valItemSet);
@@ -511,10 +511,9 @@ public class WebParameterUtils {
         // Check if the parameter exists
         if (TStringUtils.isBlank(paramValue)) {
             if (required) {
-                result.setFailResult(fieldDef.id,
-                        new StringBuilder(512).append("Parameter ")
-                                .append(fieldDef.name)
-                                .append(" is missing or value is null or blank!").toString());
+                result.setFailResult(new StringBuilder(512)
+                        .append("Parameter ").append(fieldDef.name)
+                        .append(" is missing or value is null or blank!").toString());
             } else {
                 result.setSuccResult(defValue);
             }
@@ -524,18 +523,15 @@ public class WebParameterUtils {
             paramValue = URLDecoder.decode(paramValue,
                     TBaseConstants.META_DEFAULT_CHARSET_NAME);
         } catch (UnsupportedEncodingException e) {
-            result.setFailResult(fieldDef.id,
-                    new StringBuilder(512).append("Parameter ")
-                            .append(fieldDef.name)
-                            .append(" decode error, exception is ")
-                            .append(e.toString()).toString());
+            result.setFailResult(new StringBuilder(512)
+                    .append("Parameter ").append(fieldDef.name)
+                    .append(" decode error, exception is ")
+                    .append(e.toString()).toString());
         }
         if (TStringUtils.isBlank(paramValue)) {
             if (required) {
-                result.setFailResult(fieldDef.id,
-                        new StringBuilder(512).append("Parameter ")
-                                .append(fieldDef.name)
-                                .append("'s value is blank!").toString());
+                result.setFailResult(new StringBuilder(512).append("Parameter ")
+                        .append(fieldDef.name).append("'s value is blank!").toString());
             } else {
                 result.setSuccResult(defValue);
             }
@@ -543,11 +539,10 @@ public class WebParameterUtils {
         }
         if (fieldDef.valMaxLen != TBaseConstants.META_VALUE_UNDEFINED) {
             if (paramValue.length() > fieldDef.valMaxLen) {
-                result.setFailResult(fieldDef.id,
-                        new StringBuilder(512).append("Parameter ")
-                                .append(fieldDef.name)
-                                .append("'s length over max allowed length (")
-                                .append(fieldDef.valMaxLen).append(")!").toString());
+                result.setFailResult(new StringBuilder(512)
+                        .append("Parameter ").append(fieldDef.name)
+                        .append("'s length over max allowed length (")
+                        .append(fieldDef.valMaxLen).append(")!").toString());
                 return result.success;
             }
         }
@@ -557,11 +552,71 @@ public class WebParameterUtils {
                     new TypeToken<Map<String, Long>>(){}.getType());
             result.setSuccResult(manOffsets);
         } catch (Throwable e) {
-            result.setFailResult(fieldDef.id,
-                    new StringBuilder(512).append("Parameter ")
-                            .append(fieldDef.name)
-                            .append(" value parse failure, error is ")
-                            .append(e.getMessage()).append("!").toString());
+            result.setFailResult(new StringBuilder(512)
+                    .append("Parameter ").append(fieldDef.name)
+                    .append(" value parse failure, error is ")
+                    .append(e.getMessage()).append("!").toString());
+        }
+        return result.success;
+    }
+
+    /**
+     * Parse the parameter value from an string value to Date value
+     *
+     * @param req         Http Servlet Request
+     * @param fieldDef    the parameter field definition
+     * @param required    a boolean value represent whether the parameter is must required
+     * @param defValue    a default value returned if failed to parse value from the given object
+     * @param result      process result
+     * @return valid result for the parameter value
+     */
+    public static boolean getDateParameter(HttpServletRequest req,
+                                           WebFieldDef fieldDef,
+                                           boolean required,
+                                           Date defValue,
+                                           ProcessResult result) {
+        if (!getStringParamValue(req, fieldDef, required, null, result)) {
+            return result.success;
+        }
+        String paramValue = (String) result.retData1;
+        if (paramValue == null) {
+            result.setSuccResult(defValue);
+            return result.success;
+        }
+        try {
+            DateFormat sdf = new SimpleDateFormat(TBaseConstants.META_TMP_DATE_VALUE);
+            Date date = sdf.parse(paramValue);
+            result.setSuccResult(date);
+        } catch (Throwable e) {
+            result.setFailResult(new StringBuilder(512)
+                    .append("Parameter ").append(fieldDef.name)
+                    .append(" parse error: ").append(e.getMessage()).toString());
+        }
+        return result.success;
+    }
+
+    /**
+     * Valid execution authorization info
+     * @param req        Http Servlet Request
+     * @param fieldDef   the parameter field definition
+     * @param required   a boolean value represent whether the parameter is must required
+     * @param master     current master object
+     * @param result     process result
+     * @return valid result for the parameter value
+     */
+    public static boolean validReqAuthorizeInfo(HttpServletRequest req,
+                                                WebFieldDef fieldDef,
+                                                boolean required,
+                                                TMaster master,
+                                                ProcessResult result) {
+        if (!getStringParamValue(req, fieldDef, required, null, result)) {
+            return result.success;
+        }
+        String paramValue = (String) result.retData1;
+        if (paramValue != null) {
+            if (!paramValue.equals(master.getMasterConfig().getConfModAuthToken())) {
+                result.setFailResult("Illegal access, unauthorized request!");
+            }
         }
         return result.success;
     }
@@ -608,20 +663,20 @@ public class WebParameterUtils {
         // check value's max length
         if (fieldDef.valMaxLen != TBaseConstants.META_VALUE_UNDEFINED) {
             if (paramVal.length() > fieldDef.valMaxLen) {
-                result.setFailResult(fieldDef.id,
-                        new StringBuilder(512).append("over max length for ")
-                                .append(fieldDef.name).append(", only allow ")
-                                .append(fieldDef.valMaxLen).append(" length").toString());
+                result.setFailResult(new StringBuilder(512)
+                        .append("over max length for ").append(fieldDef.name)
+                        .append(", only allow ").append(fieldDef.valMaxLen)
+                        .append(" length").toString());
                 return false;
             }
         }
         // check value's pattern
         if (fieldDef.regexCheck) {
             if (!paramVal.matches(fieldDef.regexDef.getPattern())) {
-                result.setFailResult(fieldDef.id,
-                        new StringBuilder(512).append("illegal value for ")
-                                .append(fieldDef.name).append(", value ")
-                                .append(fieldDef.regexDef.getErrMsgTemp()).toString());
+                result.setFailResult(new StringBuilder(512)
+                        .append("illegal value for ").append(fieldDef.name)
+                        .append(", value ").append(fieldDef.regexDef.getErrMsgTemp())
+                        .toString());
                 return false;
             }
         }
@@ -647,18 +702,16 @@ public class WebParameterUtils {
         try {
             int paramIntVal = Integer.parseInt(paramValue);
             if (hasMinVal && paramIntVal < minValue) {
-                result.setFailResult(400,
-                        new StringBuilder(512).append("Parameter ")
-                                .append(fieldDef.name).append(" value must >= ")
-                                .append(minValue).toString());
+                result.setFailResult(new StringBuilder(512)
+                        .append("Parameter ").append(fieldDef.name)
+                        .append(" value must >= ").append(minValue).toString());
                 return false;
             }
             result.setSuccResult(paramIntVal);
         } catch (Throwable e) {
-            result.setFailResult(400,
-                    new StringBuilder(512).append("Parameter ")
-                            .append(fieldDef.name).append(" parse error: ")
-                            .append(e.getMessage()).toString());
+            result.setFailResult(new StringBuilder(512)
+                    .append("Parameter ").append(fieldDef.name)
+                    .append(" parse error: ").append(e.getMessage()).toString());
             return false;
         }
         return true;
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/master/bdbstore/bdbentitys/BdbClusterSettingEntity.java b/tubemq-server/src/main/java/org/apache/tubemq/server/master/bdbstore/bdbentitys/BdbClusterSettingEntity.java
index ca6e1b4..588fd87 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/master/bdbstore/bdbentitys/BdbClusterSettingEntity.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/master/bdbstore/bdbentitys/BdbClusterSettingEntity.java
@@ -33,7 +33,7 @@ import org.apache.tubemq.server.common.utils.WebParameterUtils;
 @Entity
 public class BdbClusterSettingEntity implements Serializable {
 
-    private static final long serialVersionUID = -3259439355290322115L;
+    private static final long serialVersionUID = 3259439355290322115L;
 
     @PrimaryKey
     private String recordKey = "";
@@ -62,7 +62,7 @@ public class BdbClusterSettingEntity implements Serializable {
     private String deleteWhen = "";              //delete policy execute time
     private int qryPriorityId = TBaseConstants.META_VALUE_UNDEFINED;
     private int maxMsgSize = TBaseConstants.META_VALUE_UNDEFINED;
-    private String attributes;               //extra attribute
+    private String attributes = "";             //extra attribute
     private String modifyUser;               //modify user
     private Date modifyDate;                 //modify date
 
@@ -235,22 +235,19 @@ public class BdbClusterSettingEntity implements Serializable {
         this.attributes = attributes;
     }
 
-    public String getModifyUser() {
-        return modifyUser;
+    public void setModifyInfo(String modifyUser, Date modifyDate) {
+        this.modifyUser = modifyUser;
+        this.modifyDate = modifyDate;
     }
 
-    public void setModifyUser(String modifyUser) {
-        this.modifyUser = modifyUser;
+    public String getModifyUser() {
+        return modifyUser;
     }
 
     public Date getModifyDate() {
         return modifyDate;
     }
 
-    public void setModifyDate(Date modifyDate) {
-        this.modifyDate = modifyDate;
-    }
-
     /**
      * Serialize field to json format
      *
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/master/nodemanage/nodebroker/BrokerConfManager.java b/tubemq-server/src/main/java/org/apache/tubemq/server/master/nodemanage/nodebroker/BrokerConfManager.java
index 86a6bc4..3eae7dc 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/master/nodemanage/nodebroker/BrokerConfManager.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/master/nodemanage/nodebroker/BrokerConfManager.java
@@ -2020,64 +2020,27 @@ public class BrokerConfManager implements Server {
     // /////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     /**
-     * Add cluster default setting
+     * Add or update cluster default setting
      *
      * @param bdbEntity the cluster default setting entity will be add
      * @return true if success otherwise false
      * @throws Exception
      */
-    public boolean confAddBdbClusterDefSetting(BdbClusterSettingEntity bdbEntity)
+    public boolean confSetBdbClusterDefSetting(BdbClusterSettingEntity bdbEntity)
             throws Exception {
         validMasterStatus();
-        BdbClusterSettingEntity curEntity =
-                clusterSettingMap.get(bdbEntity.getRecordKey());
-        if (curEntity != null) {
-            throw new Exception(new StringBuilder(512)
-                    .append("Duplicate add ClusterSetting info, exist record is: ")
-                    .append(curEntity).toString());
-        }
-        boolean putResult =
+        bdbEntity.setRecordKey(TServerConstants.TOKEN_DEFAULT_CLUSTER_SETTING);
+        boolean result =
                 mBdbStoreManagerService.putBdbClusterConfEntity(bdbEntity, true);
-        if (putResult) {
-            clusterSettingMap.put(bdbEntity.getRecordKey(), bdbEntity);
-            logger.info(new StringBuilder(512)
-                    .append("[ClusterSetting Success] ")
-                    .append(bdbEntity).toString());
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * update cluster default setting
-     *
-     * @param bdbEntity the cluster setting entity will be set
-     * @return true if success otherwise false
-     * @throws Exception
-     */
-    public boolean confUpdBdbClusterSetting(BdbClusterSettingEntity bdbEntity)
-            throws Exception {
-        validMasterStatus();
+        clusterSettingMap.put(TServerConstants.TOKEN_DEFAULT_CLUSTER_SETTING, bdbEntity);
         StringBuilder strBuffer = new StringBuilder(512);
-        BdbClusterSettingEntity curDefSettingEntity =
-                clusterSettingMap.get(bdbEntity.getRecordKey());
-        if (curDefSettingEntity == null) {
-            throw new Exception(strBuffer
-                    .append("Update ClusterSetting failure, not exist record for record: ")
-                    .append(bdbEntity.getRecordKey()).toString());
-        }
-        boolean putResult =
-                mBdbStoreManagerService.putBdbClusterConfEntity(bdbEntity, false);
-        if (putResult) {
-            clusterSettingMap.put(bdbEntity.getRecordKey(), bdbEntity);
-            strBuffer.append("[confUpdBdbClusterSetting Success] record from : ");
-            strBuffer = curDefSettingEntity.toJsonString(strBuffer);
-            strBuffer.append(" to : ");
-            strBuffer = bdbEntity.toJsonString(strBuffer);
-            logger.info(strBuffer.toString());
-            return true;
+        if (result) {
+            strBuffer.append("[confSetBdbClusterDefSetting  Success], add new record :");
+        } else {
+            strBuffer.append("[confSetBdbClusterDefSetting  Success], update old record :");
         }
-        return false;
+        logger.info(bdbEntity.toJsonString(strBuffer).toString());
+        return true;
     }
 
     /**
@@ -2107,12 +2070,9 @@ public class BrokerConfManager implements Server {
         return this.clusterSettingMap.get(TServerConstants.TOKEN_DEFAULT_CLUSTER_SETTING);
     }
 
-
     private void validMasterStatus() throws Exception {
         if (!isSelfMaster()) {
             throw new StandbyException("Please send your request to the master Node.");
         }
     }
-
-
 }
diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/handler/WebMasterInfoHandler.java b/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/handler/WebMasterInfoHandler.java
index 98cd36c..9afe1aa 100644
--- a/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/handler/WebMasterInfoHandler.java
+++ b/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/handler/WebMasterInfoHandler.java
@@ -17,10 +17,16 @@
 
 package org.apache.tubemq.server.master.web.handler;
 
+import java.util.Date;
 import java.util.List;
 import javax.servlet.http.HttpServletRequest;
+import org.apache.tubemq.corebase.TBaseConstants;
+import org.apache.tubemq.corebase.utils.SettingValidUtils;
+import org.apache.tubemq.server.common.fielddef.WebFieldDef;
+import org.apache.tubemq.server.common.utils.ProcessResult;
 import org.apache.tubemq.server.common.utils.WebParameterUtils;
 import org.apache.tubemq.server.master.TMaster;
+import org.apache.tubemq.server.master.bdbstore.bdbentitys.BdbClusterSettingEntity;
 import org.apache.tubemq.server.master.web.model.ClusterGroupVO;
 import org.apache.tubemq.server.master.web.model.ClusterNodeVO;
 
@@ -43,9 +49,14 @@ public class WebMasterInfoHandler extends AbstractWebHandler {
         // register query method
         registerQueryWebMethod("admin_query_master_group_info",
                 "getGroupAddressStrInfo");
+        registerQueryWebMethod("admin_query_cluster_default_setting",
+                "adminQueryClusterDefSetting");
         // register modify method
         registerModifyWebMethod("admin_transfer_current_master",
                 "transferCurrentMaster");
+        // register modify method
+        registerModifyWebMethod("admin_set_cluster_default_setting",
+                "adminSetClusterDefSetting");
     }
 
     /**
@@ -94,17 +105,111 @@ public class WebMasterInfoHandler extends AbstractWebHandler {
      * @return
      */
     public StringBuilder transferCurrentMaster(HttpServletRequest req) {
-        StringBuilder strBuffer = new StringBuilder(512);
+        ProcessResult result = new ProcessResult();
+        StringBuilder sBuilder = new StringBuilder(512);
+        // valid operation authorize info
+        if (!WebParameterUtils.validReqAuthorizeInfo(req,
+                WebFieldDef.ADMINAUTHTOKEN, true, master, result)) {
+            WebParameterUtils.buildFailResult(sBuilder, result.errInfo);
+            return sBuilder;
+        }
         try {
-            WebParameterUtils.reqAuthorizeCheck(master, brokerConfManager, req.getParameter("confModAuthToken"));
             brokerConfManager.transferMaster();
-            strBuffer.append("{\"result\":true,\"errCode\":0," +
-                    "\"errMsg\":\"TransferMaster method called, please wait 20 seconds!\"}");
+            WebParameterUtils.buildSuccessResult(sBuilder,
+                    "TransferMaster method called, please wait 20 seconds!");
         } catch (Exception e2) {
-            strBuffer.append("{\"result\":false,\"errCode\":400,\"errMsg\":\"")
-                    .append(e2.getMessage()).append("\"}");
+            WebParameterUtils.buildFailResult(sBuilder, e2.getMessage());
         }
-        return strBuffer;
+        return sBuilder;
+    }
+
+    /**
+     * Query cluster default setting
+     *
+     * @param req
+     * @return
+     * @throws Exception
+     */
+    public StringBuilder adminQueryClusterDefSetting(HttpServletRequest req) {
+        StringBuilder sBuilder = new StringBuilder(512);
+        BdbClusterSettingEntity defClusterSetting =
+                brokerConfManager.getBdbClusterSetting();
+        sBuilder.append("{\"result\":true,\"errCode\":0,\"errMsg\":\"Ok\",\"data\":[");
+        if (defClusterSetting != null) {
+            defClusterSetting.toJsonString(sBuilder);
+        }
+        sBuilder.append("]}");
+        return sBuilder;
+    }
+
+    /**
+     * Add or modify cluster default setting
+     *
+     * @param req
+     * @return
+     */
+    public StringBuilder adminSetClusterDefSetting(HttpServletRequest req) {
+        boolean dataChanged = false;
+        ProcessResult result = new ProcessResult();
+        StringBuilder sBuilder = new StringBuilder(512);
+        // valid operation authorize info
+        if (!WebParameterUtils.validReqAuthorizeInfo(req,
+                WebFieldDef.ADMINAUTHTOKEN, true, master, result)) {
+            WebParameterUtils.buildFailResult(sBuilder, result.errInfo);
+            return sBuilder;
+        }
+        // check modify user field
+        if (!WebParameterUtils.getStringParamValue(req,
+                WebFieldDef.MODIFYUSER, true, null, result)) {
+            WebParameterUtils.buildFailResult(sBuilder, result.errInfo);
+            return sBuilder;
+        }
+        String modifyUser = (String) result.retData1;
+        // check max message size
+        if (!WebParameterUtils.getIntParamValue(req,
+                WebFieldDef.MAXMSGSIZE, false,
+                TBaseConstants.META_VALUE_UNDEFINED,
+                TBaseConstants.META_MAX_MESSAGE_DATA_SIZE,
+                result)) {
+            WebParameterUtils.buildFailResult(sBuilder, result.errInfo);
+            return sBuilder;
+        }
+        int maxMsgSize = (int) result.retData1;
+        if (maxMsgSize != TBaseConstants.META_VALUE_UNDEFINED) {
+            dataChanged = true;
+        }
+        // check and get modify date
+        if (!WebParameterUtils.getDateParameter(req,
+                WebFieldDef.MODIFYDATE, false, new Date(), result)) {
+            WebParameterUtils.buildFailResult(sBuilder, result.errInfo);
+            return sBuilder;
+        }
+        Date modifyDate = (Date) result.retData1;
+        if (!dataChanged) {
+            WebParameterUtils.buildSuccessResult(sBuilder, "No data is changed!");
+            return sBuilder;
+        }
+        // add or modify cluster setting info
+        BdbClusterSettingEntity defClusterSetting =
+                brokerConfManager.getBdbClusterSetting();
+        if (defClusterSetting == null) {
+            defClusterSetting = new BdbClusterSettingEntity();
+        }
+        defClusterSetting.setModifyInfo(modifyUser, modifyDate);
+        if (maxMsgSize != TBaseConstants.META_VALUE_UNDEFINED) {
+            defClusterSetting.setMaxMsgSize(
+                    SettingValidUtils.validAndGetMaxMsgSize(maxMsgSize));
+        }
+        try {
+            brokerConfManager.confSetBdbClusterDefSetting(defClusterSetting);
+            WebParameterUtils.buildSuccessResult(sBuilder);
+        } catch (Exception e) {
+            WebParameterUtils.buildFailResult(sBuilder, e.getMessage());
+        }
+        return sBuilder;
     }
 
+
+
+
 }