本文整理汇总了Golang中github.com/Symantec/Dominator/lib/srpc.Conn类的典型用法代码示例。如果您正苦于以下问题:Golang Conn类的具体用法?Golang Conn怎么用?Golang Conn使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Conn类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: connect
func (m *Manager) connect(conn *srpc.Conn) error {
defer conn.Flush()
clientChannel := make(chan *proto.ServerMessage, 4096)
m.rwMutex.Lock()
m.clients[clientChannel] = clientChannel
m.rwMutex.Unlock()
defer func() {
m.rwMutex.Lock()
delete(m.clients, clientChannel)
m.rwMutex.Unlock()
}()
closeNotifyChannel := make(chan struct{})
// The client must keep the same encoder/decoder pair over the lifetime
// of the connection.
go m.handleClientRequests(gob.NewDecoder(conn), clientChannel,
closeNotifyChannel)
encoder := gob.NewEncoder(conn)
for {
select {
case serverMessage := <-clientChannel:
if err := encoder.Encode(serverMessage); err != nil {
m.logger.Printf("error encoding ServerMessage: %s\n", err)
return err
}
if len(clientChannel) < 1 {
if err := conn.Flush(); err != nil {
m.logger.Printf("error flushing: %s\n", err)
return err
}
}
case <-closeNotifyChannel:
return nil
}
}
}
示例2: GetFiles
func (t *rpcType) GetFiles(conn *srpc.Conn) error {
defer conn.Flush()
t.getFilesLock.Lock()
defer t.getFilesLock.Unlock()
encoder := gob.NewEncoder(conn)
numFiles := 0
for ; ; numFiles++ {
filename, err := conn.ReadString('\n')
if err != nil {
return err
}
filename = filename[:len(filename)-1]
if filename == "" {
break
}
filename = path.Join(t.rootDir, filename)
if err := processFilename(conn, filename, encoder); err != nil {
return err
}
}
plural := "s"
if numFiles == 1 {
plural = ""
}
t.logger.Printf("GetFiles(): %d file%s provided\n", numFiles, plural)
return nil
}
示例3: addObjects
func addObjects(conn *srpc.Conn, adder ObjectAdder, logger *log.Logger) error {
defer conn.Flush()
decoder := gob.NewDecoder(conn)
encoder := gob.NewEncoder(conn)
numAdded := 0
numObj := 0
for ; ; numObj++ {
var request objectserver.AddObjectRequest
var response objectserver.AddObjectResponse
if err := decoder.Decode(&request); err != nil {
if err == io.EOF || err == io.ErrUnexpectedEOF {
break
}
return err
}
if request.Length < 1 {
break
}
response.Hash, response.Added, response.Error =
adder.AddObject(conn, request.Length, request.ExpectedHash)
if response.Added {
numAdded++
}
if err := encoder.Encode(response); err != nil {
return err
}
if response.Error != nil {
logger.Printf("AddObjects(): failed, %d of %d are new objects %s",
numAdded, numObj, response.Error.Error())
return nil
}
}
logger.Printf("AddObjects(): %d of %d are new objects", numAdded, numObj)
return nil
}
示例4: ListImages
func (t *srpcType) ListImages(conn *srpc.Conn) error {
for _, name := range t.imageDataBase.ListImages() {
if _, err := conn.WriteString(name + "\n"); err != nil {
return err
}
}
_, err := conn.WriteString("\n")
return err
}
示例5: ConfigureSubs
func (t *rpcType) ConfigureSubs(conn *srpc.Conn,
request dominator.ConfigureSubsRequest,
reply *dominator.ConfigureSubsResponse) error {
if conn.Username() == "" {
t.logger.Printf("ConfigureSubs()\n")
} else {
t.logger.Printf("ConfigureSubs(): by %s\n", conn.Username())
}
return t.herd.ConfigureSubs(sub.Configuration(request))
}
示例6: EnableUpdates
func (t *rpcType) EnableUpdates(conn *srpc.Conn,
request dominator.EnableUpdatesRequest,
reply *dominator.EnableUpdatesResponse) error {
if conn.Username() == "" {
t.logger.Printf("EnableUpdates(%s)\n", request.Reason)
} else {
t.logger.Printf("EnableUpdates(%s): by %s\n",
request.Reason, conn.Username())
}
return t.herd.EnableUpdates()
}
示例7: ClearSafetyShutoff
func (t *rpcType) ClearSafetyShutoff(conn *srpc.Conn,
request dominator.ClearSafetyShutoffRequest,
reply *dominator.ClearSafetyShutoffResponse) error {
if conn.Username() == "" {
t.logger.Printf("ClearSafetyShutoff(%s)\n", request.Hostname)
} else {
t.logger.Printf("ClearSafetyShutoff(%s): by %s\n",
request.Hostname, conn.Username())
}
return t.herd.ClearSafetyShutoff(request.Hostname)
}
示例8: CheckObjects
func (t *srpcType) CheckObjects(conn *srpc.Conn,
request objectserver.CheckObjectsRequest,
reply *objectserver.CheckObjectsResponse) error {
sizes, err := t.objectServer.CheckObjects(request.Hashes)
if err != nil {
_, err = conn.WriteString(err.Error() + "\n")
return err
}
reply.ObjectSizes = sizes
return nil
}
示例9: getCloseNotifier
func getCloseNotifier(conn *srpc.Conn) <-chan error {
closeChannel := make(chan error)
go func() {
for {
buf := make([]byte, 1)
if _, err := conn.Read(buf); err != nil {
closeChannel <- err
return
}
}
}()
return closeChannel
}
示例10: DeleteUnreferencedObjects
func (t *srpcType) DeleteUnreferencedObjects(conn *srpc.Conn,
request imageserver.DeleteUnreferencedObjectsRequest,
reply *imageserver.DeleteUnreferencedObjectsResponse) error {
username := conn.Username()
if username == "" {
t.logger.Printf("DeleteUnreferencedObjects(%d%%, %s)\n",
request.Percentage, format.FormatBytes(request.Bytes))
} else {
t.logger.Printf("DeleteUnreferencedObjects(%d%%, %s) by %s\n",
request.Percentage, format.FormatBytes(request.Bytes), username)
}
return t.imageDataBase.DeleteUnreferencedObjects(request.Percentage,
request.Bytes)
}
示例11: MakeDirectory
func (t *srpcType) MakeDirectory(conn *srpc.Conn,
request imageserver.MakeDirectoryRequest,
reply *imageserver.MakeDirectoryResponse) error {
username := conn.Username()
if err := t.checkMutability(); err != nil {
return err
}
if username == "" {
t.logger.Printf("MakeDirectory(%s)\n", request.DirectoryName)
} else {
t.logger.Printf("MakeDirectory(%s) by %s\n",
request.DirectoryName, username)
}
return t.imageDataBase.MakeDirectory(request.DirectoryName, username)
}
示例12: ChownDirectory
func (t *srpcType) ChownDirectory(conn *srpc.Conn,
request imageserver.ChangeOwnerRequest,
reply *imageserver.ChangeOwnerResponse) error {
username := conn.Username()
if username == "" {
return errors.New("no username: unauthenticated connection")
}
if request.OwnerGroup != "" {
if _, err := user.LookupGroup(request.OwnerGroup); err != nil {
return err
}
}
t.logger.Printf("ChownDirectory(%s) to: \"%s\" by %s\n",
request.DirectoryName, request.OwnerGroup, username)
return t.imageDataBase.ChownDirectory(request.DirectoryName,
request.OwnerGroup)
}
示例13: DeleteImage
func (t *srpcType) DeleteImage(conn *srpc.Conn,
request imageserver.DeleteImageRequest,
reply *imageserver.DeleteImageResponse) error {
username := conn.Username()
if err := t.checkMutability(); err != nil {
return err
}
if !t.imageDataBase.CheckImage(request.ImageName) {
return errors.New("image does not exist")
}
if username == "" {
t.logger.Printf("DeleteImage(%s)\n", request.ImageName)
} else {
t.logger.Printf("DeleteImage(%s) by %s\n", request.ImageName, username)
}
return t.imageDataBase.DeleteImage(request.ImageName, &username)
}
示例14: GetMdbUpdates
func (t *rpcType) GetMdbUpdates(conn *srpc.Conn) error {
encoder := gob.NewEncoder(conn)
updateChannel := make(chan mdbserver.MdbUpdate, 1)
t.rwMutex.Lock()
t.updateChannels[conn] = updateChannel
t.rwMutex.Unlock()
mdbUpdate := mdbserver.MdbUpdate{MachinesToAdd: t.currentMdb.Machines}
if err := encoder.Encode(mdbUpdate); err != nil {
return nil
}
if err := conn.Flush(); err != nil {
return nil
}
closeChannel := getCloseNotifier(conn)
for {
var err error
select {
case mdbUpdate := <-updateChannel:
if err = encoder.Encode(mdbUpdate); err != nil {
break
}
if err = conn.Flush(); err != nil {
break
}
case err = <-closeChannel:
break
}
if err != nil {
t.rwMutex.Lock()
delete(t.updateChannels, conn)
t.rwMutex.Unlock()
if err != io.EOF {
t.logger.Println(err)
return err
} else {
return nil
}
}
}
}
示例15: sendClientRequests
func sendClientRequests(conn *srpc.Conn,
clientRequestChannel <-chan *proto.ClientRequest,
closeNotifyChannel <-chan struct{}, logger *log.Logger) {
encoder := gob.NewEncoder(conn)
for {
select {
case clientRequest := <-clientRequestChannel:
if err := encoder.Encode(clientRequest); err != nil {
logger.Printf("error encoding client request: %s\n", err)
return
}
if len(clientRequestChannel) < 1 {
if err := conn.Flush(); err != nil {
logger.Printf("error flushing: %s\n", err)
return
}
}
case <-closeNotifyChannel:
return
}
}
}