On 11/09/2013, at 12:35 AM, Daz DeBoer <darrell.deb...@gradleware.com> wrote:

> On Mon, Sep 9, 2013 at 10:48 PM, Adam Murdoch <adam.murd...@gradleware.com> 
> wrote:
> 
> On 10/09/2013, at 2:42 PM, Daz DeBoer <darrell.deb...@gradleware.com> wrote:
> 
>> 
>> On 9 Sep 2013 13:52, "Adam Murdoch" <adam.murd...@gradleware.com> wrote:
>> >
>> >
>> > On 10/09/2013, at 5:32 AM, Daz DeBoer <darrell.deb...@gradleware.com> 
>> > wrote:
>> >
>> >> On Sun, Sep 8, 2013 at 3:34 PM, Adam Murdoch 
>> >> <adam.murd...@gradleware.com> wrote:
>> >>>
>> >>>
>> >>> On 09/09/2013, at 5:21 AM, Daz DeBoer <darrell.deb...@gradleware.com> 
>> >>> wrote:
>> >>>
>> >>>> G'day
>> >>>> Since we're currently changing the way we manage locks in the Gradle 
>> >>>> cache, it would be great if we could separate the 'filestore' part of 
>> >>>> the cache (that hasn't changed in structure since 1.0) from the binary 
>> >>>> metadata part (which changes quite frequently).
>> >>>>
>> >>>> What this means is that we'd have these in separate directories:
>> >>>> ~/.gradle/caches/metadata-1
>> >>>> ~/.gradle/caches/filestore-1
>> >>>>
>> >>>> The 'filestore' would simply contain the content that is currently in 
>> >>>> caches/artifacts-n/filestore.
>> >>>>
>> >>>> The benefit of this change is that the actual downloaded files would 
>> >>>> not need to be copied into a new location every time we change the 
>> >>>> metadata file format.
>> >>>>
>> >>>> The only complication I see is that we'd need a separate 
>> >>>> (cross-version) lock for the filestore since it would be shared by 
>> >>>> different Gradle versions. We'd need to bump the filestore version 
>> >>>> whenever the locking mechanism changes, rather than every time the 
>> >>>> metadata store format changes.
>> >>>
>> >>>
>> >>> I think having two locks would make it easy to deadlock when there are 2 
>> >>> processes (or threads) resolving concurrently. We could address this by 
>> >>> enforcing a certain lock order (eg always lock the files if you need to 
>> >>> lock the metadata).
>> >>>
>> >>> Another option would be to have a single lock for both the files and 
>> >>> metadata, versioned on the locking protocol, something like:
>> >>>
>> >>> ~/.gradle/caches/files-1
>> >>> ~/.gradle/caches/files-1/store-1
>> >>> ~/.gradle/caches/files-1/metadata-1
>> >>>
>> >>
>> >> It could even look at bit more intentional if we used eg:
>> >>
>> >> caches/modules-1
>> >> caches/modules-1/artifacts-1.0
>> >> caches/modules-1/metadata-1.3
>> >
>> >
>> > This isn't really going to work. If a format change is backwards 
>> > compatible, then we should not change the directory name, otherwise we 
>> > have two sets of processes that are using different stores even though 
>> > they can share them. So we wouldn't use the minor version in file names, 
>> > only major versions.
>> >
>> 
>> I don't really understand how my proposal is any different, except in the 
>> actual numbers used. When the lock file format changes, we need to create a 
>> new top level directory with new file store and metadata. When the file 
>> store or metadata formats change we bump that version only. The actual 
>> numbers uses are arbitrary.
> 
> So we'd use either `thing-n.0` or `thing-1.n` as the naming scheme, where `n` 
> is the version number for the thing?
> 
> I was thinking:
> 
> caches/modules-x/filestore-x.y
> caches/modules-x/metadata-x.z
> 


I get it now. That could work.


--
Adam Murdoch
Gradle Co-founder
http://www.gradle.org
VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting
http://www.gradleware.com

Join us at the Gradle eXchange 2013, Oct 28th in London, UK: 
http://skillsmatter.com/event/java-jee/gradle-exchange-2013



Reply via email to