-
Notifications
You must be signed in to change notification settings - Fork 3.8k
/
factory.go
130 lines (118 loc) · 4.73 KB
/
factory.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2021 The Cockroach Authors.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
package descs
import (
"context"
"github.com/cockroachdb/cockroach/pkg/keys"
"github.com/cockroachdb/cockroach/pkg/kv"
"github.com/cockroachdb/cockroach/pkg/settings/cluster"
"github.com/cockroachdb/cockroach/pkg/spanconfig"
"github.com/cockroachdb/cockroach/pkg/sql/catalog"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/hydrateddesc"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/internal/catkv"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/lease"
"github.com/cockroachdb/cockroach/pkg/sql/sessiondata"
"github.com/cockroachdb/cockroach/pkg/sql/sqlutil"
"github.com/cockroachdb/cockroach/pkg/util/mon"
)
// CollectionFactory is used to construct a new Collection.
type CollectionFactory struct {
settings *cluster.Settings
codec keys.SQLCodec
leaseMgr *lease.Manager
virtualSchemas catalog.VirtualSchemas
hydrated *hydrateddesc.Cache
systemDatabase *catkv.SystemDatabaseCache
spanConfigSplitter spanconfig.Splitter
spanConfigLimiter spanconfig.Limiter
defaultMonitor *mon.BytesMonitor
}
// GetClusterSettings returns the cluster setting from the collection factory.
func (cf *CollectionFactory) GetClusterSettings() *cluster.Settings {
return cf.settings
}
// TxnManager is used to enable running multiple queries with an internal
// executor in a transactional manner.
type TxnManager interface {
sqlutil.InternalExecutorFactory
// DescsTxnWithExecutor enables using an internal executor to run sql
// statements in a transactional manner. It creates a descriptor collection
// that lives within the scope of the passed in TxnWithExecutorFunc, and
// also ensures that the internal executor also share the same descriptor
// collection. Please use this interface if you want to run multiple sql
// statement with an internal executor in a txn.
DescsTxnWithExecutor(
ctx context.Context,
db *kv.DB,
sd *sessiondata.SessionData,
f TxnWithExecutorFunc,
opts ...sqlutil.TxnOption,
) error
// DescsTxn is similar to DescsTxnWithExecutor but without an internal executor.
// It creates a descriptor collection that lives within the scope of the given
// function, and is a convenient method for running a transaction on
// them.
DescsTxn(
ctx context.Context,
db *kv.DB,
f func(context.Context, *kv.Txn, *Collection) error,
opts ...sqlutil.TxnOption,
) error
}
// InternalExecutorCommitTxnFunc is to commit the txn associated with an
// internal executor.
type InternalExecutorCommitTxnFunc func(ctx context.Context) error
// NewCollectionFactory constructs a new CollectionFactory which holds onto
// the node-level dependencies needed to construct a Collection.
func NewCollectionFactory(
ctx context.Context,
settings *cluster.Settings,
leaseMgr *lease.Manager,
virtualSchemas catalog.VirtualSchemas,
hydrated *hydrateddesc.Cache,
spanConfigSplitter spanconfig.Splitter,
spanConfigLimiter spanconfig.Limiter,
) *CollectionFactory {
return &CollectionFactory{
settings: settings,
codec: leaseMgr.Codec(),
leaseMgr: leaseMgr,
virtualSchemas: virtualSchemas,
hydrated: hydrated,
systemDatabase: catkv.NewSystemDatabaseCache(leaseMgr.Codec(), settings),
spanConfigSplitter: spanConfigSplitter,
spanConfigLimiter: spanConfigLimiter,
defaultMonitor: mon.NewUnlimitedMonitor(ctx, "CollectionFactoryDefaultUnlimitedMonitor",
mon.MemoryResource, nil /* curCount */, nil, /* maxHist */
0 /* noteworthy */, settings),
}
}
// NewBareBonesCollectionFactory constructs a new CollectionFactory which holds
// onto a minimum of dependencies needed to construct an operable Collection.
func NewBareBonesCollectionFactory(
settings *cluster.Settings, codec keys.SQLCodec,
) *CollectionFactory {
return &CollectionFactory{
settings: settings,
codec: codec,
}
}
// NewCollection constructs a new Collection.
func (cf *CollectionFactory) NewCollection(
ctx context.Context, temporarySchemaProvider TemporarySchemaProvider, monitor *mon.BytesMonitor,
) *Collection {
if monitor == nil {
// If an upstream monitor is not provided, the default, unlimited monitor will be used.
// All downstream resource allocation/releases on this default monitor will then be no-ops.
monitor = cf.defaultMonitor
}
return newCollection(ctx, cf.leaseMgr, cf.settings, cf.codec, cf.hydrated, cf.systemDatabase,
cf.virtualSchemas, temporarySchemaProvider, monitor)
}