/
api_server.go
118 lines (94 loc) · 4.03 KB
/
api_server.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
package server
import (
"time"
"github.com/gogo/protobuf/types"
"github.com/pachyderm/pachyderm/src/client/transaction"
col "github.com/pachyderm/pachyderm/src/server/pkg/collection"
"github.com/pachyderm/pachyderm/src/server/pkg/log"
"github.com/pachyderm/pachyderm/src/server/pkg/serviceenv"
txnenv "github.com/pachyderm/pachyderm/src/server/pkg/transactionenv"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
var (
grpcErrorf = grpc.Errorf // needed to get passed govet
)
type apiServer struct {
log.Logger
driver *driver
// env generates clients for pachyderm's downstream services
env *serviceenv.ServiceEnv
}
func newAPIServer(
env *serviceenv.ServiceEnv,
txnEnv *txnenv.TransactionEnv,
etcdPrefix string,
) (*apiServer, error) {
d, err := newDriver(env, txnEnv, etcdPrefix)
if err != nil {
return nil, err
}
s := &apiServer{
Logger: log.NewLogger("transaction.API"),
driver: d,
env: env,
}
go func() { s.env.GetPachClient(context.Background()) }() // Begin dialing connection on startup
return s, nil
}
func (a *apiServer) StartTransaction(ctx context.Context, request *transaction.StartTransactionRequest) (response *transaction.Transaction, retErr error) {
func() { a.Log(request, nil, nil, 0) }()
defer func(start time.Time) { a.Log(request, response, retErr, time.Since(start)) }(time.Now())
return a.driver.startTransaction(ctx)
}
func (a *apiServer) InspectTransaction(ctx context.Context, request *transaction.InspectTransactionRequest) (response *transaction.TransactionInfo, retErr error) {
func() { a.Log(request, nil, nil, 0) }()
defer func(start time.Time) { a.Log(request, response, retErr, time.Since(start)) }(time.Now())
return a.driver.inspectTransaction(ctx, request.Transaction)
}
func (a *apiServer) DeleteTransaction(ctx context.Context, request *transaction.DeleteTransactionRequest) (response *types.Empty, retErr error) {
func() { a.Log(request, nil, nil, 0) }()
defer func(start time.Time) { a.Log(request, response, retErr, time.Since(start)) }(time.Now())
err := a.driver.deleteTransaction(ctx, request.Transaction)
if err != nil {
return nil, err
}
return &types.Empty{}, nil
}
func (a *apiServer) ListTransaction(ctx context.Context, request *transaction.ListTransactionRequest) (response *transaction.TransactionInfos, retErr error) {
func() { a.Log(request, nil, nil, 0) }()
defer func(start time.Time) { a.Log(request, response, retErr, time.Since(start)) }(time.Now())
transactions, err := a.driver.listTransaction(ctx)
if err != nil {
return nil, err
}
return &transaction.TransactionInfos{TransactionInfo: transactions}, nil
}
func (a *apiServer) FinishTransaction(ctx context.Context, request *transaction.FinishTransactionRequest) (response *transaction.TransactionInfo, retErr error) {
func() { a.Log(request, nil, nil, 0) }()
defer func(start time.Time) { a.Log(request, response, retErr, time.Since(start)) }(time.Now())
return a.driver.finishTransaction(ctx, request.Transaction)
}
func (a *apiServer) DeleteAll(ctx context.Context, request *transaction.DeleteAllRequest) (response *types.Empty, retErr error) {
func() { a.Log(request, nil, nil, 0) }()
defer func(start time.Time) { a.Log(request, response, retErr, time.Since(start)) }(time.Now())
_, err := col.NewSTM(ctx, a.driver.etcdClient, func(stm col.STM) error {
return a.driver.deleteAll(ctx, stm, nil)
})
if err != nil {
return nil, err
}
return &types.Empty{}, nil
}
// AppendRequest is not an RPC, but is called from other systems in pachd to
// add an operation to an existing transaction.
func (a *apiServer) AppendRequest(ctx context.Context, txn *transaction.Transaction, request *transaction.TransactionRequest) (response *transaction.TransactionResponse, retErr error) {
func() { a.Log(request, nil, nil, 0) }()
defer func(start time.Time) { a.Log(request, response, retErr, time.Since(start)) }(time.Now())
items := []*transaction.TransactionRequest{request}
info, err := a.driver.appendTransaction(ctx, txn, items)
if err != nil {
return nil, err
}
return info.Responses[len(info.Responses)-1], nil
}