forked from daos-stack/daos
/
mgmt_drpc.go
108 lines (89 loc) · 3.32 KB
/
mgmt_drpc.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
//
// (C) Copyright 2018-2019 Intel Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// GOVERNMENT LICENSE RIGHTS-OPEN SOURCE SOFTWARE
// The Government's rights to use, modify, reproduce, release, perform, display,
// or disclose this software are subject to the terms of the Apache License as
// provided in Contract No. 8F-30005.
// Any reproduction of computer software, computer software documentation, or
// portions thereof marked with this legend must also reproduce the markings.
//
package server
import (
"github.com/golang/protobuf/proto"
"github.com/pkg/errors"
srvpb "github.com/daos-stack/daos/src/control/common/proto/srv"
"github.com/daos-stack/daos/src/control/drpc"
)
// mgmtModule represents the daos_server mgmt dRPC module. It sends dRPCs to
// the daos_io_server iosrv module (src/iosrv).
type mgmtModule struct{}
// HandleCall is the handler for calls to the mgmtModule
func (m *mgmtModule) HandleCall(session *drpc.Session, method int32, body []byte) ([]byte, error) {
return nil, drpc.UnknownMethodFailure()
}
// ID will return Mgmt module ID
func (m *mgmtModule) ID() int32 {
return drpc.ModuleMgmt
}
// srvModule represents the daos_server dRPC module. It handles dRPCs sent by
// the daos_io_server iosrv module (src/iosrv).
type srvModule struct {
iosrvs []*IOServerInstance
}
// HandleCall is the handler for calls to the srvModule.
func (mod *srvModule) HandleCall(session *drpc.Session, method int32, req []byte) ([]byte, error) {
switch method {
case drpc.MethodNotifyReady:
return nil, mod.handleNotifyReady(req)
case drpc.MethodBIOError:
return nil, mod.handleBioErr(req)
default:
return nil, drpc.UnknownMethodFailure()
}
}
func (mod *srvModule) ID() int32 {
return drpc.ModuleSrv
}
func (mod *srvModule) handleNotifyReady(reqb []byte) error {
req := &srvpb.NotifyReadyReq{}
if err := proto.Unmarshal(reqb, req); err != nil {
return drpc.UnmarshalingPayloadFailure()
}
if req.InstanceIdx >= uint32(len(mod.iosrvs)) {
return errors.Errorf("instance index %v is out of range (%v instances)",
req.InstanceIdx, len(mod.iosrvs))
}
if err := checkDrpcClientSocketPath(req.DrpcListenerSock); err != nil {
return errors.Wrap(err, "check NotifyReady request socket path")
}
mod.iosrvs[req.InstanceIdx].NotifyReady(req)
return nil
}
func (mod *srvModule) handleBioErr(reqb []byte) error {
req := &srvpb.BioErrorReq{}
if err := proto.Unmarshal(reqb, req); err != nil {
return errors.Wrap(err, "unmarshal BioError request")
}
if req.InstanceIdx >= uint32(len(mod.iosrvs)) {
return errors.Errorf("instance index %v is out of range (%v instances)",
req.InstanceIdx, len(mod.iosrvs))
}
if err := checkDrpcClientSocketPath(req.DrpcListenerSock); err != nil {
return errors.Wrap(err, "check BioErr request socket path")
}
mod.iosrvs[req.InstanceIdx].BioErrorNotify(req)
return nil
}