Skip to content

Commit 27b45d8

Browse files
authored
Merge branch 'master' into dev-reset-local-users-password
2 parents e5233e0 + aba0f66 commit 27b45d8

File tree

6 files changed

+75
-18
lines changed

6 files changed

+75
-18
lines changed

.azure-pipelines/build-template.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ jobs:
110110
displayName: "Install gcovr 5.2 (for --exclude-throw-branches support)"
111111
- script: |
112112
set -ex
113-
sudo pip install Pympler==0.8
113+
sudo pip install Pympler==0.8 pytest
114114
sudo apt-get install -y redis-server
115115
sudo sed -i 's/notify-keyspace-events ""/notify-keyspace-events AKE/' /etc/redis/redis.conf
116116
sudo sed -ri 's/^# unixsocket/unixsocket/' /etc/redis/redis.conf

.azure-pipelines/test-docker-sonic-vs-template.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ jobs:
6464
# install packages for vs test
6565
sudo apt-get install -y net-tools bridge-utils vlan
6666
sudo apt-get install -y python3-pip
67-
sudo pip3 install pytest==4.6.2 attrs==19.1.0 exabgp==4.0.10 distro==1.5.0 docker>=4.4.1 redis==3.3.4 flaky==3.7.0
67+
sudo pip3 install pytest==4.6.2 attrs==19.1.0 exabgp==4.0.10 distro==1.5.0 docker>=4.4.1 redis==3.3.4 flaky==3.7.0 requests==2.31.0
6868
displayName: "Install dependencies"
6969
7070
- script: |

common/schema.h

