Mercurial > hg > silvermirror
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:abb358e2434c |
---|---|
1 SilverMirror Whitepaper | |
2 | |
3 It is necessary to maintain parallel directory structures of various | |
4 resources across an arbitrary number of computers. The traditional | |
5 approach is the central server model, where files live in one | |
6 canonical location and the network is used to give access to the data. | |
7 However, this model has deficiencies, chiefly among them that if the | |
8 server goes down or must be moved a considerable amount of effort must | |
9 be extended to set up a new central server. | |
10 | |
11 Distributed version control, often of nominal use (in the case where a | |
12 canonical trunk exists) is ideally suited to provide mirroring of | |
13 desired resources across computers. | |
14 | |
15 Implementation | |
16 | |
17 A front end to a DVCS - most likely mercurial but potentially bzr - | |
18 will be written to keep resources in sync across an arbitrary number | |
19 of computers. The front end, called SilverMirror, may be used to push | |
20 or pull changes to resources. Optionally, a daemon will monitor | |
21 changes to resources and push or pull changes at desired intervals. | |
22 | |
23 The use should be as natural as possible and require no interaction | |
24 for everday tasks. A resource consists of a directory and all | |
25 subdirectories and their contents. Once a resource is denoted as | |
26 versioned, any change to the resource's directory structure should be | |
27 mirrored across machines without user intervention. Files matching a | |
28 pattern may be ignored, either globally or on a per resource basis, | |
29 for the purpose of versioning. | |
30 | |
31 Configuration | |
32 | |
33 SilverMirror is configured via an INI file containing a section for | |
34 each resource and a section for application configuration. | |
35 | |
36 The main section, denoted [::SilverMirror::], has the following options: | |
37 | |
38 * directory: base directory for SilverMirror. The SilverMirror | |
39 configuration is stored in ${directory}/.silvermirror . If omitted, | |
40 the user's home directory is used. | |
41 | |
42 * ignore: global patterns of files and directories to ignore. Paths | |
43 matching these patterns will not be versioned. | |
44 | |
45 Each section has the following configuration options: | |
46 | |
47 * directory: path of the resource. If a relative path is used, it is | |
48 joined with the directory setting from the main section. If this | |
49 setting is not specified, the section name is used as a relative path. | |
50 | |
51 * ignore: paths not to version on a per resource basis. This is in | |
52 addition to the patterns specified by the ignore setting in the main | |
53 section. | |
54 | |
55 * conflict: handler to resolve conflict. | |
56 | |
57 * hosts: hosts to push/pull from | |
58 | |
59 In order to ensure coherency among resources, all relevant | |
60 configuration options must be synced prior to push/pull transactions. | |
61 | |
62 Default Configuration: | |
63 | |
64 [::SilverMirror::] | |
65 conflict = ClobberRemote | |
66 | |
67 Example of a more complex configuration: | |
68 | |
69 [::SilverMirror::] | |
70 conflict.push = ClobberRemote | |
71 conflict.pull = ClobberLocal | |
72 | |
73 Push | |
74 | |
75 Push changes to remote resources. When resources are pushed, first | |
76 changes are pulled from each remote host in turn, conflicts between | |
77 local and remote changes are resolved (see Behavior on Conflicts), | |
78 then local modifications are pushed. This is done to keep the | |
79 resources in sync. | |
80 | |
81 When new files are added to the resource they are automatically added | |
82 to the hg repository. When resource files are edited the changes are | |
83 pushed to the repository. When a conflict occurs between local | |
84 resources and remote resources, the conflict handler is used. | |
85 | |
86 Pull | |
87 | |
88 Get changes to the cloud filesystem resources. If no host is | |
89 specified, pull changes from all known + accessible hosts. | |
90 | |
91 Namespaced Resources | |
92 | |
93 It is possible to maintain versioning of a subdirectory within a | |
94 resource. | |
95 | |
96 Example: | |
97 | |
98 [docs] | |
99 directory = /path/to/docs | |
100 | |
101 [docs:private] | |
102 | |
103 This configuration snippet describes a resource, [docs:private], | |
104 namespaced within the [docs] resource. [docs:private] inherits | |
105 configuration and behavior from [docs] but may be dealt with | |
106 separately. For example, some computers in the cloud may not have | |
107 [docs:private] specified in their configuration and so will not get a | |
108 copy of it upon pulling. A common use case is specifying a | |
109 subdirectory to be omitted with the ignore option in the configuration | |
110 file, then, when this subdirectory needs to be shared between multiple | |
111 computers, removing it from the ignore values and including as a | |
112 namespaced resource. | |
113 | |
114 In the above example, because the directory option was not specified | |
115 in the [docs:private] section, the path to [docs:private] is taken | |
116 from its namespace (private) and the directory of its parent resource. | |
117 So its base directory is /path/to/docs/private . If a relative path | |
118 was specified in the directory option of the [docs:private] section, | |
119 it would be joined with the base directory of [docs]. | |
120 | |
121 Behavior on Conflicts | |
122 | |
123 Conflict handlers are set via setuptools entry points. Several | |
124 conflict handlers are provided with SilverMirror: | |
125 | |
126 * ClobberLocal: replace local changes with changes from remote files | |
127 | |
128 * ClobberRemote: replace remote file changes with changes from local | |
129 files | |
130 | |
131 * Edit: invoke an editor (default: $EDITOR) to interactively resolve | |
132 the conflicts | |
133 | |
134 The conflict handler may also be specified from the command line: | |
135 | |
136 silvermirror push -d ClobberRemote | |
137 | |
138 Command Line Usage | |
139 | |
140 silvermirror [push|pull] [resource] [options] | |
141 | |
142 In the simplest invocation, SilverMirror is used with no command line | |
143 arguments: | |
144 | |
145 silvermirror | |
146 | |
147 This pushes changes of the resource as determined by the current | |
148 working directory after pulling outstanding changes from all | |
149 applicable remote computers and invoking the conflict handler for | |
150 push. If the current working directory is not within a resource, all | |
151 resources will be pushed. | |
152 | |
153 Finer control is obtained by specifying command line arguments: | |
154 | |
155 [push|pull] : whether to use the push method (which includes pulling | |
156 for changes; see above) or the pull method. If not specified, the | |
157 resource is pushed. | |
158 | |
159 [resource] : which resource to act upon. This can be the resource | |
160 name, as specified in the .ini file, or the path to the base directory | |
161 of the resource. Note that if a path is specified, it must be to the | |
162 base directory of the resource as SilverMirror has no notion of | |
163 disparate versioning within a resource. If the resource is not | |
164 specified, the resource that the current working directory is within | |
165 is used. If the current working directory is not in a resource path, | |
166 all resources are acted upon in turn. If the key word "--all" is used, | |
167 all resources will also be acted upon. | |
168 | |
169 [options] : several command line switches are available to the | |
170 silvermirror program: | |
171 | |
172 * -d <handler> : specify which conflict handler to use. <handler> | |
173 should be the name of the desired conflict handler. A list of all | |
174 conflict handlers is available with the "--conflict-handlers" option. | |
175 | |
176 * -H <host>, --host=<host> : pull and/or push only to specified | |
177 hosts. If this option is used more than once, the hosts specified will | |
178 be acted upon. | |
179 | |
180 * --conflict-handlers : list the name and description (if | |
181 specified) for all available conflict handlers. | |
182 | |
183 * --help : displays help and usage information | |
184 | |
185 Behavior Respecting Versioned Directories | |
186 | |
187 SilverMirror does not desire to duplicate versioning on directories | |
188 already under version control (svn, bzr, hg). These resources are | |
189 automatically ignore. In a future implementation, these resources | |
190 would optionally be checked out or updated upon a pull. | |
191 | |
192 Automatic Syncronization | |
193 | |
194 SilverMirror includes a script that will automatically invoke | |
195 syncronizing the resources in a specified period of time. This daemon, | |
196 called silvermirrord, is invoked from the command line with options | |
197 parallel to the silvermirror program. One additional option, -s, tells | |
198 how many seconds between syncs. Upon invocation, this program puts | |
199 itself in the background and performs the desired sync every number of | |
200 seconds specified. It is important that the conflict handler specified | |
201 is noninteractive, otherwise the daemon will hang forever. | |
202 | |
203 As an alternative, the silvermirror program may be invoked from a cron | |
204 job. | |
205 | |
206 Future Work | |
207 | |
208 SilverMirror implements a cloud filesystem which may be accessed | |
209 nearly transparently by an arbitrary number of computers. Several | |
210 improvements could extend SilverMirror to solve several deficiencies | |
211 of modern filesystem. | |
212 | |
213 * tagging: in most filesystems, a file has a canonical location. | |
214 However, it may be desirable to have the file accesible via multiple | |
215 paths. In practice, this is achieved via symbolic links. However, this | |
216 requires manual maintaince of links vs the canonical location. Noting | |
217 that this problem is identical to tagging, a solution minimizing | |
218 manual intervention could be added to SilverMirror. | |
219 | |
220 * update of web documents: modern computers deal heavily with | |
221 documents via URLs. It is noted that this includes files, the URL of a | |
222 file with path ${PATH} being file://${PATH} noted implicitly from | |
223 contexts. However, existing shells and operating systems have no | |
224 mechanism for indicating that a "file" is a web resource. Such | |
225 functionality could be added to SilverMirror so that up-to-date | |
226 versions of web resources could be maintained. This infrastructure | |
227 could also include notions for updating versioned resources (see | |
228 Behavior Respecting Versioned Directories) with parallel notation. |