ソースを参照

Fix: update registry ip list cause crash
Add: tc_json JsonValueArray add `find` func
Fix: epoll server checkFlow initialize parameter error

ruanshudong 2 年 前
コミット
7bdd00f0f5

+ 1 - 1
servant/libservant/Application.cpp

@@ -1132,7 +1132,7 @@ void Application::initializeServer()
 //	ServerConfig::MergeNetImp       = _conf.get("/tars/application/server<mergenetimp>", "0") == "0" ? false : true;
 	ServerConfig::NetThread         = TC_Common::strto<int>(toDefault(_conf.get("/tars/application/server<netthread>"), "1"));
 	ServerConfig::CloseCout        = _conf.get("/tars/application/server<closecout>","1")=="0"?0:1;
-	ServerConfig::BackPacketLimit  = TC_Common::strto<int>(_conf.get("/tars/application/server<backpacketlimit>", "100*1024*1024"));
+	ServerConfig::BackPacketLimit  = TC_Common::strto<int>(_conf.get("/tars/application/server<backpacketlimit>", TC_Common::tostr(100*1024*1024)));
 	ServerConfig::BackPacketMin    = TC_Common::strto<int>(_conf.get("/tars/application/server<backpacketmin>", "1024"));
 
 	ServerConfig::Context["node_name"] = ServerConfig::LocalIp;

+ 4 - 4
servant/libservant/EndpointManager.cpp