+18
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ namespace swss {
2323
#define CHASSIS_APP_DB 12
2424
#define CHASSIS_STATE_DB 13
2525
#define APPL_STATE_DB 14
26+
#define EVENT_DB 19
27+
#define BMP_STATE_DB 20
2628

2729
/***** APPLICATION DATABASE *****/
2830

@@ -164,6 +166,11 @@ namespace swss {
164166
#define APP_DASH_ROUTE_TABLE_NAME "DASH_ROUTE_TABLE"
165167
#define APP_DASH_ROUTE_RULE_TABLE_NAME "DASH_ROUTE_RULE_TABLE"
166168
#define APP_DASH_VNET_MAPPING_TABLE_NAME "DASH_VNET_MAPPING_TABLE"
169+
#define APP_DASH_ENI_ROUTE_TABLE_NAME "DASH_ENI_ROUTE_TABLE"
170+
#define APP_DASH_ROUTE_GROUP_TABLE_NAME "DASH_ROUTE_GROUP_TABLE"
171+
#define APP_DASH_TUNNEL_TABLE_NAME "DASH_TUNNEL_TABLE"
172+
#define APP_DASH_PA_VALIDATION_TABLE_NAME "DASH_PA_VALIDATION_TABLE"
173+
#define APP_DASH_ROUTING_APPLIANCE_TABLE_NAME "DASH_ROUTING_APPLIANCE_TABLE"
167174

168175
/***** TO BE REMOVED *****/
169176

@@ -322,6 +329,7 @@ namespace swss {
322329
#define CFG_BGP_MONITORS_TABLE_NAME "BGP_MONITORS"
323330
#define CFG_BGP_PEER_RANGE_TABLE_NAME "BGP_PEER_RANGE"
324331
#define CFG_BGP_DEVICE_GLOBAL_TABLE_NAME "BGP_DEVICE_GLOBAL"
332+
#define CFG_BMP_TABLE_NAME "BMP"
325333

326334
#define CFG_SWITCH_HASH_TABLE_NAME "SWITCH_HASH"
327335
#define CFG_DEVICE_METADATA_TABLE_NAME "DEVICE_METADATA"
@@ -569,6 +577,16 @@ namespace swss {
569577
#define APP_FABRIC_MONITOR_DATA_TABLE_NAME "FABRIC_MONITOR_TABLE"
570578
#define APP_FABRIC_MONITOR_PORT_TABLE_NAME "FABRIC_PORT_TABLE"
571579

580+
#define EVENT_HISTORY_TABLE_NAME "EVENT"
581+
#define EVENT_CURRENT_ALARM_TABLE_NAME "ALARM"
582+
#define EVENT_STATS_TABLE_NAME "EVENT_STATS"
583+
#define EVENT_ALARM_STATS_TABLE_NAME "ALARM_STATS"
584+
585+
/***** BMP STATE DATABASE *****/
586+
#define BMP_STATE_BGP_NEIGHBOR_TABLE "BGP_NEIGHBOR_TABLE"
587+
#define BMP_STATE_BGP_RIB_IN_TABLE "BGP_RIB_IN_TABLE"
588+
#define BMP_STATE_BGP_RIB_OUT_TABLE "BGP_RIB_OUT_TABLE"
589+
572590
#ifdef __cplusplus
573591
}
574592
#endif

pyext/swsscommon.i

+25-14
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@
5656
#include "zmqclient.h"
5757
#include "zmqconsumerstatetable.h"
5858
#include "zmqproducerstatetable.h"
59+
#include <memory>
60+
#include <functional>
5961
%}
6062

6163
%include <std_string.i>
@@ -156,31 +158,36 @@
156158
SWIG_Python_AppendOutput($result, temp);
157159
}
158160

159-
%typemap(in, fragment="SWIG_AsPtr_std_string")
161+
%typemap(in, fragment="SWIG_AsVal_std_string")
160162
const std::vector<std::pair< std::string,std::string >,std::allocator< std::pair< std::string,std::string > > > &
161163
(std::vector< std::pair< std::string,std::string >,std::allocator< std::pair< std::string,std::string > > > temp,
162164
int res) {
163165
res = SWIG_OK;
164166
for (int i = 0; i < PySequence_Length($input); ++i) {
165167
temp.push_back(std::pair< std::string,std::string >());
166-
PyObject *item = PySequence_GetItem($input, i);
167-
if (!PyTuple_Check(item) || PyTuple_Size(item) != 2) {
168+
std::unique_ptr<PyObject, std::function<void(PyObject *)> > item(
169+
PySequence_GetItem($input, i),
170+
[](PyObject *ptr){
171+
Py_DECREF(ptr);
172+
});
173+
if (!PyTuple_Check(item.get()) || PyTuple_Size(item.get()) != 2) {
168174
SWIG_fail;
169175
}
170-
PyObject *key = PyTuple_GetItem(item, 0);
171-
PyObject *value = PyTuple_GetItem(item, 1);
172-
std::string *ptr = (std::string *)0;
176+
PyObject *key = PyTuple_GetItem(item.get(), 0);
177+
PyObject *value = PyTuple_GetItem(item.get(), 1);
178+
std::string str;
179+
173180
if (PyBytes_Check(key)) {
174181
temp.back().first.assign(PyBytes_AsString(key), PyBytes_Size(key));
175-
} else if (SWIG_AsPtr_std_string(key, &ptr)) {
176-
temp.back().first = *ptr;
182+
} else if (SWIG_AsVal_std_string(key, &str) != SWIG_ERROR) {
183+
temp.back().first = str;
177184
} else {
178185
SWIG_fail;
179186
}
180187
if (PyBytes_Check(value)) {
181188
temp.back().second.assign(PyBytes_AsString(value), PyBytes_Size(value));
182-
} else if (SWIG_AsPtr_std_string(value, &ptr)) {
183-
temp.back().second = *ptr;
189+
} else if (SWIG_AsVal_std_string(value, &str) != SWIG_ERROR) {
190+
temp.back().second = str;
184191
} else {
185192
SWIG_fail;
186193
}
@@ -191,13 +198,17 @@
191198
%typemap(typecheck) const std::vector< std::pair< std::string,std::string >,std::allocator< std::pair< std::string,std::string > > > &{
192199
$1 = 1;
193200
for (int i = 0; i < PySequence_Length($input); ++i) {
194-
PyObject *item = PySequence_GetItem($input, i);
195-
if (!PyTuple_Check(item) || PyTuple_Size(item) != 2) {
201+
std::unique_ptr<PyObject, std::function<void(PyObject *)> > item(
202+
PySequence_GetItem($input, i),
203+
[](PyObject *ptr){
204+
Py_DECREF(ptr);
205+
});
206+
if (!PyTuple_Check(item.get()) || PyTuple_Size(item.get()) != 2) {
196207
$1 = 0;
197208
break;
198209
}
199-
PyObject *key = PyTuple_GetItem(item, 0);
200-
PyObject *value = PyTuple_GetItem(item, 1);
210+
PyObject *key = PyTuple_GetItem(item.get(), 0);
211+
PyObject *value = PyTuple_GetItem(item.get(), 1);
201212
if (!PyBytes_Check(key)
202213
&& !PyUnicode_Check(key)
203214
&& !PyString_Check(key)

sonic-db-cli/sonic-db-cli.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,14 @@ int executeCommands(
139139
try
140140
{
141141
int db_id = SonicDBConfig::getDbId(db_name, netns);
142-
if (useUnixSocket)
142+
auto host = SonicDBConfig::getDbHostname(db_name, netns);
143+
if (useUnixSocket && host != "redis_chassis.server")
143144
{
144145
auto db_socket = SonicDBConfig::getDbSock(db_name, netns);
145146
client = make_shared<DBConnector>(db_id, db_socket, 0);
146147
}
147148
else
148149
{
149-
auto host = SonicDBConfig::getDbHostname(db_name, netns);
150150
auto port = SonicDBConfig::getDbPort(db_name, netns);
151151
client = make_shared<DBConnector>(db_id, host, port, 0);
152152
}

tests/test_redis_ut.py

+28
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22
import time
3+
import psutil
34
import pytest
45
import multiprocessing
56
from threading import Thread
@@ -851,3 +852,30 @@ def test_SmartSwitchDBConnector():
851852
assert tbl.get("dputest2")[1][1] == ("dashfield2", "dashvalue2")
852853
assert len(SonicDBConfig.getDbKeys()) == len(global_db_config_json["INCLUDES"])
853854

855+
856+
def test_TableSetBinary():
857+
app_db = swsscommon.DBConnector("APPL_DB", 0, True)
858+
t = swsscommon.Table(app_db, "TABLE")
859+
buff = b""
860+
for i in range(0, 256):
861+
buff += bytes([i])
862+
buff = buff.decode('latin-1')
863+
fvs = swsscommon.FieldValuePairs([("binary", buff)])
864+
t.set("binary", fvs)
865+
(status, fvs) = t.get("binary")
866+
assert status == True
867+
assert fvs[0][1] == buff
868+
869+
870+
def test_TableOpsMemoryLeak():
871+
OP_COUNT = 50000
872+
app_db = swsscommon.DBConnector("APPL_DB", 0, True)
873+
t = swsscommon.Table(app_db, "TABLE")
874+
long_data = "x" * 100
875+
fvs = swsscommon.FieldValuePairs([(long_data, long_data)])
876+
rss = psutil.Process(os.getpid()).memory_info().rss
877+
for _ in range(OP_COUNT):
878+
t.set("long_data", fvs)
879+
t.get("long_data")
880+
assert psutil.Process(os.getpid()).memory_info().rss - rss < OP_COUNT
881+

0 commit comments

Comments
 (0)