Links v2: Remove the graphdb. Replace with code and json structure.

This is a rewrite of the graphdb and replaces all naming and aliasing functionality. The new architecture is called a "container index" and was based 

**Bugs**: notably `docker ps -a` from earlier versions will panic if there are containers to list, because of a string handling bug. I really don't want to lose this patch over this, so suggestions for a workable fix are welcome.

More patches will likely need to be filed to deal with alias management and links. The focus here is to replace graphdb in a backwards-compatible fashion.

This code still imports graphdb for the purposes of the migrating data from one format to another. At some point this code should be removed, maybe in 1.5 or 1.6. It will improve build time dramatically. :)

The migration is not tested but many other features are. Tests for the index itself are largely a side-effect of the integration-cli tests and other integrations.

Many tests were rewritten to accommodate the new naming system (which contains no syntax) but otherwise are unchanged to preserve the tests. In a few minor cases tests were removed because they were no longer relevant, e.g., tests that turn the links structure into a graphdb path and then test that path.

Don't merge this until links is completely ready. Please let me know if you have any other questions.



On Sep 20, 2014, at 12:16 PM, Alexandr Morozov <notifications@github.com> wrote:

> In daemon/index.go:
> 
> > +	// the file is closed later if there are no errors. this is a noop at that point.
> > +	defer f.Close()
> > +
> > +	content, err := json.Marshal(c)
> > +	if err != nil {
> > +		return err
> > +	}
> > +
> > +	if _, err := f.Write(content); err != nil {
> > +		return err
> > +	}
> > +
> > +	f.Close()
> > +
> > +	os.Remove(c.indexPath)
> > +	if err := os.Link(f.Name(), c.indexPath); err != nil {
> Why not just move file and remove Tmp? I think that link on tmp file is not very reliable. Also, seems like under lock you can do just WriteFile. We do this already in container.ToDisk and we don't saw corrupted container files(but probably your way is better).
> 
> 

This should be atomic. The issue here is when docker stops and starts very quickly. We don’t want to just truncate the file.