@@ -741,14 +741,14 @@ void EndpointManager::updateEndpointsOutter(const set<EndpointInfo> & active, co
 {
 //	LOG_CONSOLE_DEBUG << this->_objectProxy << ", " << active.begin()->desc() << endl;
 	//创新新对象, 避免线程冲突
-    _outterUpdate = std::make_shared<OutterUpdate>();
-    _outterUpdate->active    = active;
-    _outterUpdate->inactive  = inactive;
+    shared_ptr<OutterUpdate> outterUpdate = std::make_shared<OutterUpdate>();
+	outterUpdate->active    = active;
+	outterUpdate->inactive  = inactive;
 
     //更新时间
 	_refreshTime = TNOWMS + _refreshInterval;
 
-//	updateEndpoints(active, inactive);
+	_outterUpdate = outterUpdate;
 }
 
 void EndpointManager::updateEndpoints(const set<EndpointInfo> & active, const set<EndpointInfo> & inactive)

ファイルの差分が大きいため隠しています
+ 132 - 132
tools/tarsgrammar/tars.tab.cpp


+ 18 - 18
tools/tarsparse/tars.lex.cpp

@@ -511,7 +511,7 @@ int yy_flex_debug = 0;
 #define YY_MORE_ADJ 0
 #define YY_RESTORE_YY_MORE_OFFSET
 char *yytext;
-#line 1 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 1 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 /**
  * Tencent is pleased to support the open source community by making Tars available.
  *
@@ -527,7 +527,7 @@ char *yytext;
  * CONDITIONS OF ANY KIND, either express or implied. See the License for the 
  * specific language governing permissions and limitations under the License.
  */
-#line 20 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 20 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 #include <map>
 #include <string>
 #include <sstream>
@@ -776,7 +776,7 @@ YY_DECL
 		}
 
 	{
-#line 67 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 67 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 
 
 #line 782 "tars.lex.cpp"
@@ -848,12 +848,12 @@ do_action:	/* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 69 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 69 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 { BEGIN(INCL); }
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 71 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 71 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     if ( include_file_stack_ptr >= MAX_INCLUDE_DEPTH )
     {
@@ -886,7 +886,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(INCL):
-#line 101 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 101 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     --include_file_stack_ptr;
     if ( include_file_stack_ptr < 0 )
@@ -905,14 +905,14 @@ case YY_STATE_EOF(INCL):
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 117 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 117 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     return TARS_SCOPE_DELIMITER;
 }
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 121 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 121 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     // C++ comment
     bool e = false;
@@ -933,7 +933,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 139 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 139 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     // C comment
     bool e = false;
@@ -984,7 +984,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 187 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 187 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     StringGrammarPtr ident  = new StringGrammar;
     ident->v            = yytext;
@@ -995,7 +995,7 @@ YY_RULE_SETUP
 case 7:
 /* rule 7 can match eol */
 YY_RULE_SETUP
-#line 194 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 194 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     StringGrammarPtr ident  = new StringGrammar;
     ident->v            = yytext;
@@ -1008,7 +1008,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 204 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 204 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     StringGrammarPtr str = new StringGrammar;
     bool e = false;
@@ -1123,7 +1123,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 316 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 316 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     errno = 0;
     IntergerGrammarPtr ptr = new IntergerGrammar;
@@ -1148,7 +1148,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 338 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 338 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     errno = 0;
     FloatGrammarPtr ptr = new FloatGrammar;
@@ -1183,7 +1183,7 @@ YY_RULE_SETUP
 case 11:
 /* rule 11 can match eol */
 YY_RULE_SETUP
-#line 369 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 369 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     if(yytext[0] == '\n')
     {
@@ -1193,7 +1193,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 376 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 376 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 {
     if(yytext[0] < 32 || yytext[0] > 126)
     {
@@ -1212,7 +1212,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 392 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 392 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 ECHO;
 	YY_BREAK
 #line 1218 "tars.lex.cpp"
@@ -2230,7 +2230,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 392 "/Volumes/MyData/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
+#line 392 "/Users/jarod/centos/Tars/framework/tarscpp/tools/tarsgrammar/tars.l"
 
 
 

ファイルの差分が大きいため隠しています
+ 132 - 132
tools/tarsparse/tars.tab.cpp


+ 35 - 1
unit-test/util/test_tc_json.cpp

@@ -73,6 +73,19 @@ public:
 
     	return jm;
     }
+
+	JsonValueArrayPtr  createArray()
+	{
+		JsonValueArrayPtr pPtr = new JsonValueArray();
+
+		pPtr->value.push_back(new JsonValueString("abc"));
+		pPtr->value.push_back(new JsonValueBoolean(true));
+		pPtr->value.push_back(new JsonValueBoolean(false));
+		pPtr->value.push_back(new JsonValueNum((int64_t)10, true));
+		pPtr->value.push_back(new JsonValueNum(11.f, false));
+
+		return pPtr;
+	}
 };
 
 TEST_F(JsonTest, json)
@@ -121,4 +134,25 @@ TEST_F(JsonTest, jsonMap)
 
 	cout << "json2:" << jMap2.writeToJsonString() << endl;
 	ASSERT_TRUE(jMap == jMap2);
-}
+}
+
+TEST_F(JsonTest, find)
+{
+	JsonValueArrayPtr aPtr = createArray();
+
+	ASSERT_TRUE(aPtr->find(tars::eJsonTypeNum, "0") == aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(tars::eJsonTypeNum, "10") != aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(tars::eJsonTypeNum, "11.f") != aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(tars::eJsonTypeBoolean, "true") != aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(tars::eJsonTypeBoolean, "false") != aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(tars::eJsonTypeString, "abc") != aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(tars::eJsonTypeString, "def") == aPtr->value.end());
+
+	ASSERT_TRUE(aPtr->find(new JsonValueString("abc")) != aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(new JsonValueString("def")) == aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(new JsonValueNum((int64_t)10, true)) != aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(new JsonValueNum(11.f, false)) != aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(new JsonValueNum(0., false)) == aPtr->value.end());
+	ASSERT_TRUE(aPtr->find(new JsonValueBoolean(false)) != aPtr->value.end());
+//	ASSERT_TRUE(aPtr->find(new JsonValueBoolean(true)) != aPtr->value.end());
+}

+ 26 - 0
util/include/util/tc_json.h

@@ -185,10 +185,35 @@ public:
 	{
 		return eJsonTypeArray;
 	}
+
+	/**
+	 *
+	 * @param p
+	 */
 	void push_back(const JsonValuePtr & p)
 	{
 		value.push_back(p);
 	}
+
+	/**
+	 * 查找某个指定类型的元素
+	 * @param type: 目前只支持三种类型: eJsonTypeNum, eJsonTypeBoolean, eJsonTypeString
+	 * @param value
+	 * @return
+	 */
+	vector<JsonValuePtr>::iterator  find(eJsonType type, const string &value);
+
+	/**
+	 * 查找某个指定类型的元素
+	 * @param type: 目前只支持三种类型: eJsonTypeNum, eJsonTypeBoolean, eJsonTypeString
+	 * @param value
+	 * @return
+	 */
+	vector<JsonValuePtr>::iterator  find(const JsonValuePtr &value);
+
+	/**
+	 *
+	 */
 	virtual ~JsonValueArray(){}
 public:
 	vector<JsonValuePtr> value;
@@ -324,6 +349,7 @@ public:
 	// 两个json串合并
 	static string mergeJson(const string& json1, const string& json2);
 	static void mergeJson(const string& json1, const string& json2, string& jsonRet);
