chrislu
2 years ago
2 changed files with 1 additions and 121 deletions
@ -1,97 +0,0 @@ |
|||
package wdclient |
|||
|
|||
import ( |
|||
"bufio" |
|||
"bytes" |
|||
"fmt" |
|||
"github.com/seaweedfs/seaweedfs/weed/glog" |
|||
"github.com/seaweedfs/seaweedfs/weed/pb" |
|||
"github.com/seaweedfs/seaweedfs/weed/util" |
|||
"github.com/seaweedfs/seaweedfs/weed/wdclient/net2" |
|||
"io" |
|||
"net" |
|||
"time" |
|||
) |
|||
|
|||
// VolumeTcpClient put/get/delete file chunks directly on volume servers without replication
|
|||
type VolumeTcpClient struct { |
|||
cp net2.ConnectionPool |
|||
} |
|||
|
|||
type VolumeTcpConn struct { |
|||
net.Conn |
|||
bufWriter *bufio.Writer |
|||
bufReader *bufio.Reader |
|||
} |
|||
|
|||
func NewVolumeTcpClient() *VolumeTcpClient { |
|||
MaxIdleTime := 10 * time.Second |
|||
return &VolumeTcpClient{ |
|||
cp: net2.NewMultiConnectionPool(net2.ConnectionOptions{ |
|||
MaxActiveConnections: 16, |
|||
MaxIdleConnections: 1, |
|||
MaxIdleTime: &MaxIdleTime, |
|||
DialMaxConcurrency: 0, |
|||
Dial: func(network string, address string) (net.Conn, error) { |
|||
conn, err := net.Dial(network, address) |
|||
return &VolumeTcpConn{ |
|||
conn, |
|||
bufio.NewWriter(conn), |
|||
bufio.NewReader(conn), |
|||
}, err |
|||
}, |
|||
NowFunc: nil, |
|||
ReadTimeout: 0, |
|||
WriteTimeout: 0, |
|||
}), |
|||
} |
|||
} |
|||
func (c *VolumeTcpClient) PutFileChunk(volumeServerAddress string, fileId string, fileSize uint32, fileReader io.Reader) (err error) { |
|||
|
|||
tcpAddress, parseErr := pb.ParseServerAddress(volumeServerAddress, 20000) |
|||
if parseErr != nil { |
|||
return parseErr |
|||
} |
|||
|
|||
c.cp.Register("tcp", tcpAddress) |
|||
tcpConn, getErr := c.cp.Get("tcp", tcpAddress) |
|||
if getErr != nil { |
|||
return fmt.Errorf("get connection to %s: %v", tcpAddress, getErr) |
|||
} |
|||
conn := tcpConn.RawConn().(*VolumeTcpConn) |
|||
defer func() { |
|||
if err != nil { |
|||
tcpConn.DiscardConnection() |
|||
} else { |
|||
tcpConn.ReleaseConnection() |
|||
} |
|||
}() |
|||
|
|||
buf := []byte("+" + fileId + "\n") |
|||
_, err = conn.bufWriter.Write([]byte(buf)) |
|||
if err != nil { |
|||
return |
|||
} |
|||
util.Uint32toBytes(buf[0:4], fileSize) |
|||
_, err = conn.bufWriter.Write(buf[0:4]) |
|||
if err != nil { |
|||
return |
|||
} |
|||
_, err = io.Copy(conn.bufWriter, fileReader) |
|||
if err != nil { |
|||
return |
|||
} |
|||
conn.bufWriter.Write([]byte("!\n")) |
|||
conn.bufWriter.Flush() |
|||
|
|||
ret, _, err := conn.bufReader.ReadLine() |
|||
if err != nil { |
|||
glog.V(0).Infof("upload by tcp: %v", err) |
|||
return |
|||
} |
|||
if !bytes.HasPrefix(ret, []byte("+OK")) { |
|||
glog.V(0).Infof("upload by tcp: %v", string(ret)) |
|||
} |
|||
|
|||
return nil |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue