Skip to content

Commit e6699ac

Browse files
committed
feat: optimize RedisProxyJedisPool protect logic (#459)
1 parent f1b67cf commit e6699ac

6 files changed

Lines changed: 101 additions & 48 deletions

File tree

camellia-redis-proxy/camellia-redis-proxy-extensions/camellia-redis-proxy-discovery/camellia-redis-proxy-discovery-common/src/main/java/com/netease/nim/camellia/redis/proxy/discovery/common/AffinityProxySelector.java

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,32 +52,51 @@ public Proxy next(Boolean affinity) {
5252
}
5353

5454
@Override
55-
public void ban(Proxy proxy) {
56-
logger.warn("proxy {}:{} was baned", proxy.getHost(),proxy.getPort());
57-
dynamicProxyQueue.remove(proxy);
55+
public boolean ban(Proxy proxy) {
56+
try {
57+
logger.warn("proxy {}:{} was baned", proxy.getHost(),proxy.getPort());
58+
dynamicProxyQueue.remove(proxy);
59+
return true;
60+
} catch (Exception e) {
61+
logger.error("ban error, proxy = {}", proxy, e);
62+
return false;
63+
}
5864
}
5965

6066
@Override
61-
public void add(Proxy proxy) {
62-
if (!dynamicProxyQueue.contains(proxy)) {
63-
dynamicProxyQueue.add(proxy);
64-
}
65-
if (!proxyList.contains(proxy)) {
66-
proxyList.add(proxy);
67+
public boolean add(Proxy proxy) {
68+
try {
69+
if (!dynamicProxyQueue.contains(proxy)) {
70+
dynamicProxyQueue.add(proxy);
71+
}
72+
if (!proxyList.contains(proxy)) {
73+
proxyList.add(proxy);
74+
}
75+
return true;
76+
} catch (Exception e) {
77+
logger.error("add error, proxy = {}", proxy, e);
78+
return false;
6779
}
6880
}
6981

7082
@Override
71-
public void remove(Proxy proxy) {
72-
if (dynamicProxyQueue.size() == 1) {
73-
if (logger.isWarnEnabled()) {
74-
logger.warn("proxySet.size = 1, skip remove proxy! proxy = {}", proxy);
83+
public boolean remove(Proxy proxy) {
84+
try {
85+
if (dynamicProxyQueue.size() == 1) {
86+
if (logger.isWarnEnabled()) {
87+
logger.warn("proxySet.size = 1, skip remove proxy! proxy = {}", proxy);
88+
}
89+
} else {
90+
dynamicProxyQueue.remove(proxy);
7591
}
76-
} else {
77-
dynamicProxyQueue.remove(proxy);
78-
}
79-
if (proxyList.size() > 1) {
80-
proxyList.remove(proxy);
92+
if (proxyList.size() > 1) {
93+
proxyList.remove(proxy);
94+
return true;
95+
}
96+
return false;
97+
} catch (Exception e) {
98+
logger.error("remove error, proxy = {}", proxy, e);
99+
return false;
81100
}
82101
}
83102

camellia-redis-proxy/camellia-redis-proxy-extensions/camellia-redis-proxy-discovery/camellia-redis-proxy-discovery-common/src/main/java/com/netease/nim/camellia/redis/proxy/discovery/common/IProxySelector.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ default Proxy next(Boolean affinity) {
1919
return next();
2020
}
2121

22-
void ban(Proxy proxy);
22+
boolean ban(Proxy proxy);
2323

24-
void add(Proxy proxy);
24+
boolean add(Proxy proxy);
2525

26-
void remove(Proxy proxy);
26+
boolean remove(Proxy proxy);
2727

2828
Set<Proxy> getAll();
2929

camellia-redis-proxy/camellia-redis-proxy-extensions/camellia-redis-proxy-discovery/camellia-redis-proxy-discovery-common/src/main/java/com/netease/nim/camellia/redis/proxy/discovery/common/RandomProxySelector.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,38 +34,48 @@ public Proxy next() {
3434
}
3535

3636
@Override
37-
public void ban(Proxy proxy) {
37+
public boolean ban(Proxy proxy) {
3838
try {
3939
synchronized (lock) {
4040
dynamicProxyList.remove(proxy);
4141
}
42-
} catch (Exception ignore) {
42+
return true;
43+
} catch (Exception e) {
44+
logger.error("ban error, proxy = {}", proxy, e);
45+
return false;
4346
}
4447
}
4548

4649
@Override
47-
public void add(Proxy proxy) {
50+
public boolean add(Proxy proxy) {
4851
try {
4952
synchronized (lock) {
5053
proxySet.add(proxy);
5154
dynamicProxyList = new ArrayList<>(proxySet);
5255
}
53-
} catch (Exception ignore) {
56+
return true;
57+
} catch (Exception e) {
58+
logger.error("add error, proxy = {}", proxy, e);
59+
return false;
5460
}
5561
}
5662

5763
@Override
58-
public void remove(Proxy proxy) {
64+
public boolean remove(Proxy proxy) {
5965
try {
6066
synchronized (lock) {
6167
if (proxySet.size() == 1) {
6268
logger.warn("proxySet.size = 1, skip remove proxy! proxy = {}", proxy.toString());
69+
return false;
6370
} else {
6471
proxySet.remove(proxy);
6572
dynamicProxyList = new ArrayList<>(proxySet);
73+
return true;
6674
}
6775
}
68-
} catch (Exception ignore) {
76+
} catch (Exception e) {
77+
logger.error("remove error, proxy = {}", proxy, e);
78+
return false;
6979
}
7080
}
7181

camellia-redis-proxy/camellia-redis-proxy-extensions/camellia-redis-proxy-discovery/camellia-redis-proxy-discovery-common/src/main/java/com/netease/nim/camellia/redis/proxy/discovery/common/SideCarFirstProxySelector.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@ private Proxy tryPick(List<Proxy> dynamicProxyList) {
7676
}
7777

7878
@Override
79-
public void ban(Proxy proxy) {
79+
public boolean ban(Proxy proxy) {
8080
try {
8181
synchronized (lock) {
82-
if (proxy == null) return;
82+
if (proxy == null) {
83+
return false;
84+
}
8385
if (proxy.getHost().equals(localhost)) {
8486
dynamicSideCarProxy = null;
85-
return;
87+
return true;
8688
}
8789
String region = regionResolver.resolve(proxy.getHost());
8890
if (Objects.equals(region, localRegion)) {
@@ -91,20 +93,24 @@ public void ban(Proxy proxy) {
9193
dynamicProxyListOtherRegion.remove(proxy);
9294
}
9395
}
96+
return true;
9497
} catch (Exception e) {
95-
logger.error("ban error", e);
98+
logger.error("ban error, proxy = {}", proxy, e);
99+
return false;
96100
}
97101
}
98102

99103
@Override
100-
public void add(Proxy proxy) {
104+
public boolean add(Proxy proxy) {
101105
try {
102106
synchronized (lock) {
103-
if (proxy == null) return;
107+
if (proxy == null) {
108+
return false;
109+
}
104110
if (proxy.getHost().equals(localhost)) {
105111
sideCarProxy = proxy;
106112
dynamicSideCarProxy = proxy;
107-
return;
113+
return true;
108114
}
109115
String region = regionResolver.resolve(proxy.getHost());
110116
if (Objects.equals(region, localRegion)) {
@@ -114,25 +120,27 @@ public void add(Proxy proxy) {
114120
proxySetOtherRegion.add(proxy);
115121
dynamicProxyListOtherRegion = new ArrayList<>(proxySetOtherRegion);
116122
}
123+
return true;
117124
}
118125
} catch (Exception e) {
119-
logger.error("add error", e);
126+
logger.error("add error, proxy = {}", proxy, e);
127+
return false;
120128
}
121129
}
122130

123131
@Override
124-
public void remove(Proxy proxy) {
132+
public boolean remove(Proxy proxy) {
125133
try {
126134
synchronized (lock) {
127-
if (proxy == null) return;
135+
if (proxy == null) return false;
128136
if (isOnlyOneProxy()) {
129137
logger.warn("proxySet.size <= 1, skip remove proxy! proxy = {}", proxy);
130-
return;
138+
return false;
131139
}
132140
if (proxy.getHost().equals(localhost)) {
133141
sideCarProxy = null;
134142
dynamicSideCarProxy = null;
135-
return;
143+
return true;
136144
}
137145
String region = regionResolver.resolve(proxy.getHost());
138146
if (Objects.equals(region, localRegion)) {
@@ -142,9 +150,11 @@ public void remove(Proxy proxy) {
142150
proxySetOtherRegion.remove(proxy);
143151
dynamicProxyListOtherRegion = new ArrayList<>(proxySetOtherRegion);
144152
}
153+
return true;
145154
}
146155
} catch (Exception e) {
147-
logger.error("remove error", e);
156+
logger.error("remove error, proxy = {}", proxy, e);
157+
return false;
148158
}
149159
}
150160

camellia-redis-proxy/camellia-redis-proxy-extensions/camellia-redis-proxy-discovery/camellia-redis-proxy-discovery-jedis2/src/main/java/com/netease/nim/camellia/redis/proxy/discovery/jedis/RedisProxyJedisPool.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -573,10 +573,12 @@ private void remove(Proxy proxy) {
573573
if (proxy == null) return;
574574
synchronized (lock) {
575575
try {
576-
proxySelector.remove(proxy);
577-
JedisPool remove = jedisPoolMap.remove(proxy);
578-
if (remove != null) {
579-
remove.close();
576+
boolean removed = proxySelector.remove(proxy);
577+
if (removed) {
578+
JedisPool remove = jedisPoolMap.remove(proxy);
579+
if (remove != null) {
580+
remove.close();
581+
}
580582
}
581583
} catch (Exception e) {
582584
logger.error("remove proxy error, proxy = {}", proxy, e);
@@ -605,14 +607,20 @@ public void run() {
605607
try {
606608
List<Proxy> list = proxyJedisPool.proxyDiscovery.findAll();
607609
if (list != null && !list.isEmpty()) {
608-
Set<Proxy> proxySet = proxyJedisPool.proxySelector.getAll();
610+
list = new ArrayList<>(list);
611+
Collections.shuffle(list);
612+
//add
609613
for (Proxy proxy : list) {
610614
proxyJedisPool.add(proxy);
611615
}
616+
//remove
617+
Set<Proxy> proxySet = proxyJedisPool.proxySelector.getAll();
612618
Set<Proxy> oldSet = new HashSet<>(proxySet);
613619
list.forEach(oldSet::remove);
614620
if (!oldSet.isEmpty()) {
615-
for (Proxy proxy : oldSet) {
621+
List<Proxy> removed = new ArrayList<>(oldSet);
622+
Collections.shuffle(removed);
623+
for (Proxy proxy : removed) {
616624
proxyJedisPool.remove(proxy);
617625
}
618626
}

camellia-redis-proxy/camellia-redis-proxy-extensions/camellia-redis-proxy-discovery/camellia-redis-proxy-discovery-jedis3/src/main/java/com/netease/nim/camellia/redis/proxy/discovery/jedis/RedisProxyJedisPool.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -605,14 +605,20 @@ public void run() {
605605
try {
606606
List<Proxy> list = proxyJedisPool.proxyDiscovery.findAll();
607607
if (list != null && !list.isEmpty()) {
608-
Set<Proxy> proxySet = proxyJedisPool.proxySelector.getAll();
608+
list = new ArrayList<>(new HashSet<>(list));
609+
Collections.shuffle(list);
610+
//add
609611
for (Proxy proxy : list) {
610612
proxyJedisPool.add(proxy);
611613
}
614+
//remove
615+
Set<Proxy> proxySet = proxyJedisPool.proxySelector.getAll();
612616
Set<Proxy> oldSet = new HashSet<>(proxySet);
613617
list.forEach(oldSet::remove);
614618
if (!oldSet.isEmpty()) {
615-
for (Proxy proxy : oldSet) {
619+
List<Proxy> removed = new ArrayList<>(oldSet);
620+
Collections.shuffle(removed);
621+
for (Proxy proxy : removed) {
616622
proxyJedisPool.remove(proxy);
617623
}
618624
}

0 commit comments

Comments
 (0)