+
 private:
 
 	static void mergeObj(JsonValuePtr from, JsonValuePtr to, vector<string>& path);

+ 1 - 1
util/src/tc_epoll_server.cpp

@@ -820,7 +820,7 @@ int TC_EpollServer::Connection::checkFlow(TC_NetWorkBuffer& sendBuffer, size_t l
 //	且每个检查点, 积压长度都增加或者连续3次发送buffer字节小于1k, 就关闭连接, 主要避免极端情况
 
 	size_t iBackPacketBuffLimit = _pBindAdapter->getBackPacketBuffLimit();
-	if((_messageSize + sendBuffer.getBufferLength()) > iBackPacketBuffLimit)
+	if(iBackPacketBuffLimit > 0 && (_messageSize + sendBuffer.getBufferLength()) > iBackPacketBuffLimit)
 	{
 		if(_accumulateBufferSize == 0)
 		{

+ 124 - 0
util/src/tc_json.cpp

@@ -5,12 +5,136 @@
 #include <iostream>
 #include <iomanip>
 #include "util/tc_common.h"
+#include "util/tc_port.h"
 
 namespace tars
 {
 
 #define FILTER_SPACE while(isspace((int)c)) {c=reader.read();}
 
+vector<JsonValuePtr>::iterator JsonValueArray::find(eJsonType type, const string &e)
+{
+	if(type != eJsonTypeNum && type != eJsonTypeBoolean && type != eJsonTypeString)
+	{
+		return value.end();
+	}
+
+	for(auto it = value.begin(); it != value.end(); ++it)
+	{
+		auto i = *it;
+
+		if (i->getType() == type)
+		{
+			switch(type)
+			{
+			case eJsonTypeNum:
+			{
+				JsonValueNumPtr v = JsonValueNumPtr::dynamicCast(i);
+				if (v->isInt && v->lvalue == TC_Common::strto<int64_t>(e))
+				{
+					return it;
+				}
+				else if (!v->isInt &&
+						 TC_Common::equal(v->value, TC_Common::strto<double>(e)))
+				{
+					return it;
+				}
+				break;
+			}
+			case eJsonTypeString:
+			{
+				JsonValueStringPtr v = JsonValueStringPtr::dynamicCast(i);
+
+				if(v->value == e)
+				{
+					return it;
+				}
+
+				break;
+			}
+			case eJsonTypeBoolean:
+			{
+				JsonValueBooleanPtr v = JsonValueBooleanPtr::dynamicCast(i);
+				bool b = (TC_Port::strncasecmp(e.c_str(), "true", e.length()) == 0);
+
+				if(v->value == b)
+				{
+					return it;
+				}
+				break;
+			}
+			default:
+				break;
+			}
+		}
+	}
+
+	return value.end();
+}
+
+vector<JsonValuePtr>::iterator  JsonValueArray::find(const JsonValuePtr &e)
+{
+	auto type = e->getType();
+
+	if(type != eJsonTypeNum && type != eJsonTypeBoolean && type != eJsonTypeString)
+	{
+		return value.end();
+	}
+
+	for(auto it = value.begin(); it != value.end(); ++it)
+	{
+		auto i = *it;
+
+		if (i->getType() == type)
+		{
+			switch(type)
+			{
+			case eJsonTypeNum:
+			{
+				JsonValueNumPtr v = JsonValueNumPtr::dynamicCast(i);
+				JsonValueNumPtr y = JsonValueNumPtr::dynamicCast(e);
+				if (v->isInt && v->lvalue == y->lvalue)
+				{
+					return it;
+				}
+				else if (!v->isInt && TC_Common::equal(v->value, y->value))
+				{
+					return it;
+				}
+				break;
+			}
+			case eJsonTypeString:
+			{
+				JsonValueStringPtr v = JsonValueStringPtr::dynamicCast(i);
+				JsonValueStringPtr y = JsonValueStringPtr::dynamicCast(e);
+
+				if(v->value == y->value)
+				{
+					return it;
+				}
+
+				break;
+			}
+			case eJsonTypeBoolean:
+			{
+				JsonValueBooleanPtr v = JsonValueBooleanPtr::dynamicCast(i);
+				JsonValueBooleanPtr y = JsonValueBooleanPtr::dynamicCast(e);
+
+				if(v->value == y->value)
+				{
+					return it;
+				}
+				break;
+			}
+			default:
+				break;
+			}
+		}
+	}
+
+	return value.end();
+}
+
 JsonValuePtr TC_Json::getValue(BufferJsonReader & reader)
 {
 	char c=reader.read();

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません