Description
i need to interact with HDFS inside a private subnet in AWS over a secure jumphost and am currently doing that over a sock5 proxy.
i submitted #62 to be able to setup the namenode connection and pass it to the client.
this works for the cases where i only need to talk to the metadata server.
However, if i want to write to a file, the blockwriter opens a non proxy connection, which does not work for me:
func (bw *BlockWriter) connectNext() error {
address := getDatanodeAddress(bw.currentPipeline()[0])
conn, err := net.DialTimeout("tcp", address, connectTimeout)
if err != nil {
return err
}
...
here i need to setup the proxy again
dialer, err := proxy.SOCKS5("tcp", "localhost:8157", nil, proxy.Direct)
if err != nil {
panic(err)
}
conn, err := dialer.Dial("tcp", address)
if err != nil {
return err
}
I'd be happy to submit a patch but am not sure about what interface would be best here
the connection in both rpc.NewNamenodeConnection
and rpc.BlockWriter.connectNext()
are both using
conn, err := net.DialTimeout("tcp", address, connectTimeout)
so this could be generalized to use a
type DialerTimeout interface {
DialTimeout(network, address string, timeout time.Duration) (net.Conn, error)
}
or a
type DialerTimeoutFunc func(network, address string, timeout time.Duration) (net.Conn, error)
but that could not be set in NewNamenodeConnection
anymore before making the connection
Or, in NamenodeConnection
I could add this field
type NamenodeConnection struct {
...
BlockWriterDialTimeout func(network, address string, timeout time.Duration) (net.Conn, error)
...
and rpc.BlockWriter
could use it if not nil
or do you have a better suggestion?