Versioned Storage Re: [TransWarp] Basic "storage jar" design

Phillip J. Eby pje at
Tue Jul 9 16:38:34 EDT 2002

At 02:09 PM 7/9/02 -0500, John D. Heintz wrote:
>What are your thoughts on versioning at the storage level?  Do you have
>very many actual requirements for versioning business objects?

Not really.  I generally consider versioning to be something which needs to
be an explicit part of the application domain model, and is usually not
something I want to hide in the implementation layer.

>I've been working with hyperdocuments (XML and XLink kind of stuff) the
>past few years and have gotten pretty interested in versioning linked
>information objects with the ability to flexibly manage the
>configurations of those objects. It's my opinion that stuff like
>workflow builds on lifecycle capabilities and lifecycle builds on
>versioning capabilities.  While I think these are incredibly interesting
>technical problems, I haven't yet determined if there is a strong
>business need for solutions based on these ideas.

Depends on what you mean by "workflow".  If you're talking about content
management workflow, I agree.  If you're talking about general process
workflow, versioning support usually isn't a significant part, IMHO.

>The versioning model that I've written up [1] and extended to
>hyperdocuments [2] is designed to enable policied version lookup based
>on the context of that resolution. Objects would association to each
>other not just through raw oids, but rather through some resourceId and
>other data to specify how to resolve the correct version.
>An easy example would be 1) show me the latest public version of my
>website, 2) show me what my website publicly contained on March 30th,
>and 3) show me Eliot's draft branch of the website on March 30th. In all
>of these cases I want the hyperlinks between objects to resolve to the
>versions of resources that were effective at the right point in time and
>specific "branch".

I think that I've been using the term "oid" much more flexibly than people
realize, and that everyone projects their own limited meaning of "oid" onto
my use of the term.  :)

To me, an oid is simply something that uniquely identifies an item, and
which may be used as a Python dictionary key.  That's it.  So there's
nothing that stops you from having an OID that means "newest version of
document X" or "version Y of document X".  You just need to have in the
appropriate racks, the mechanism for "understanding" such OID's and mapping
them to/from an external storage.  For example, if a field loaded by rack A
needs to refer to "item Q in rack B with the same version as me", then rack
A must look at the version of the item it's referring from, in order to
provide rack B with an OID that indicates the version to be loaded.  Does
that make sense?

>1) allowing the oid of an object to contain (resourceId,
>resolutionPolicy=None, *args). I think you already would allow this, but
>I'm being explicit. Here the *args would be policy dependent data, like
>a specific versionId. Examples of resolutionPolicy include OnSnapshot
>and Fixed. (See papers for details.)

I consider the whole issue of version-dependent retrieval to fall on the
"CTAP" side of STASCTAP; that is, "complex things are possible".  :)  So
you certainly could do something like this, but until I personally actually
try to do something that needs this, I'm not going to indulge in designing
a framework for it.  I'd rather just implement racks that embed the
specific policies I need in the application context, and then later try and
figure out what would make it easier to write lots of these, if I found
myself doing lots of these.

One issue in particular is that the versioning *mechanism* could vary
significantly by application and backend.  I know of certain applications
at the company I work for which contain data about revisions of things.  If
I wrote an application which needed to access that data, I'd need to take
into account the back-end format, so I might be limited in how much of a
generic framework I could use.

However, if you want to built atop the basic racks and other tools provided
by PEAK to offer a more advanced framework, I think that would be cool, and
if it complied or could be made to comply with PEAK architectural
requirements and standards, we could maybe even include it in the

>2) and some "versioning" Jars that can act as facades for the series of
>Snapshots and Branches from a Versioning Storage. A "versioning" Jar
>could then be set to some particular timestamp and branch to always
>return versions relative to that context. This could yield read-only
>content from those snapshots. The "version" jar could also point to the
>HEAD on some branch and provide read-write access. (This is pretty much
>what my team called a "Sandbox", but we haven't written up anything
>about it yet. This thing also does conflict detection and merging

Wow.  That's way on the far side of CTAP, for me.  :)  I do want to comment
that "setting" a rack to a timestamp sounds like a bad idea for me; I'd
want to instead create *instances* of a rack, each configured for a
timestamp, because I'm inclined to "immutability as a way of life".  :)
That is, I find that when application components are stateful, it leads to
debugging, debugging leads to fear, fear leads to anger, and anger leads to
the dark side.  :)

>These are just pretty much a raw dump of my ideas based on your
>mailings, so take it with a grain of salt.  ;-)
>[1] SnapCM: Versioning Object Model.  This papers defines in UML and OCL
>an object model for precisely describing the branches, snapshots and
>version link resolution behavior.  (Very abstract model, just the
>[2] Versioned Hyperdocuments: Support for Lifecycle Models. This paper
>extends the SnapCM model to Documents and Hyperlinking. It includes a
>much more complete narrative of how/why/when kind of stuff.

I'll take a look at these when I get the chance.  I do have some curiousity
about versioning models, I just don't have a mandate to *do* anything about
them at present.  :)

More information about the PEAK mailing list