Giter VIP home page Giter VIP logo

Comments (6)

colinmarc avatar colinmarc commented on July 28, 2024

Sorry for the late response here!

net already has an interface for this: net.Dialer. It should be an option for Client - and then used for both the namenode connection and the blockwriter connections - but we're getting to kind of an awkward place with so many options. Might be time to add a ClientOptions thingy, and deprecate the old constructors.

from hdfs.

colinmarc avatar colinmarc commented on July 28, 2024

Sorry, as soon as I hit post I realized net.Dialer is a struct, not an interface. That makes it a bit trickier, but I think we can take net/https approach and have a DialFunc func(network, address string) (net.Conn, error) option.

(net.Dialer lets you specify a timeout which is used when you call Dial; DialTimeout is just a convenience method for that.)

from hdfs.

advincze avatar advincze commented on July 28, 2024

i think we should also use rather net.DialContext since that is the recommended way now.

for the interface

we could do something like this (since New(....) is already taken):

type ClientOptions struct {
	Address     string
	Username    string
	DialFunc    func(ctx context.Context, network, addr string) (net.Conn, error)
}

func NewClient(options ClientOptions) (*Client, error)

alternatively i also like the functional options pattern that would looke something like this:

type ClientOption func(*Client) error

func Address(address string) ClientOption
func Username(username string) ClientOption
func DialFunc(dialFn func(ctx context.Context, network, addr string) (net.Conn, error)) ClientOption

func NewClient(options ..ClientOption) (*Client, error)

and it could be used like this:

func main(){
	dialer, err := proxy.SOCKS5("tcp", "localhost:8157", nil, proxy.Direct)
	if err != nil {
		panic(err)
	}


	hdfsCli, err := hdfs.NewClient(
		hdfs.Address("127.0.0.1:8020"), 
		hdfs.Username("hadoop"),
		hdfs.DialFunc(dialer.Dial),
	)

}

this does not entirely work for my usecase since proxy does not have DialContext yet , but it will eventually, and for the time being it can be wrapped

in both cases one would have to pass the DialFunc to the BlockWriter. It could be done by passing it to NamenodeConnection.

what do you think ?

from hdfs.

colinmarc avatar colinmarc commented on July 28, 2024

The former sounds right - and you're totally correct about DialContext rather than Dial. Let me take a stab at the options thing without a dialfunc first.

from hdfs.

colinmarc avatar colinmarc commented on July 28, 2024

Ok, this is going to be a bit painful. We need to thread the dialer down into:

  • BlockReader and ChecksumReader (and deprecate NewBlockReader, or something)
  • BlockWriter (this takes the NamenodeConnection, though, so the signature doesn't need to change there)
  • NamenodeConnection (which means deprecating NewNamenodeConnection)
  • and, of course, Client

from hdfs.

colinmarc avatar colinmarc commented on July 28, 2024

With #77, there now exists a ClientOptions struct, so this should now be implementable.

from hdfs.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.