-
Notifications
You must be signed in to change notification settings - Fork 22
/
chain.go
91 lines (76 loc) · 2.51 KB
/
chain.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright (C) 2023 Gobalsky Labs Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Copyright (c) 2022 Gobalsky Labs Limited
//
// Use of this software is governed by the Business Source License included
// in the LICENSE.DATANODE file and at https://www.mariadb.com/bsl11.
//
// Change Date: 18 months from the later of the date of the first publicly
// available Distribution of this version of the repository, and 25 June 2022.
//
// On the date above, in accordance with the Business Source License, use
// of this software will be governed by version 3 or later of the GNU General
// Public License.
package service
import (
"context"
"errors"
"sync"
"code.vegaprotocol.io/vega/datanode/entities"
)
type ChainStore interface {
Get(context.Context) (entities.Chain, error)
Set(context.Context, entities.Chain) error
}
type Chain struct {
store ChainStore
chain *entities.Chain
mu sync.Mutex
}
func NewChain(store ChainStore) *Chain {
return &Chain{
store: store,
}
}
/*
GetChainID returns the current chain ID stored in the database (if one is set).
If one is not set, return empty string and no error. If an error occurs,
return empty string and an that error.
It caches the result of calling to the store, so that once we have successfully
retrieved a chain ID, we don't ask again.
*/
func (c *Chain) GetChainID() (string, error) {
c.mu.Lock()
defer c.mu.Unlock()
if c.chain != nil {
return c.chain.ID, nil
}
ctx := context.Background()
chain, err := c.store.Get(ctx)
if errors.Is(err, entities.ErrNotFound) {
return "", nil
}
if err != nil {
return "", err
}
c.chain = &chain
return chain.ID, nil
}
func (c *Chain) SetChainID(chainID string) error {
// Don't bother caching when we set, otherwise the code to fetch from the DB will never
// be exercised until we start restoring mid-chain.
ctx := context.Background()
return c.store.Set(ctx, entities.Chain{ID: chainID})
}