| package libnetwork |
| |
| import ( |
| "encoding/json" |
| "sync" |
| |
| "github.com/docker/docker/libnetwork/datastore" |
| ) |
| |
| // endpointCnt was used to refcount network-endpoint relationships. It's |
| // unused since v28.1, and kept around only to ensure that users can properly |
| // downgrade. |
| // |
| // TODO(aker): remove this struct in v30. |
| type endpointCnt struct { |
| n *Network |
| Count uint64 |
| dbIndex uint64 |
| dbExists bool |
| sync.Mutex |
| } |
| |
| const epCntKeyPrefix = "endpoint_count" |
| |
| func (ec *endpointCnt) Key() []string { |
| ec.Lock() |
| defer ec.Unlock() |
| |
| return []string{epCntKeyPrefix, ec.n.id} |
| } |
| |
| func (ec *endpointCnt) KeyPrefix() []string { |
| ec.Lock() |
| defer ec.Unlock() |
| |
| return []string{epCntKeyPrefix, ec.n.id} |
| } |
| |
| func (ec *endpointCnt) Value() []byte { |
| ec.Lock() |
| defer ec.Unlock() |
| |
| b, err := json.Marshal(ec) |
| if err != nil { |
| return nil |
| } |
| return b |
| } |
| |
| func (ec *endpointCnt) SetValue(value []byte) error { |
| ec.Lock() |
| defer ec.Unlock() |
| |
| return json.Unmarshal(value, &ec) |
| } |
| |
| func (ec *endpointCnt) Index() uint64 { |
| ec.Lock() |
| defer ec.Unlock() |
| return ec.dbIndex |
| } |
| |
| func (ec *endpointCnt) SetIndex(index uint64) { |
| ec.Lock() |
| ec.dbIndex = index |
| ec.dbExists = true |
| ec.Unlock() |
| } |
| |
| func (ec *endpointCnt) Exists() bool { |
| ec.Lock() |
| defer ec.Unlock() |
| return ec.dbExists |
| } |
| |
| func (ec *endpointCnt) Skip() bool { |
| ec.Lock() |
| defer ec.Unlock() |
| return !ec.n.persist |
| } |
| |
| func (ec *endpointCnt) New() datastore.KVObject { |
| ec.Lock() |
| defer ec.Unlock() |
| |
| return &endpointCnt{ |
| n: ec.n, |
| } |
| } |
| |
| func (ec *endpointCnt) CopyTo(o datastore.KVObject) error { |
| ec.Lock() |
| defer ec.Unlock() |
| |
| dstEc := o.(*endpointCnt) |
| dstEc.n = ec.n |
| dstEc.Count = ec.Count |
| dstEc.dbExists = ec.dbExists |
| dstEc.dbIndex = ec.dbIndex |
| |
| return nil |
| } |