diff silvermirror-whitepaper.txt @ 0:abb358e2434c

initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
author k0s <k0scist@gmail.com>
date Mon, 07 Sep 2009 15:39:06 -0400
parents
children 9b139702a8f9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/silvermirror-whitepaper.txt	Mon Sep 07 15:39:06 2009 -0400
@@ -0,0 +1,228 @@
+SilverMirror Whitepaper
+
+It is necessary to maintain parallel directory structures of various  
+resources across an arbitrary number of computers. The traditional  
+approach is the central server model, where files live in one  
+canonical location and the network is used to give access to the data.  
+However, this model has deficiencies, chiefly among them that if the  
+server goes down or must be moved a considerable amount of effort must  
+be extended to set up a new central server.
+
+Distributed version control, often of nominal use (in the case where a  
+canonical trunk exists) is ideally suited to provide mirroring of  
+desired resources across computers.
+
+Implementation
+
+A front end to a DVCS - most likely mercurial but potentially bzr -  
+will be written to keep resources in sync across an arbitrary number  
+of computers. The front end, called SilverMirror, may be used to push  
+or pull changes to resources. Optionally, a daemon will monitor  
+changes to resources and push or pull changes at desired intervals.
+
+The use should be as natural as possible and require no interaction  
+for everday tasks. A resource consists of a directory and all  
+subdirectories and their contents. Once a resource is denoted as  
+versioned, any change to the resource's directory structure should be  
+mirrored across machines without user intervention. Files matching a  
+pattern may be ignored, either globally or on a per resource basis,  
+for the purpose of versioning.
+
+Configuration
+
+SilverMirror is configured via an INI file containing a section for  
+each resource and a section for application configuration.
+
+The main section, denoted [::SilverMirror::], has the following options:
+
+  * directory: base directory for SilverMirror. The SilverMirror  
+configuration is stored in ${directory}/.silvermirror . If omitted,  
+the user's home directory is used.
+
+  * ignore: global patterns of files and directories to ignore. Paths  
+matching these patterns will not be versioned.
+
+Each section has the following configuration options:
+
+  * directory: path of the resource. If a relative path is used, it is  
+joined with the directory setting from the main section. If this  
+setting is not specified, the section name is used as a relative path.
+
+  * ignore: paths not to version on a per resource basis. This is in  
+addition to the patterns specified by the ignore setting in the main  
+section.
+
+  * conflict: handler to resolve conflict.
+
+  * hosts: hosts to push/pull from
+
+In order to ensure coherency among resources, all relevant  
+configuration options must be synced prior to push/pull transactions.
+
+Default Configuration:
+
+[::SilverMirror::]
+conflict = ClobberRemote
+
+Example of a more complex configuration:
+
+[::SilverMirror::]
+conflict.push = ClobberRemote
+conflict.pull = ClobberLocal
+
+Push
+
+Push changes to remote resources. When resources are pushed, first  
+changes are pulled from each remote host in turn, conflicts between  
+local and remote changes are resolved (see Behavior on Conflicts),  
+then local modifications are pushed. This is done to keep the  
+resources in sync.
+
+When new files are added to the resource they are automatically added  
+to the hg repository. When resource files are edited the changes are  
+pushed to the repository. When a conflict occurs between local  
+resources and remote resources, the conflict handler is used.
+
+Pull
+
+Get changes to the cloud filesystem resources. If no host is  
+specified, pull changes from all known + accessible hosts.
+
+Namespaced Resources
+
+It is possible to maintain versioning of a subdirectory within a  
+resource.
+
+Example:
+
+[docs]
+directory = /path/to/docs
+
+[docs:private]
+
+This configuration snippet describes a resource, [docs:private],  
+namespaced within the [docs] resource. [docs:private] inherits  
+configuration and behavior from [docs] but may be dealt with  
+separately. For example, some computers in the cloud may not have  
+[docs:private] specified in their configuration and so will not get a  
+copy of it upon pulling. A common use case is specifying a  
+subdirectory to be omitted with the ignore option in the configuration  
+file, then, when this subdirectory needs to be shared between multiple  
+computers, removing it from the ignore values and including as a  
+namespaced resource.
+
+In the above example, because the directory option was not specified  
+in the [docs:private] section, the path to [docs:private] is taken  
+from its namespace (private) and the directory of its parent resource.  
+So its base directory  is /path/to/docs/private . If a relative path  
+was specified in the directory option of the [docs:private] section,  
+it would be joined with the base directory of [docs].
+
+Behavior on Conflicts
+
+Conflict handlers are set via setuptools entry points. Several  
+conflict handlers are provided with SilverMirror:
+
+  * ClobberLocal: replace local changes with changes from remote files
+
+  * ClobberRemote: replace remote file changes with changes from local  
+files
+
+  * Edit: invoke an editor (default: $EDITOR) to interactively resolve  
+the conflicts
+
+The conflict handler may also be specified from the command line:
+
+silvermirror push -d ClobberRemote
+
+Command Line Usage
+
+silvermirror [push|pull] [resource] [options]
+
+In the simplest invocation, SilverMirror is used with no command line  
+arguments:
+
+silvermirror
+
+This pushes changes of the resource as determined by the current  
+working directory after pulling outstanding changes from all  
+applicable remote computers and invoking the conflict handler for  
+push. If the current working directory is not within a resource, all  
+resources will be pushed.
+
+Finer control is obtained by specifying command line arguments:
+
+[push|pull] :  whether to use the push method (which includes pulling  
+for changes; see above) or the pull method. If not specified, the  
+resource is pushed.
+
+[resource] :  which resource to act upon. This can be the resource  
+name, as specified in the .ini file, or the path to the base directory  
+of the resource. Note that if a path is specified, it must be to the  
+base directory of the resource as SilverMirror has no notion of  
+disparate versioning within a resource. If the resource is not  
+specified, the resource that the current working directory is within  
+is used. If the current working directory is not in a resource path,  
+all resources are acted upon in turn. If the key word "--all" is used,  
+all resources will also be acted upon.
+
+[options] : several command line switches are available to the  
+silvermirror program:
+
+  * -d <handler> : specify which conflict handler to use. <handler>  
+should be the name of the desired conflict handler. A list of all  
+conflict handlers is available with the "--conflict-handlers" option.
+
+  * -H <host>, --host=<host> : pull and/or push only to specified  
+hosts. If this option is used more than once, the hosts specified will  
+be acted upon.
+
+  * --conflict-handlers :  list the name and description (if  
+specified) for all available conflict handlers.
+
+  * --help : displays help and usage information
+
+Behavior Respecting Versioned Directories
+
+SilverMirror does not desire to duplicate versioning on directories  
+already under version control (svn, bzr, hg). These resources are  
+automatically ignore. In a future implementation, these resources  
+would optionally be checked out or updated upon a pull.
+
+Automatic Syncronization
+
+SilverMirror includes a script that will automatically invoke  
+syncronizing the resources in a specified period of time. This daemon,  
+called silvermirrord, is invoked from the command line with options  
+parallel to the silvermirror program. One additional option, -s, tells  
+how many seconds between syncs. Upon invocation, this program puts  
+itself in the background and performs the desired sync every number of  
+seconds specified. It is important that the conflict handler specified  
+is noninteractive, otherwise the daemon will hang forever.
+
+As an alternative, the silvermirror program may be invoked from a cron  
+job.
+
+Future Work
+
+SilverMirror implements a cloud filesystem which may be accessed  
+nearly  transparently by an arbitrary number of computers. Several  
+improvements could extend SilverMirror to solve several deficiencies  
+of modern filesystem.
+
+  * tagging: in most filesystems, a file has a canonical location.  
+However, it may be desirable to have the file accesible via multiple  
+paths. In practice, this is achieved via symbolic links. However, this  
+requires manual maintaince of links vs the canonical location. Noting  
+that this problem is identical to tagging, a solution minimizing  
+manual intervention could be added to SilverMirror.
+
+  * update of web documents: modern computers deal heavily with  
+documents via URLs. It is noted that this includes files, the URL of a  
+file with path ${PATH} being file://${PATH} noted implicitly from  
+contexts. However, existing shells and operating systems have no  
+mechanism for indicating that a "file" is a web resource. Such  
+functionality could be added to SilverMirror so that up-to-date
+versions of web resources could be maintained.  This infrastructure
+could also include notions for updating versioned resources (see
+Behavior Respecting Versioned Directories) with parallel notation.