couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrew Tunnell-Jones <and...@tj.id.au>
Subject Re: Peer-to-Peer Replication
Date Sat, 23 Apr 2011 01:31:22 GMT
On Sat, Apr 9, 2011 at 8:15 AM, Andrew Tunnell-Jones <andrew@tj.id.au> wrote:
> Sending this from a mobile so excuse my brevity -- GameKit is essentially Bonjour + stuff,
Bonjour is just DNSSD (in the protocol sense) which in turn is what Avahi does. Avahi provide
a compatibility wrapper which emulates much of Apples DNSSD API. The Erlang interface I mentioned
wraps the Apple DNSSD API so in theory it'll work on iOS, OS X, Windows and Linux.

I've since ported the Erlang interface[1] to Windows and made an
exploratory 'couch_dnssd'[2] module to get a feel for how things fit
together in CouchDB. The following is a brief outline of what the
module currently does which I'm sharing so that I can get some input
on what it should do. Keep in mind it's just a quick hack and is by no
means complete.

If Couch's httpd is not bound to a loopback address a service is
registered under the type _http._tcp with the subtype _couchdb. The
services name is generated from the user and machine Couch is running
on - eg: "atj's CouchDB on atj-mbp".

As the service is registered under the type _http._tcp DNSSD aware web
browsers (of the big ones, Safari, IE with a plugin and Firefox with
an Extension on OS X/Win) will be able to find the service. For these
browsers, a path parameter of '/_utils/' is specified in the service's
registration so that they'll navigate directly to futon.

Both the path and the service's name can be overridden by specifying
them in local.ini. Browsing and resolving instances is done as
follows:

To get a list of instances, issue a GET on '/_dnssd':
$ curl http://127.0.0.1:5984/_dnssd
[{"name":"another couch","domain":"local."},{"name":"another
couch","domain":"bonjour.tj.id.au."}]

Add a domain (trailing period optional) to the path to filter the list
to services in that domain:
$ curl http://127.0.0.1:5984/_dnssd/local
[{"name":"another couch","domain":"local."}]

Finally, add a service name to the path to resolve the hostname and
port of that instance:
$ curl http://127.0.0.1:5984/_dnssd/local/another%20couch
{"hostname":"atj-mbp.local.","port":5986}

The above functionality is pretty bare but I'm hoping it's enough to
seed some ideas as to what DNSSD in Couch could be used for. My
interest is primarily in building out opportunistic replication
(replicating whenever connectivity is available) but I'm sure theres
other areas where it could be useful. What functionality would you
like to see available?

— Andrew

1. https://github.com/andrewtj/dnssd_erlang
2. https://gist.github.com/936314

Mime
View raw message