dubbo.apache.org/dubbo-go/v3@v3.1.1/xds/balancer/priority/ignore_resolve_now.go (about) 1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /* 19 * 20 * Copyright 2021 gRPC authors. 21 * 22 */ 23 24 package priority 25 26 import ( 27 "sync/atomic" 28 ) 29 30 import ( 31 "google.golang.org/grpc/balancer" 32 33 "google.golang.org/grpc/resolver" 34 ) 35 36 type ignoreResolveNowBalancerBuilder struct { 37 balancer.Builder 38 ignoreResolveNow *uint32 39 } 40 41 // If `ignore` is true, all `ResolveNow()` from the balancer built from this 42 // builder will be ignored. 43 // 44 // `ignore` can be updated later by `updateIgnoreResolveNow`, and the update 45 // will be propagated to all the old and new balancers built with this. 46 func newIgnoreResolveNowBalancerBuilder(bb balancer.Builder, ignore bool) *ignoreResolveNowBalancerBuilder { 47 ret := &ignoreResolveNowBalancerBuilder{ 48 Builder: bb, 49 ignoreResolveNow: new(uint32), 50 } 51 ret.updateIgnoreResolveNow(ignore) 52 return ret 53 } 54 55 func (irnbb *ignoreResolveNowBalancerBuilder) updateIgnoreResolveNow(b bool) { 56 if b { 57 atomic.StoreUint32(irnbb.ignoreResolveNow, 1) 58 return 59 } 60 atomic.StoreUint32(irnbb.ignoreResolveNow, 0) 61 62 } 63 64 func (irnbb *ignoreResolveNowBalancerBuilder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer { 65 return irnbb.Builder.Build(&ignoreResolveNowClientConn{ 66 ClientConn: cc, 67 ignoreResolveNow: irnbb.ignoreResolveNow, 68 }, opts) 69 } 70 71 type ignoreResolveNowClientConn struct { 72 balancer.ClientConn 73 ignoreResolveNow *uint32 74 } 75 76 func (i ignoreResolveNowClientConn) ResolveNow(o resolver.ResolveNowOptions) { 77 if atomic.LoadUint32(i.ignoreResolveNow) != 0 { 78 return 79 } 80 i.ClientConn.ResolveNow(o) 81 }