Browse Source

Delete storage.dht package

This experiment proved to be not very useful. I had originally
planned to use this on top of Google Bigtable, Apache HBase or
Apache Cassandra. Unfortunately the schema is very complex and
does not perform well. The storage.dfs package has much better
performance and has been in production at Google for many months
now, proving it is a viable storage backend for Git.

As there are no users of the storage.dht schema, either at Google or
any other company, nor any valid open source implementations of the
storage system, drop the entire package and API from the JGit project.
There is no point in trying to maintain code that is simply not used.

Change-Id: Ia8d32f27426d2bcc12e7dc9cc4524c59f4fe4df9
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
tags/v2.1.0.201209190230-r
Shawn O. Pearce 11 years ago
parent
commit
130ad4ea44
100 changed files with 0 additions and 25415 deletions
  1. 0
    7
      org.eclipse.jgit.generated.storage.dht.proto/.classpath
  2. 0
    2
      org.eclipse.jgit.generated.storage.dht.proto/.gitignore
  3. 0
    34
      org.eclipse.jgit.generated.storage.dht.proto/.project
  4. 0
    3
      org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.core.resources.prefs
  5. 0
    3
      org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.core.runtime.prefs
  6. 0
    349
      org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.jdt.core.prefs
  7. 0
    62
      org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.jdt.ui.prefs
  8. 0
    4
      org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.mylyn.tasks.ui.prefs
  9. 0
    3
      org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.mylyn.team.ui.prefs
  10. 0
    94
      org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.pde.api.tools.prefs
  11. 0
    11
      org.eclipse.jgit.generated.storage.dht.proto/META-INF/MANIFEST.MF
  12. 0
    59
      org.eclipse.jgit.generated.storage.dht.proto/about.html
  13. 0
    6
      org.eclipse.jgit.generated.storage.dht.proto/build.properties
  14. 0
    11
      org.eclipse.jgit.generated.storage.dht.proto/generate.sh
  15. 0
    2
      org.eclipse.jgit.generated.storage.dht.proto/plugin.properties
  16. 0
    121
      org.eclipse.jgit.generated.storage.dht.proto/pom.xml
  17. 0
    86
      org.eclipse.jgit.generated.storage.dht.proto/resources/org/eclipse/jgit/storage/dht/git_cache.proto
  18. 0
    278
      org.eclipse.jgit.generated.storage.dht.proto/resources/org/eclipse/jgit/storage/dht/git_store.proto
  19. 0
    2546
      org.eclipse.jgit.generated.storage.dht.proto/src/org/eclipse/jgit/generated/storage/dht/proto/GitCache.java
  20. 0
    8037
      org.eclipse.jgit.generated.storage.dht.proto/src/org/eclipse/jgit/generated/storage/dht/proto/GitStore.java
  21. 0
    7
      org.eclipse.jgit.storage.dht.test/.classpath
  22. 0
    2
      org.eclipse.jgit.storage.dht.test/.gitignore
  23. 0
    34
      org.eclipse.jgit.storage.dht.test/.project
  24. 0
    6
      org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.core.resources.prefs
  25. 0
    3
      org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.core.runtime.prefs
  26. 0
    320
      org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.jdt.core.prefs
  27. 0
    63
      org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.jdt.ui.prefs
  28. 0
    4
      org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.mylyn.tasks.ui.prefs
  29. 0
    3
      org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.mylyn.team.ui.prefs
  30. 0
    94
      org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.pde.api.tools.prefs
  31. 0
    19
      org.eclipse.jgit.storage.dht.test/META-INF/MANIFEST.MF
  32. 0
    4
      org.eclipse.jgit.storage.dht.test/build.properties
  33. 0
    15
      org.eclipse.jgit.storage.dht.test/org.eclipse.jgit.storage.dht--All-Tests.launch
  34. 0
    2
      org.eclipse.jgit.storage.dht.test/plugin.properties
  35. 0
    101
      org.eclipse.jgit.storage.dht.test/pom.xml
  36. 0
    317
      org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/ChunkIndexTest.java
  37. 0
    89
      org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/ChunkKeyTest.java
  38. 0
    343
      org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/DhtPackParserTest.java
  39. 0
    96
      org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/DhtRepositoryBuilderTest.java
  40. 0
    117
      org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/LargeNonDeltaObjectTest.java
  41. 0
    76
      org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/ObjectIndexKeyTest.java
  42. 0
    59
      org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/RepositoryKeyTest.java
  43. 0
    75
      org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/TimeoutTest.java
  44. 0
    8
      org.eclipse.jgit.storage.dht/.classpath
  45. 0
    125
      org.eclipse.jgit.storage.dht/.fbprefs
  46. 0
    2
      org.eclipse.jgit.storage.dht/.gitignore
  47. 0
    34
      org.eclipse.jgit.storage.dht/.project
  48. 0
    3
      org.eclipse.jgit.storage.dht/.settings/org.eclipse.core.resources.prefs
  49. 0
    3
      org.eclipse.jgit.storage.dht/.settings/org.eclipse.core.runtime.prefs
  50. 0
    334
      org.eclipse.jgit.storage.dht/.settings/org.eclipse.jdt.core.prefs
  51. 0
    62
      org.eclipse.jgit.storage.dht/.settings/org.eclipse.jdt.ui.prefs
  52. 0
    4
      org.eclipse.jgit.storage.dht/.settings/org.eclipse.mylyn.tasks.ui.prefs
  53. 0
    3
      org.eclipse.jgit.storage.dht/.settings/org.eclipse.mylyn.team.ui.prefs
  54. 0
    94
      org.eclipse.jgit.storage.dht/.settings/org.eclipse.pde.api.tools.prefs
  55. 0
    26
      org.eclipse.jgit.storage.dht/META-INF/MANIFEST.MF
  56. 0
    89
      org.eclipse.jgit.storage.dht/README
  57. 0
    59
      org.eclipse.jgit.storage.dht/about.html
  58. 0
    6
      org.eclipse.jgit.storage.dht/build.properties
  59. 0
    2
      org.eclipse.jgit.storage.dht/plugin.properties
  60. 0
    181
      org.eclipse.jgit.storage.dht/pom.xml
  61. 0
    32
      org.eclipse.jgit.storage.dht/resources/org/eclipse/jgit/storage/dht/DhtText.properties
  62. 0
    1151
      org.eclipse.jgit.storage.dht/resources/org/eclipse/jgit/storage/dht/dht-schema.html
  63. 0
    74
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/AsyncCallback.java
  64. 0
    264
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/BatchObjectLookup.java
  65. 0
    153
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/CachedPackKey.java
  66. 0
    497
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkFormatter.java
  67. 0
    428
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkIndex.java
  68. 0
    96
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkInfo.java
  69. 0
    160
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkKey.java
  70. 0
    111
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkMetaUtil.java
  71. 0
    196
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DeltaBaseCache.java
  72. 0
    192
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtCachedPack.java
  73. 0
    61
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtConfig.java
  74. 0
    89
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtException.java
  75. 0
    321
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtInserter.java
  76. 0
    224
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtInserterOptions.java
  77. 0
    83
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtMissingChunkException.java
  78. 0
    103
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtObjDatabase.java
  79. 0
    89
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtObjectRepresentation.java
  80. 0
    90
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtObjectToPack.java
  81. 0
    1442
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtPackParser.java
  82. 0
    710
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtReader.java
  83. 0
    353
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtReaderOptions.java
  84. 0
    524
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRefDatabase.java
  85. 0
    72
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRefRename.java
  86. 0
    224
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRefUpdate.java
  87. 0
    171
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRepository.java
  88. 0
    236
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRepositoryBuilder.java
  89. 0
    88
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtText.java
  90. 0
    85
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtTimeoutException.java
  91. 0
    83
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/KeyUtils.java
  92. 0
    160
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/LargeNonDeltaObject.java
  93. 0
    123
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ObjectIndexKey.java
  94. 0
    169
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ObjectInfo.java
  95. 0
    255
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ObjectWriter.java
  96. 0
    191
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/OpenQueue.java
  97. 0
    795
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/PackChunk.java
  98. 0
    423
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/Prefetcher.java
  99. 0
    295
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/QueueObjectLookup.java
  100. 0
    0
      org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/RecentChunks.java

+ 0
- 7
org.eclipse.jgit.generated.storage.dht.proto/.classpath View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>

+ 0
- 2
org.eclipse.jgit.generated.storage.dht.proto/.gitignore View File

@@ -1,2 +0,0 @@
/bin
/target

+ 0
- 34
org.eclipse.jgit.generated.storage.dht.proto/.project View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.eclipse.jgit.generated.storage.dht.proto</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
</natures>
</projectDescription>

+ 0
- 3
org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.core.resources.prefs View File

@@ -1,3 +0,0 @@
#Mon Aug 11 16:46:12 PDT 2008
eclipse.preferences.version=1
encoding/<project>=UTF-8

+ 0
- 3
org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.core.runtime.prefs View File

@@ -1,3 +0,0 @@
#Mon Mar 24 18:55:50 EDT 2008
eclipse.preferences.version=1
line.separator=\n

+ 0
- 349
org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.jdt.core.prefs View File

@@ -1,349 +0,0 @@
#Thu May 05 16:40:25 PDT 2011
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.codegen.unusedLocal=optimize out
org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.debug.lineNumber=do not generate
org.eclipse.jdt.core.compiler.debug.localVariable=do not generate
org.eclipse.jdt.core.compiler.debug.sourceFile=do not generate
org.eclipse.jdt.core.compiler.doc.comment.support=disabled
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=ignore
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.comparingIdentical=ignore
org.eclipse.jdt.core.compiler.problem.deadCode=ignore
org.eclipse.jdt.core.compiler.problem.deprecation=ignore
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=ignore
org.eclipse.jdt.core.compiler.problem.forbiddenReference=ignore
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=ignore
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=ignore
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=ignore
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=ignore
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=ignore
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
org.eclipse.jdt.core.compiler.problem.nullReference=ignore
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=ignore
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=ignore
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedImport=ignore
org.eclipse.jdt.core.compiler.problem.unusedLabel=ignore
org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=ignore
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
org.eclipse.jdt.core.compiler.source=1.5
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=1
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=80
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true

+ 0
- 62
org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.jdt.ui.prefs View File

@@ -1,62 +0,0 @@
#Thu Aug 26 12:30:58 CDT 2010
eclipse.preferences.version=1
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_JGit Format
formatter_settings_version=11
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=99
org.eclipse.jdt.ui.staticondemandthreshold=99
org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
sp_cleanup.add_default_serial_version_id=true
sp_cleanup.add_generated_serial_version_id=false
sp_cleanup.add_missing_annotations=false
sp_cleanup.add_missing_deprecated_annotations=true
sp_cleanup.add_missing_methods=false
sp_cleanup.add_missing_nls_tags=false
sp_cleanup.add_missing_override_annotations=true
sp_cleanup.add_missing_override_annotations_interface_methods=false
sp_cleanup.add_serial_version_id=false
sp_cleanup.always_use_blocks=true
sp_cleanup.always_use_parentheses_in_expressions=false
sp_cleanup.always_use_this_for_non_static_field_access=false
sp_cleanup.always_use_this_for_non_static_method_access=false
sp_cleanup.convert_to_enhanced_for_loop=false
sp_cleanup.correct_indentation=false
sp_cleanup.format_source_code=true
sp_cleanup.format_source_code_changes_only=true
sp_cleanup.make_local_variable_final=false
sp_cleanup.make_parameters_final=false
sp_cleanup.make_private_fields_final=true
sp_cleanup.make_type_abstract_if_missing_method=false
sp_cleanup.make_variable_declarations_final=false
sp_cleanup.never_use_blocks=false
sp_cleanup.never_use_parentheses_in_expressions=true
sp_cleanup.on_save_use_additional_actions=true
sp_cleanup.organize_imports=false
sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
sp_cleanup.remove_private_constructors=true
sp_cleanup.remove_trailing_whitespaces=true
sp_cleanup.remove_trailing_whitespaces_all=true
sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
sp_cleanup.remove_unnecessary_casts=false
sp_cleanup.remove_unnecessary_nls_tags=false
sp_cleanup.remove_unused_imports=false
sp_cleanup.remove_unused_local_variables=false
sp_cleanup.remove_unused_private_fields=true
sp_cleanup.remove_unused_private_members=false
sp_cleanup.remove_unused_private_methods=true
sp_cleanup.remove_unused_private_types=true
sp_cleanup.sort_members=false
sp_cleanup.sort_members_all=false
sp_cleanup.use_blocks=false
sp_cleanup.use_blocks_only_for_return_and_throw=false
sp_cleanup.use_parentheses_in_expressions=false
sp_cleanup.use_this_for_non_static_field_access=false
sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
sp_cleanup.use_this_for_non_static_method_access=false
sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true

+ 0
- 4
org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.mylyn.tasks.ui.prefs View File

@@ -1,4 +0,0 @@
#Tue Jul 19 20:11:28 CEST 2011
eclipse.preferences.version=1
project.repository.kind=bugzilla
project.repository.url=https\://bugs.eclipse.org/bugs

+ 0
- 3
org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.mylyn.team.ui.prefs View File

@@ -1,3 +0,0 @@
#Tue Jul 19 20:11:28 CEST 2011
commit.comment.template=${task.description} \n\nBug\: ${task.key}
eclipse.preferences.version=1

+ 0
- 94
org.eclipse.jgit.generated.storage.dht.proto/.settings/org.eclipse.pde.api.tools.prefs View File

@@ -1,94 +0,0 @@
#Tue Oct 18 00:52:01 CEST 2011
ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
ILLEGAL_EXTEND=Warning
ILLEGAL_IMPLEMENT=Warning
ILLEGAL_INSTANTIATE=Warning
ILLEGAL_OVERRIDE=Warning
ILLEGAL_REFERENCE=Warning
INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
INVALID_JAVADOC_TAG=Ignore
INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
LEAK_EXTEND=Warning
LEAK_FIELD_DECL=Warning
LEAK_IMPLEMENT=Warning
LEAK_METHOD_PARAM=Warning
LEAK_METHOD_RETURN_TYPE=Warning
METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
UNUSED_PROBLEM_FILTERS=Warning
automatically_removed_unused_problem_filters=false
eclipse.preferences.version=1
incompatible_api_component_version=Error
incompatible_api_component_version_include_major_without_breaking_change=Disabled
incompatible_api_component_version_include_minor_without_api_change=Disabled
invalid_since_tag_version=Error
malformed_since_tag=Error
missing_since_tag=Error
report_api_breakage_when_major_version_incremented=Disabled
report_resolution_errors_api_component=Warning

+ 0
- 11
org.eclipse.jgit.generated.storage.dht.proto/META-INF/MANIFEST.MF View File

@@ -1,11 +0,0 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %plugin_name
Bundle-SymbolicName: org.eclipse.jgit.generated.storage.dht.proto
Bundle-Version: 2.1.0.qualifier
Bundle-Localization: plugin
Bundle-Vendor: %provider_name
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Export-Package: org.eclipse.jgit.generated.storage.dht.proto;version="2.1.0"
Import-Package: com.google.protobuf;version="[2.4.0,2.5.0)"

+ 0
- 59
org.eclipse.jgit.generated.storage.dht.proto/about.html View File

@@ -1,59 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Eclipse Distribution License - Version 1.0</title>
<style type="text/css">
body {
size: 8.5in 11.0in;
margin: 0.25in 0.5in 0.25in 0.5in;
tab-interval: 0.5in;
}
p {
margin-left: auto;
margin-top: 0.5em;
margin-bottom: 0.5em;
}
p.list {
margin-left: 0.5in;
margin-top: 0.05em;
margin-bottom: 0.05em;
}
</style>

</head>

<body lang="EN-US">

<p><b>Eclipse Distribution License - v 1.0</b></p>

<p>Copyright (c) 2007, Eclipse Foundation, Inc. and its licensors. </p>

<p>All rights reserved.</p>
<p>Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
<ul><li>Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. </li>
<li>Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. </li>
<li>Neither the name of the Eclipse Foundation, Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission. </li></ul>
</p>
<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.</p>

</body>

</html>

+ 0
- 6
org.eclipse.jgit.generated.storage.dht.proto/build.properties View File

@@ -1,6 +0,0 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.properties,\
about.html

+ 0
- 11
org.eclipse.jgit.generated.storage.dht.proto/generate.sh View File

@@ -1,11 +0,0 @@
#!/bin/sh
#
# Update generated Java code from protocol buffer descriptions.

set -e

for proto in resources/org/eclipse/jgit/storage/dht/*.proto
do
echo >&2 Generating from $proto
protoc -Iresources --java_out=src $proto
done

+ 0
- 2
org.eclipse.jgit.generated.storage.dht.proto/plugin.properties View File

@@ -1,2 +0,0 @@
plugin_name=JGit DHT Storage Protocol Buffer Messages
provider_name=Eclipse.org

+ 0
- 121
org.eclipse.jgit.generated.storage.dht.proto/pom.xml View File

@@ -1,121 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2011, Google Inc.
and other copyright owners as documented in the project's IP log.

This program and the accompanying materials are made available
under the terms of the Eclipse Distribution License v1.0 which
accompanies this distribution, is reproduced below, and is
available at http://www.eclipse.org/org/documents/edl-v10.php

All rights reserved.

Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following
conditions are met:

- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.

- Neither the name of the Eclipse Foundation, Inc. nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit-parent</artifactId>
<version>2.1.0-SNAPSHOT</version>
</parent>

<artifactId>org.eclipse.jgit.generated.storage.dht.proto</artifactId>
<name>JGit - DHT Storage Protocol Buffer Messages</name>

<description>
Compiled protocol buffer messages for DHT storage
</description>

<properties>
<translate-qualifier/>
</properties>

<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</dependency>
</dependencies>

<build>
<sourceDirectory>src/</sourceDirectory>

<resources>
<resource>
<directory>.</directory>
<includes>
<include>plugin.properties</include>
<include>about.html</include>
</includes>
</resource>
<resource>
<directory>resources/</directory>
</resource>
</resources>

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<inherited>true</inherited>
<executions>
<execution>
<id>attach-sources</id>
<phase>process-classes</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<archive>
<manifestFile>${source-bundle-manifest}</manifestFile>
</archive>
</configuration>
</execution>
</executions>
</plugin>

<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>${bundle-manifest}</manifestFile>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

+ 0
- 86
org.eclipse.jgit.generated.storage.dht.proto/resources/org/eclipse/jgit/storage/dht/git_cache.proto View File

@@ -1,86 +0,0 @@
// Copyright (C) 2011, Google Inc.
// and other copyright owners as documented in the project's IP log.
//
// This program and the accompanying materials are made available
// under the terms of the Eclipse Distribution License v1.0 which
// accompanies this distribution, is reproduced below, and is
// available at http://www.eclipse.org/org/documents/edl-v10.php
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// conditions are met:
//
// - Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
//
// - Neither the name of the Eclipse Foundation, Inc. nor the
// names of its contributors may be used to endorse or promote
// products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
// WARNING: If you edit this file, run generate.sh
//
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

syntax = "proto2";

package org.eclipse.jgit.storage.dht;
option java_generate_equals_and_hash = true;
option java_package = "org.eclipse.jgit.generated.storage.dht.proto";

import "org/eclipse/jgit/storage/dht/git_store.proto";


// Caches ObjectIndexTable in a single message.
//
message CachedObjectIndex {
message Item {
required string chunk_key = 1;
required ObjectInfo object_info = 2;
optional fixed64 time = 3;
}
repeated Item item = 1;
}


// Caches CachedPackInfo in a single message.
//
message CachedPackInfoList {
repeated CachedPackInfo pack = 1;
}


// Caches ChunkTable in a single message.
//
// WARNING: Formatters for this message are also hand-coded
// inside of the CacheChunkTable class. If you make changes
// to this message, ensure that class is also updated.
//
message CachedChunk {
required bytes data = 1;
optional bytes index = 2;
optional ChunkMeta meta = 3;
}

+ 0
- 278
org.eclipse.jgit.generated.storage.dht.proto/resources/org/eclipse/jgit/storage/dht/git_store.proto View File

@@ -1,278 +0,0 @@
// Copyright (C) 2011, Google Inc.
// and other copyright owners as documented in the project's IP log.
//
// This program and the accompanying materials are made available
// under the terms of the Eclipse Distribution License v1.0 which
// accompanies this distribution, is reproduced below, and is
// available at http://www.eclipse.org/org/documents/edl-v10.php
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// conditions are met:
//
// - Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
//
// - Neither the name of the Eclipse Foundation, Inc. nor the
// names of its contributors may be used to endorse or promote
// products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
// WARNING: If you edit this file, run generate.sh
//
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

syntax = "proto2";

package org.eclipse.jgit.storage.dht;
option java_generate_equals_and_hash = true;
option java_package = "org.eclipse.jgit.generated.storage.dht.proto";


// Entry in RefTable describing the target of the reference.
// Either symref *OR* target must be populated, but never both.
//
message RefData {
// Incrementing counter updated each time the RefData changes.
// Should always start at 1.
//
required uint32 sequence = 5 [default = 0];

// An ObjectId with an optional hint about where it can be found.
//
message Id {
required string object_name = 1;
optional string chunk_key = 2;
}

// Name of another reference this reference inherits its target
// from. The target is inherited on-the-fly at runtime by reading
// the other reference. Typically only "HEAD" uses symref.
//
optional string symref = 1;

// ObjectId this reference currently points at.
//
optional Id target = 2;

// True if the correct value for peeled is stored.
//
optional bool is_peeled = 3;

// If is_peeled is true, this field is accurate. This field
// exists only if target points to annotated tag object, then
// this field stores the "object" field for that tag.
//
optional Id peeled = 4;
}


// Entry in ObjectIndexTable, describes how an object appears in a chunk.
//
message ObjectInfo {
// Type of Git object.
//
enum ObjectType {
COMMIT = 1;
TREE = 2;
BLOB = 3;
TAG = 4;
}
optional ObjectType object_type = 1;

// Position of the object's header within its chunk.
//
required int32 offset = 2;

// Total number of compressed data bytes, not including the pack
// header. For fragmented objects this is the sum of all chunks.
//
required int64 packed_size = 3;

// Total number of bytes of the uncompressed object. For a
// delta this is the size after applying the delta onto its base.
//
required int64 inflated_size = 4;

// ObjectId of the delta base, if this object is stored as a delta.
// The base is stored in raw binary.
//
optional bytes delta_base = 5;

// True if the object requires more than one chunk to be stored.
//
optional bool is_fragmented = 6;
}


// Describes at a high-level the information about a chunk.
// A repository can use this summary to determine how much
// data is stored, or when garbage collection should occur.
//
message ChunkInfo {
// Source of the chunk (what code path created it).
//
enum Source {
RECEIVE = 1; // Came in over the network from external source.
INSERT = 2; // Created in this repository (e.g. a merge).
REPACK = 3; // Generated during a repack of this repository.
}
optional Source source = 1;

// Type of Git object stored in this chunk.
//
enum ObjectType {
MIXED = 0;
COMMIT = 1;
TREE = 2;
BLOB = 3;
TAG = 4;
}
optional ObjectType object_type = 2;

// True if this chunk is a member of a fragmented object.
//
optional bool is_fragment = 3;

// If present, key of the CachedPackInfo object
// that this chunk is a member of.
//
optional string cached_pack_key = 4;

// Summary description of the objects stored here.
//
message ObjectCounts {
// Number of objects stored in this chunk.
//
optional int32 total = 1;

// Number of objects stored in whole (non-delta) form.
//
optional int32 whole = 2;

// Number of objects stored in OFS_DELTA format.
// The delta base appears in the same chunk, or
// may appear in an earlier chunk through the
// ChunkMeta.base_chunk link.
//
optional int32 ofs_delta = 3;

// Number of objects stored in REF_DELTA format.
// The delta base is at an unknown location.
//
optional int32 ref_delta = 4;
}
optional ObjectCounts object_counts = 5;

// Size in bytes of the chunk's compressed data column.
//
optional int32 chunk_size = 6;

// Size in bytes of the chunk's index.
//
optional int32 index_size = 7;

// Size in bytes of the meta information.
//
optional int32 meta_size = 8;
}


// Describes meta information about a chunk, stored inline with it.
//
message ChunkMeta {
// Enumerates the other chunks this chunk depends upon by OFS_DELTA.
// Entries are sorted by relative_start ascending, enabling search. Thus
// the earliest chunk is at the end of the list.
//
message BaseChunk {
// Bytes between start of the base chunk and start of this chunk.
// Although the value is positive, its a negative offset.
//
required int64 relative_start = 1;
required string chunk_key = 2;
}
repeated BaseChunk base_chunk = 1;

// If this chunk is part of a fragment, key of every chunk that
// makes up the fragment, including this chunk.
//
repeated string fragment = 2;

// Chunks that should be prefetched if reading the current chunk.
//
message PrefetchHint {
repeated string edge = 1;
repeated string sequential = 2;
}
optional PrefetchHint commit_prefetch = 51;
optional PrefetchHint tree_prefetch = 52;
}


// Describes a CachedPack, for efficient bulk clones.
//
message CachedPackInfo {
// Unique name of the cached pack. This is the SHA-1 hash of
// all of the objects that make up the cached pack, sorted and
// in binary form. (Same rules as Git on the filesystem.)
//
required string name = 1;

// SHA-1 of all chunk keys, which are themselves SHA-1s of the
// raw chunk data. If any bit differs in compression (due to
// repacking) the version will differ.
//
required string version = 2;

// Total number of objects in the cached pack. This must be known
// in order to set the final resulting pack header correctly before it
// is sent to clients.
//
required int64 objects_total = 3;

// Number of objects stored as deltas, rather than deflated whole.
//
optional int64 objects_delta = 4;

// Total size of the chunks, in bytes, not including the chunk footer.
//
optional int64 bytes_total = 5;

// Objects this pack starts from.
//
message TipObjectList {
repeated string object_name = 1;
}
required TipObjectList tip_list = 6;

// Chunks, in order of occurrence in the stream.
//
message ChunkList {
repeated string chunk_key = 1;
}
required ChunkList chunk_list = 7;
}

+ 0
- 2546
org.eclipse.jgit.generated.storage.dht.proto/src/org/eclipse/jgit/generated/storage/dht/proto/GitCache.java
File diff suppressed because it is too large
View File


+ 0
- 8037
org.eclipse.jgit.generated.storage.dht.proto/src/org/eclipse/jgit/generated/storage/dht/proto/GitStore.java
File diff suppressed because it is too large
View File


+ 0
- 7
org.eclipse.jgit.storage.dht.test/.classpath View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="tst"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>

+ 0
- 2
org.eclipse.jgit.storage.dht.test/.gitignore View File

@@ -1,2 +0,0 @@
/bin
/target

+ 0
- 34
org.eclipse.jgit.storage.dht.test/.project View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.eclipse.jgit.storage.dht.test</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
</natures>
</projectDescription>

+ 0
- 6
org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.core.resources.prefs View File

@@ -1,6 +0,0 @@
#Sat Dec 20 21:21:24 CET 2008
eclipse.preferences.version=1
encoding//tst-rsrc/org/eclipse/jgit/patch/testGetText_BothISO88591.patch=ISO-8859-1
encoding//tst-rsrc/org/eclipse/jgit/patch/testGetText_Convert.patch=ISO-8859-1
encoding//tst-rsrc/org/eclipse/jgit/patch/testGetText_DiffCc.patch=ISO-8859-1
encoding/<project>=UTF-8

+ 0
- 3
org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.core.runtime.prefs View File

@@ -1,3 +0,0 @@
#Mon Mar 24 18:55:56 EDT 2008
eclipse.preferences.version=1
line.separator=\n

+ 0
- 320
org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.jdt.core.prefs View File

@@ -1,320 +0,0 @@
#Tue Feb 05 00:01:29 CET 2008
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.doc.comment.support=enabled
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=warning
org.eclipse.jdt.core.compiler.problem.deprecation=warning
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
org.eclipse.jdt.core.compiler.problem.nullReference=warning
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedImport=error
org.eclipse.jdt.core.compiler.problem.unusedLabel=error
org.eclipse.jdt.core.compiler.problem.unusedLocal=error
org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
org.eclipse.jdt.core.compiler.source=1.5
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=1
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
org.eclipse.jdt.core.formatter.comment.format_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=80
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false

+ 0
- 63
org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.jdt.ui.prefs View File

@@ -1,63 +0,0 @@
#Thu Aug 26 12:30:07 CDT 2010
eclipse.preferences.version=1
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_JGit Format
formatter_settings_version=11
internal.default.compliance=default
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=99
org.eclipse.jdt.ui.staticondemandthreshold=99
org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
sp_cleanup.add_default_serial_version_id=true
sp_cleanup.add_generated_serial_version_id=false
sp_cleanup.add_missing_annotations=false
sp_cleanup.add_missing_deprecated_annotations=true
sp_cleanup.add_missing_methods=false
sp_cleanup.add_missing_nls_tags=false
sp_cleanup.add_missing_override_annotations=true
sp_cleanup.add_missing_override_annotations_interface_methods=false
sp_cleanup.add_serial_version_id=false
sp_cleanup.always_use_blocks=true
sp_cleanup.always_use_parentheses_in_expressions=false
sp_cleanup.always_use_this_for_non_static_field_access=false
sp_cleanup.always_use_this_for_non_static_method_access=false
sp_cleanup.convert_to_enhanced_for_loop=false
sp_cleanup.correct_indentation=false
sp_cleanup.format_source_code=true
sp_cleanup.format_source_code_changes_only=true
sp_cleanup.make_local_variable_final=false
sp_cleanup.make_parameters_final=false
sp_cleanup.make_private_fields_final=true
sp_cleanup.make_type_abstract_if_missing_method=false
sp_cleanup.make_variable_declarations_final=false
sp_cleanup.never_use_blocks=false
sp_cleanup.never_use_parentheses_in_expressions=true
sp_cleanup.on_save_use_additional_actions=true
sp_cleanup.organize_imports=false
sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
sp_cleanup.remove_private_constructors=true
sp_cleanup.remove_trailing_whitespaces=true
sp_cleanup.remove_trailing_whitespaces_all=true
sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
sp_cleanup.remove_unnecessary_casts=false
sp_cleanup.remove_unnecessary_nls_tags=false
sp_cleanup.remove_unused_imports=false
sp_cleanup.remove_unused_local_variables=false
sp_cleanup.remove_unused_private_fields=true
sp_cleanup.remove_unused_private_members=false
sp_cleanup.remove_unused_private_methods=true
sp_cleanup.remove_unused_private_types=true
sp_cleanup.sort_members=false
sp_cleanup.sort_members_all=false
sp_cleanup.use_blocks=false
sp_cleanup.use_blocks_only_for_return_and_throw=false
sp_cleanup.use_parentheses_in_expressions=false
sp_cleanup.use_this_for_non_static_field_access=false
sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
sp_cleanup.use_this_for_non_static_method_access=false
sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true

+ 0
- 4
org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.mylyn.tasks.ui.prefs View File

@@ -1,4 +0,0 @@
#Tue Jul 19 20:11:28 CEST 2011
eclipse.preferences.version=1
project.repository.kind=bugzilla
project.repository.url=https\://bugs.eclipse.org/bugs

+ 0
- 3
org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.mylyn.team.ui.prefs View File

@@ -1,3 +0,0 @@
#Tue Jul 19 20:11:28 CEST 2011
commit.comment.template=${task.description} \n\nBug\: ${task.key}
eclipse.preferences.version=1

+ 0
- 94
org.eclipse.jgit.storage.dht.test/.settings/org.eclipse.pde.api.tools.prefs View File

@@ -1,94 +0,0 @@
#Tue Oct 18 00:52:01 CEST 2011
ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
ILLEGAL_EXTEND=Warning
ILLEGAL_IMPLEMENT=Warning
ILLEGAL_INSTANTIATE=Warning
ILLEGAL_OVERRIDE=Warning
ILLEGAL_REFERENCE=Warning
INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
INVALID_JAVADOC_TAG=Ignore
INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
LEAK_EXTEND=Warning
LEAK_FIELD_DECL=Warning
LEAK_IMPLEMENT=Warning
LEAK_METHOD_PARAM=Warning
LEAK_METHOD_RETURN_TYPE=Warning
METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
UNUSED_PROBLEM_FILTERS=Warning
automatically_removed_unused_problem_filters=false
eclipse.preferences.version=1
incompatible_api_component_version=Error
incompatible_api_component_version_include_major_without_breaking_change=Disabled
incompatible_api_component_version_include_minor_without_api_change=Disabled
invalid_since_tag_version=Error
malformed_since_tag=Error
missing_since_tag=Error
report_api_breakage_when_major_version_incremented=Disabled
report_resolution_errors_api_component=Warning

+ 0
- 19
org.eclipse.jgit.storage.dht.test/META-INF/MANIFEST.MF View File

@@ -1,19 +0,0 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %plugin_name
Bundle-SymbolicName: org.eclipse.jgit.storage.dht.test
Bundle-Version: 2.1.0.qualifier
Bundle-Localization: plugin
Bundle-Vendor: %provider_name
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: org.eclipse.jgit.lib;version="[2.1.0,2.2.0)",
org.eclipse.jgit.errors;version="[2.1.0,2.2.0)",
org.eclipse.jgit.storage.dht;version="[2.1.0,2.2.0)",
org.eclipse.jgit.storage.dht.spi.memory;version="[2.1.0,2.2.0)",
org.eclipse.jgit.storage.file;version="[2.1.0,2.2.0)",
org.eclipse.jgit.storage.pack;version="[2.1.0,2.2.0)",
org.eclipse.jgit.transport;version="[2.1.0,2.2.0)",
org.eclipse.jgit.util;version="[2.1.0,2.2.0)",
org.junit;version="[4.0.0,5.0.0)",
org.hamcrest.core;version="[1.1.0,2.0.0)"

+ 0
- 4
org.eclipse.jgit.storage.dht.test/build.properties View File

@@ -1,4 +0,0 @@
source.. = tst/
bin.includes = META-INF/,\
.,\
plugin.properties

+ 0
- 15
org.eclipse.jgit.storage.dht.test/org.eclipse.jgit.storage.dht--All-Tests.launch View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/org.eclipse.jgit.storage.dht.test"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.jgit.storage.dht.test"/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jgit.storage.dht.test"/>
</launchConfiguration>

+ 0
- 2
org.eclipse.jgit.storage.dht.test/plugin.properties View File

@@ -1,2 +0,0 @@
plugin_name=JGit DHT Storage Tests
provider_name=Eclipse.org

+ 0
- 101
org.eclipse.jgit.storage.dht.test/pom.xml View File

@@ -1,101 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2011, Google Inc.
and other copyright owners as documented in the project's IP log.

This program and the accompanying materials are made available
under the terms of the Eclipse Distribution License v1.0 which
accompanies this distribution, is reproduced below, and is
available at http://www.eclipse.org/org/documents/edl-v10.php

All rights reserved.

Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following
conditions are met:

- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.

- Neither the name of the Eclipse Foundation, Inc. nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit-parent</artifactId>
<version>2.1.0-SNAPSHOT</version>
</parent>

<artifactId>org.eclipse.jgit.storage.dht.test</artifactId>
<name>JGit - DHT Storage Tests</name>

<description>
JUnit tests for Git repository storage on a distributed hashtable
</description>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.junit</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.storage.dht</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

<build>
<testSourceDirectory>tst/</testSourceDirectory>

<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Xmx256m -Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
</plugins>
</build>
</project>

+ 0
- 317
org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/ChunkIndexTest.java View File

@@ -1,317 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jgit.lib.MutableObjectId;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.transport.PackedObjectInfo;
import org.eclipse.jgit.util.NB;
import org.junit.Test;

public class ChunkIndexTest {
@Test
public void testSingleObject_NotFound() throws DhtException {
List<PackedObjectInfo> objs = list(object(1, 1));
ChunkIndex idx = index(objs);
assertEquals(-1, idx.findOffset(ObjectId.zeroId()));
}

@Test
public void testSingleObject_Offset1() throws DhtException {
assertEquals(header(0, 1), header(list(object(1, 0))));

List<PackedObjectInfo> objs = list(object(0x1200, 255));
ChunkIndex idx = index(objs);

assertEquals(header(0, 1), header(objs));
assertEquals(1, idx.getObjectCount());
assertEquals(2 + 20 + 1, idx.getIndexSize());

assertEquals(objs.get(0), idx.getObjectId(0));
assertEquals(objs.get(0).getOffset(), idx.getOffset(0));
assertEquals(objs.get(0).getOffset(), idx.findOffset(objs.get(0)));
}

@Test
public void testSingleObject_Offset2() throws DhtException {
assertEquals(header(0, 2), header(list(object(1, 1 << 8))));

List<PackedObjectInfo> objs = list(object(0x1200, 0xab34));
ChunkIndex idx = index(objs);

assertEquals(header(0, 2), header(objs));
assertEquals(1, idx.getObjectCount());
assertEquals(2 + 20 + 2, idx.getIndexSize());

assertEquals(objs.get(0), idx.getObjectId(0));
assertEquals(objs.get(0).getOffset(), idx.getOffset(0));
assertEquals(objs.get(0).getOffset(), idx.findOffset(objs.get(0)));
}

@Test
public void testSingleObject_Offset3() throws DhtException {
assertEquals(header(0, 3), header(list(object(1, 1 << 16))));

List<PackedObjectInfo> objs = list(object(0x1200, 0xab1234));
ChunkIndex idx = index(objs);

assertEquals(header(0, 3), header(objs));
assertEquals(1, idx.getObjectCount());
assertEquals(2 + 20 + 3, idx.getIndexSize());

assertEquals(objs.get(0), idx.getObjectId(0));
assertEquals(objs.get(0).getOffset(), idx.getOffset(0));
assertEquals(objs.get(0).getOffset(), idx.findOffset(objs.get(0)));
}

@Test
public void testSingleObject_Offset4() throws DhtException {
assertEquals(header(0, 4), header(list(object(1, 1 << 24))));

List<PackedObjectInfo> objs = list(object(0x1200, 0x7bcdef42));
ChunkIndex idx = index(objs);

assertEquals(header(0, 4), header(objs));
assertEquals(1, idx.getObjectCount());
assertEquals(objs.get(0), idx.getObjectId(0));

assertEquals(2 + 20 + 4, idx.getIndexSize());
assertEquals(objs.get(0).getOffset(), idx.getOffset(0));
assertEquals(objs.get(0).getOffset(), idx.findOffset(objs.get(0)));
}

@Test
public void testObjects3() throws DhtException {
List<PackedObjectInfo> objs = objects(2, 3, 1);
ChunkIndex idx = index(objs);

assertEquals(header(0, 1), header(objs));
assertEquals(3, idx.getObjectCount());
assertEquals(2 + 3 * 20 + 3 * 1, idx.getIndexSize());
assertTrue(isSorted(objs));

for (int i = 0; i < objs.size(); i++) {
assertEquals(objs.get(i), idx.getObjectId(i));
assertEquals(objs.get(i).getOffset(), idx.getOffset(i));
assertEquals(objs.get(i).getOffset(), idx.findOffset(objs.get(i)));
}
}

@Test
public void testObjects255_SameBucket() throws DhtException {
int[] ints = new int[255];
for (int i = 0; i < 255; i++)
ints[i] = i;
List<PackedObjectInfo> objs = objects(ints);
ChunkIndex idx = index(objs);

assertEquals(header(1, 2), header(objs));
assertEquals(255, idx.getObjectCount());
assertEquals(2 + 256 + 255 * 20 + 255 * 2 //
+ 12 + 4 * 256, idx.getIndexSize());
assertTrue(isSorted(objs));

for (int i = 0; i < objs.size(); i++) {
assertEquals(objs.get(i), idx.getObjectId(i));
assertEquals(objs.get(i).getOffset(), idx.getOffset(i));
assertEquals(objs.get(i).getOffset(), idx.findOffset(objs.get(i)));
}
}

@Test
public void testObjects512_ManyBuckets() throws DhtException {
int[] ints = new int[512];
for (int i = 0; i < 256; i++) {
ints[i] = (i << 8) | 0;
ints[i + 256] = (i << 8) | 1;
}
List<PackedObjectInfo> objs = objects(ints);
ChunkIndex idx = index(objs);

assertEquals(header(1, 2), header(objs));
assertEquals(512, idx.getObjectCount());
assertEquals(2 + 256 + 512 * 20 + 512 * 2 //
+ 12 + 4 * 256, idx.getIndexSize());
assertTrue(isSorted(objs));

for (int i = 0; i < objs.size(); i++) {
assertEquals(objs.get(i), idx.getObjectId(i));
assertEquals(objs.get(i).getOffset(), idx.getOffset(i));
assertEquals(objs.get(i).getOffset(), idx.findOffset(objs.get(i)));
}
}

@Test
public void testFanout2() throws DhtException {
List<PackedObjectInfo> objs = new ArrayList<PackedObjectInfo>(65280);
MutableObjectId idBuf = new MutableObjectId();
for (int i = 0; i < 256; i++) {
idBuf.setByte(2, i & 0xff);
for (int j = 0; j < 255; j++) {
idBuf.setByte(3, j & 0xff);
PackedObjectInfo oe = new PackedObjectInfo(idBuf);
oe.setOffset((i << 8) | j);
objs.add(oe);
}
}
ChunkIndex idx = index(objs);

assertEquals(header(2, 2), header(objs));
assertEquals(256 * 255, idx.getObjectCount());
assertTrue(isSorted(objs));

for (int i = 0; i < objs.size(); i++) {
assertEquals(objs.get(i), idx.getObjectId(i));
assertEquals(objs.get(i).getOffset(), idx.getOffset(i));
assertEquals(objs.get(i).getOffset(), idx.findOffset(objs.get(i)));
}
}

@Test
public void testFanout3() throws DhtException {
List<PackedObjectInfo> objs = new ArrayList<PackedObjectInfo>(1 << 16);
MutableObjectId idBuf = new MutableObjectId();
for (int i = 0; i < 256; i++) {
idBuf.setByte(2, i & 0xff);
for (int j = 0; j < 256; j++) {
idBuf.setByte(3, j & 0xff);
PackedObjectInfo oe = new PackedObjectInfo(idBuf);
oe.setOffset((i << 8) | j);
objs.add(oe);
}
}
ChunkIndex idx = index(objs);

assertEquals(header(3, 2), header(objs));
assertEquals(256 * 256, idx.getObjectCount());
assertTrue(isSorted(objs));

for (int i = 0; i < objs.size(); i++) {
assertEquals(objs.get(i), idx.getObjectId(i));
assertEquals(objs.get(i).getOffset(), idx.getOffset(i));
assertEquals(objs.get(i).getOffset(), idx.findOffset(objs.get(i)));
}
}

@Test
public void testObjects65280_ManyBuckets() throws DhtException {
List<PackedObjectInfo> objs = new ArrayList<PackedObjectInfo>(65280);
MutableObjectId idBuf = new MutableObjectId();
for (int i = 0; i < 256; i++) {
idBuf.setByte(0, i & 0xff);
for (int j = 0; j < 255; j++) {
idBuf.setByte(3, j & 0xff);
PackedObjectInfo oe = new PackedObjectInfo(idBuf);
oe.setOffset((i << 8) | j);
objs.add(oe);
}
}
ChunkIndex idx = index(objs);

assertEquals(header(1, 2), header(objs));
assertEquals(65280, idx.getObjectCount());
assertTrue(isSorted(objs));

for (int i = 0; i < objs.size(); i++) {
assertEquals(objs.get(i), idx.getObjectId(i));
assertEquals(objs.get(i).getOffset(), idx.getOffset(i));
assertEquals(objs.get(i).getOffset(), idx.findOffset(objs.get(i)));
}
}

private boolean isSorted(List<PackedObjectInfo> objs) {
PackedObjectInfo last = objs.get(0);
for (int i = 1; i < objs.size(); i++) {
PackedObjectInfo oe = objs.get(i);
if (oe.compareTo(last) <= 0)
return false;
}
return true;
}

private List<PackedObjectInfo> list(PackedObjectInfo... all) {
List<PackedObjectInfo> objs = new ArrayList<PackedObjectInfo>();
for (PackedObjectInfo o : all)
objs.add(o);
return objs;
}

private int header(int fanoutTable, int offsetTable) {
return (0x01 << 8) | (fanoutTable << 3) | offsetTable;
}

private int header(List<PackedObjectInfo> objs) {
byte[] index = ChunkIndex.create(objs);
return NB.decodeUInt16(index, 0);
}

private ChunkIndex index(List<PackedObjectInfo> objs) throws DhtException {
ChunkKey key = null;
byte[] index = ChunkIndex.create(objs);
return ChunkIndex.fromBytes(key, index, 0, index.length);
}

private List<PackedObjectInfo> objects(int... values) {
List<PackedObjectInfo> objs = new ArrayList<PackedObjectInfo>();
for (int i = 0; i < values.length; i++)
objs.add(object(values[i], i * 10));
return objs;
}

private PackedObjectInfo object(int id, int off) {
MutableObjectId idBuf = new MutableObjectId();
idBuf.setByte(0, (id >>> 8) & 0xff);
idBuf.setByte(1, id & 0xff);

PackedObjectInfo obj = new PackedObjectInfo(idBuf);
obj.setOffset(off);
return obj;
}
}

+ 0
- 89
org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/ChunkKeyTest.java View File

@@ -1,89 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;

import org.eclipse.jgit.lib.ObjectId;
import org.junit.Test;

public class ChunkKeyTest {
@Test
public void testKey() {
RepositoryKey repo1 = RepositoryKey.fromInt(0x41234567);
RepositoryKey repo2 = RepositoryKey.fromInt(2);
ObjectId id = ObjectId
.fromString("3e64b928d51b3a28e89cfe2a3f0eeae35ef07839");

ChunkKey key1 = ChunkKey.create(repo1, id);
assertEquals(repo1.asInt(), key1.getRepositoryId());
assertEquals(id, key1.getChunkHash());
assertEquals("41234567.3e64b928d51b3a28e89cfe2a3f0eeae35ef07839",
key1.asString());

ChunkKey key2 = ChunkKey.fromBytes(key1.asBytes());
assertEquals(repo1.asInt(), key2.getRepositoryId());
assertEquals(id, key2.getChunkHash());
assertEquals("41234567.3e64b928d51b3a28e89cfe2a3f0eeae35ef07839",
key2.asString());

ChunkKey key3 = ChunkKey.fromString(key1.asString());
assertEquals(repo1.asInt(), key3.getRepositoryId());
assertEquals(id, key3.getChunkHash());
assertEquals("41234567.3e64b928d51b3a28e89cfe2a3f0eeae35ef07839",
key3.asString());

assertEquals(key1, key2);
assertEquals(key2, key3);

ChunkKey key4 = ChunkKey.create(repo2, id);
assertFalse("not equal", key2.equals(key4));

ObjectId id2 = ObjectId
.fromString("3e64b928d51b3a28e89cfe2a3f0eeae35ef07840");
ChunkKey key5 = ChunkKey.create(repo1, id2);
assertFalse("not equal", key2.equals(key5));
}
}

+ 0
- 343
org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/DhtPackParserTest.java View File

@@ -1,343 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
import static org.eclipse.jgit.lib.Constants.OBJ_OFS_DELTA;
import static org.eclipse.jgit.lib.Constants.OBJ_REF_DELTA;
import static org.eclipse.jgit.lib.Constants.PACK_SIGNATURE;
import static org.eclipse.jgit.lib.Constants.newMessageDigest;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.zip.Deflater;

import org.eclipse.jgit.lib.NullProgressMonitor;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.storage.dht.spi.memory.MemoryDatabase;
import org.eclipse.jgit.storage.file.PackLock;
import org.eclipse.jgit.storage.pack.DeltaEncoder;
import org.eclipse.jgit.util.NB;
import org.eclipse.jgit.util.TemporaryBuffer;
import org.junit.Before;
import org.junit.Test;

public class DhtPackParserTest {
private MemoryDatabase db;

@Before
public void setUpDatabase() {
db = new MemoryDatabase();
}

@Test
public void testParse() throws IOException {
DhtRepository repo = db.open("test.git");
repo.create(true);

ObjectInserter.Formatter fmt = new ObjectInserter.Formatter();
byte[] data0 = new byte[512];
Arrays.fill(data0, (byte) 0xf3);
ObjectId id0 = fmt.idFor(OBJ_BLOB, data0);

TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(64 * 1024);
packHeader(pack, 4);
objectHeader(pack, OBJ_BLOB, data0.length);
deflate(pack, data0);

byte[] data1 = clone(0x01, data0);
byte[] delta1 = delta(data0, data1);
ObjectId id1 = fmt.idFor(OBJ_BLOB, data1);
objectHeader(pack, OBJ_REF_DELTA, delta1.length);
id0.copyRawTo(pack);
deflate(pack, delta1);

byte[] data2 = clone(0x02, data1);
byte[] delta2 = delta(data1, data2);
ObjectId id2 = fmt.idFor(OBJ_BLOB, data2);
objectHeader(pack, OBJ_REF_DELTA, delta2.length);
id1.copyRawTo(pack);
deflate(pack, delta2);

byte[] data3 = clone(0x03, data2);
byte[] delta3 = delta(data2, data3);
ObjectId id3 = fmt.idFor(OBJ_BLOB, data3);
objectHeader(pack, OBJ_REF_DELTA, delta3.length);
id2.copyRawTo(pack);
deflate(pack, delta3);
digest(pack);

ObjectInserter ins = repo.newObjectInserter();
try {
InputStream is = new ByteArrayInputStream(pack.toByteArray());
DhtPackParser p = (DhtPackParser) ins.newPackParser(is);
PackLock lock = p.parse(NullProgressMonitor.INSTANCE);
assertNull(lock);
} finally {
ins.release();
}

ObjectReader ctx = repo.newObjectReader();
try {
assertTrue(ctx.has(id0, OBJ_BLOB));
assertTrue(ctx.has(id1, OBJ_BLOB));
assertTrue(ctx.has(id2, OBJ_BLOB));
assertTrue(ctx.has(id3, OBJ_BLOB));
} finally {
ctx.release();
}
}

@Test
public void testLargeFragmentWithRefDelta() throws IOException {
DhtInserterOptions insOpt = new DhtInserterOptions().setChunkSize(256);
@SuppressWarnings("unchecked")
DhtRepository repo = (DhtRepository) new DhtRepositoryBuilder<DhtRepositoryBuilder, DhtRepository, MemoryDatabase>()
.setInserterOptions(insOpt).setDatabase(db) //
.setRepositoryName("test.git") //
.setMustExist(false) //
.build();
repo.create(true);

ObjectInserter.Formatter fmt = new ObjectInserter.Formatter();
TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(64 * 1024);
packHeader(pack, 3);

byte[] data3 = new byte[4];
Arrays.fill(data3, (byte) 0xf3);
ObjectId id3 = fmt.idFor(OBJ_BLOB, data3);
objectHeader(pack, OBJ_BLOB, data3.length);
deflate(pack, data3);

byte[] data0 = newArray(insOpt.getChunkSize() * 2);
ObjectId id0 = fmt.idFor(OBJ_BLOB, data0);
objectHeader(pack, OBJ_BLOB, data0.length);
store(pack, data0);
assertTrue(pack.length() > insOpt.getChunkSize());

byte[] data1 = clone(1, data0);
ObjectId id1 = fmt.idFor(OBJ_BLOB, data1);
byte[] delta1 = delta(data0, data1);
objectHeader(pack, OBJ_REF_DELTA, delta1.length);
id0.copyRawTo(pack);
deflate(pack, delta1);

digest(pack);

ObjectInserter ins = repo.newObjectInserter();
try {
InputStream is = new ByteArrayInputStream(pack.toByteArray());
DhtPackParser p = (DhtPackParser) ins.newPackParser(is);
PackLock lock = p.parse(NullProgressMonitor.INSTANCE);
assertNull(lock);
} finally {
ins.release();
}

ObjectReader ctx = repo.newObjectReader();
try {
assertTrue(ctx.has(id0, OBJ_BLOB));
assertTrue(ctx.has(id1, OBJ_BLOB));
assertTrue(ctx.has(id3, OBJ_BLOB));
} finally {
ctx.release();
}
}

@Test
public void testLargeFragmentWithOfsDelta() throws IOException {
DhtInserterOptions insOpt = new DhtInserterOptions().setChunkSize(256);
@SuppressWarnings("unchecked")
DhtRepository repo = (DhtRepository) new DhtRepositoryBuilder<DhtRepositoryBuilder, DhtRepository, MemoryDatabase>()
.setInserterOptions(insOpt).setDatabase(db) //
.setRepositoryName("test.git") //
.setMustExist(false) //
.build();
repo.create(true);

ObjectInserter.Formatter fmt = new ObjectInserter.Formatter();
TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(64 * 1024);
packHeader(pack, 3);

byte[] data3 = new byte[4];
Arrays.fill(data3, (byte) 0xf3);
ObjectId id3 = fmt.idFor(OBJ_BLOB, data3);
objectHeader(pack, OBJ_BLOB, data3.length);
deflate(pack, data3);

byte[] data0 = newArray(insOpt.getChunkSize() * 2);
ObjectId id0 = fmt.idFor(OBJ_BLOB, data0);
long pos0 = pack.length();
objectHeader(pack, OBJ_BLOB, data0.length);
store(pack, data0);
assertTrue(pack.length() > insOpt.getChunkSize());

byte[] data1 = clone(1, data0);
ObjectId id1 = fmt.idFor(OBJ_BLOB, data1);
byte[] delta1 = delta(data0, data1);
long pos1 = pack.length();
objectHeader(pack, OBJ_OFS_DELTA, delta1.length);
writeOffset(pack, pos1 - pos0);
deflate(pack, delta1);

digest(pack);

ObjectInserter ins = repo.newObjectInserter();
try {
InputStream is = new ByteArrayInputStream(pack.toByteArray());
DhtPackParser p = (DhtPackParser) ins.newPackParser(is);
PackLock lock = p.parse(NullProgressMonitor.INSTANCE);
assertNull(lock);
} finally {
ins.release();
}

ObjectReader ctx = repo.newObjectReader();
try {
assertTrue(ctx.has(id0, OBJ_BLOB));
assertTrue(ctx.has(id1, OBJ_BLOB));
assertTrue(ctx.has(id3, OBJ_BLOB));
} finally {
ctx.release();
}
}

private byte[] newArray(int size) {
byte[] r = new byte[size];
for (int i = 0; i < r.length; i++)
r[i] = (byte) (42 + i);
return r;
}

private byte[] clone(int first, byte[] base) {
byte[] r = new byte[base.length];
System.arraycopy(base, 1, r, 1, r.length - 1);
r[0] = (byte) first;
return r;
}

private byte[] delta(byte[] base, byte[] dest) throws IOException {
ByteArrayOutputStream tmp = new ByteArrayOutputStream();
DeltaEncoder de = new DeltaEncoder(tmp, base.length, dest.length);
de.insert(dest, 0, 1);
de.copy(1, base.length - 1);
return tmp.toByteArray();
}

private void packHeader(TemporaryBuffer.Heap pack, int cnt)
throws IOException {
final byte[] hdr = new byte[8];
NB.encodeInt32(hdr, 0, 2);
NB.encodeInt32(hdr, 4, cnt);
pack.write(PACK_SIGNATURE);
pack.write(hdr, 0, 8);
}

private void objectHeader(TemporaryBuffer.Heap pack, int type, int sz)
throws IOException {
byte[] buf = new byte[8];
int nextLength = sz >>> 4;
buf[0] = (byte) ((nextLength > 0 ? 0x80 : 0x00) | (type << 4) | (sz & 0x0F));
sz = nextLength;
int n = 1;
while (sz > 0) {
nextLength >>>= 7;
buf[n++] = (byte) ((nextLength > 0 ? 0x80 : 0x00) | (sz & 0x7F));
sz = nextLength;
}
pack.write(buf, 0, n);
}

private void writeOffset(TemporaryBuffer.Heap pack, long offsetDiff)
throws IOException {
byte[] headerBuffer = new byte[32];
int n = headerBuffer.length - 1;
headerBuffer[n] = (byte) (offsetDiff & 0x7F);
while ((offsetDiff >>= 7) > 0)
headerBuffer[--n] = (byte) (0x80 | (--offsetDiff & 0x7F));
pack.write(headerBuffer, n, headerBuffer.length - n);
}

private void deflate(TemporaryBuffer.Heap pack, byte[] content)
throws IOException {
final Deflater deflater = new Deflater();
final byte[] buf = new byte[128];
deflater.setInput(content, 0, content.length);
deflater.finish();
do {
final int n = deflater.deflate(buf, 0, buf.length);
if (n > 0)
pack.write(buf, 0, n);
} while (!deflater.finished());
deflater.end();
}

private void store(TemporaryBuffer.Heap pack, byte[] content)
throws IOException {
final Deflater deflater = new Deflater(Deflater.NO_COMPRESSION);
final byte[] buf = new byte[128];
deflater.setInput(content, 0, content.length);
deflater.finish();
do {
final int n = deflater.deflate(buf, 0, buf.length);
if (n > 0)
pack.write(buf, 0, n);
} while (!deflater.finished());
deflater.end();
}

private void digest(TemporaryBuffer.Heap buf) throws IOException {
MessageDigest md = newMessageDigest();
md.update(buf.toByteArray());
buf.write(md.digest());
}
}

+ 0
- 96
org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/DhtRepositoryBuilderTest.java View File

@@ -1,96 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

import java.io.IOException;

import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.storage.dht.spi.memory.MemoryDatabase;
import org.junit.Before;
import org.junit.Test;

public class DhtRepositoryBuilderTest {
private MemoryDatabase db;

@Before
public void setUpDatabase() {
db = new MemoryDatabase();
}

@Test
public void testCreateAndOpen() throws IOException {
String name = "test.git";

DhtRepository repo1 = db.open(name);
assertSame(db, repo1.getDatabase());
assertSame(repo1, repo1.getRefDatabase().getRepository());
assertSame(repo1, repo1.getObjectDatabase().getRepository());

assertEquals(name, repo1.getRepositoryName().asString());
assertNull(repo1.getRepositoryKey());
assertFalse(repo1.getObjectDatabase().exists());

repo1.create(true);
assertNotNull(repo1.getRepositoryKey());
assertTrue(repo1.getObjectDatabase().exists());

DhtRepository repo2 = db.open(name);
assertNotNull(repo2.getRepositoryKey());
assertTrue(repo2.getObjectDatabase().exists());
assertEquals(0, repo2.getAllRefs().size());

Ref HEAD = repo2.getRef(Constants.HEAD);
assertTrue(HEAD.isSymbolic());
assertEquals(Constants.R_HEADS + Constants.MASTER, //
HEAD.getLeaf().getName());
}
}

+ 0
- 117
org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/LargeNonDeltaObjectTest.java View File

@@ -1,117 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.util.Arrays;
import java.util.zip.Deflater;

import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.ObjectStream;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.dht.spi.memory.MemoryDatabase;
import org.eclipse.jgit.util.IO;
import org.junit.Before;
import org.junit.Test;

public class LargeNonDeltaObjectTest {
private MemoryDatabase db;

@Before
public void setUpDatabase() {
db = new MemoryDatabase();
}

@SuppressWarnings("unchecked")
@Test
public void testInsertRead() throws IOException {
DhtInserterOptions insopt = new DhtInserterOptions();
insopt.setChunkSize(128);
insopt.setCompression(Deflater.NO_COMPRESSION);

Repository repo = new DhtRepositoryBuilder() //
.setDatabase(db) //
.setInserterOptions(insopt) //
.setRepositoryName("test.git") //
.setMustExist(false) //
.build();
repo.create(true);

byte[] data = new byte[insopt.getChunkSize() * 3];
Arrays.fill(data, (byte) 0x42);

ObjectInserter ins = repo.newObjectInserter();
ObjectId id = ins.insert(Constants.OBJ_BLOB, data);
ins.flush();
ins.release();

ObjectReader reader = repo.newObjectReader();
ObjectLoader ldr = reader.open(id);
assertEquals(Constants.OBJ_BLOB, ldr.getType());
assertEquals(data.length, ldr.getSize());
assertTrue(ldr.isLarge());

byte[] dst = new byte[data.length];
ObjectStream in = ldr.openStream();
IO.readFully(in, dst, 0, dst.length);
assertTrue(Arrays.equals(data, dst));
in.close();

// Reading should still work, even though initial chunk is gone.
dst = new byte[data.length];
in = ldr.openStream();
IO.readFully(in, dst, 0, dst.length);
assertTrue(Arrays.equals(data, dst));
in.close();

reader.release();
}
}

+ 0
- 76
org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/ObjectIndexKeyTest.java View File

@@ -1,76 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.junit.Assert.assertEquals;

import org.eclipse.jgit.lib.ObjectId;
import org.junit.Test;

public class ObjectIndexKeyTest {
@Test
public void testKey() {
RepositoryKey repo = RepositoryKey.fromInt(0x41234567);
ObjectId id = ObjectId
.fromString("3e64b928d51b3a28e89cfe2a3f0eeae35ef07839");

ObjectIndexKey key1 = ObjectIndexKey.create(repo, id);
assertEquals(repo.asInt(), key1.getRepositoryId());
assertEquals(key1, id);
assertEquals("41234567.3e64b928d51b3a28e89cfe2a3f0eeae35ef07839",
key1.asString());

ObjectIndexKey key2 = ObjectIndexKey.fromBytes(key1.asBytes());
assertEquals(repo.asInt(), key2.getRepositoryId());
assertEquals(key2, id);
assertEquals("41234567.3e64b928d51b3a28e89cfe2a3f0eeae35ef07839",
key2.asString());

ObjectIndexKey key3 = ObjectIndexKey.fromString(key1.asString());
assertEquals(repo.asInt(), key3.getRepositoryId());
assertEquals(key3, id);
assertEquals("41234567.3e64b928d51b3a28e89cfe2a3f0eeae35ef07839",
key3.asString());
}
}

+ 0
- 59
org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/RepositoryKeyTest.java View File

@@ -1,59 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class RepositoryKeyTest {
@Test
public void fromString() {
assertEquals(RepositoryKey.create(2), RepositoryKey
.fromString("40000000"));

assertEquals(RepositoryKey.create(1), RepositoryKey
.fromString("80000000"));
}
}

+ 0
- 75
org.eclipse.jgit.storage.dht.test/tst/org/eclipse/jgit/storage/dht/TimeoutTest.java View File

@@ -1,75 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.junit.Assert.assertEquals;

import java.util.concurrent.TimeUnit;

import org.eclipse.jgit.lib.Config;
import org.junit.Test;

public class TimeoutTest {
@Test
public void testGetTimeout() {
Timeout def = Timeout.seconds(2);
Config cfg = new Config();
Timeout t;

cfg.setString("core", "dht", "timeout", "500 ms");
t = Timeout.getTimeout(cfg, "core", "dht", "timeout", def);
assertEquals(500, t.getTime());
assertEquals(TimeUnit.MILLISECONDS, t.getUnit());

cfg.setString("core", "dht", "timeout", "5.2 sec");
t = Timeout.getTimeout(cfg, "core", "dht", "timeout", def);
assertEquals(5200, t.getTime());
assertEquals(TimeUnit.MILLISECONDS, t.getUnit());

cfg.setString("core", "dht", "timeout", "1 min");
t = Timeout.getTimeout(cfg, "core", "dht", "timeout", def);
assertEquals(60, t.getTime());
assertEquals(TimeUnit.SECONDS, t.getUnit());
}
}

+ 0
- 8
org.eclipse.jgit.storage.dht/.classpath View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>

+ 0
- 125
org.eclipse.jgit.storage.dht/.fbprefs View File

@@ -1,125 +0,0 @@
#FindBugs User Preferences
#Mon May 04 16:24:13 PDT 2009
detectorAppendingToAnObjectOutputStream=AppendingToAnObjectOutputStream|true
detectorBadAppletConstructor=BadAppletConstructor|false
detectorBadResultSetAccess=BadResultSetAccess|true
detectorBadSyntaxForRegularExpression=BadSyntaxForRegularExpression|true
detectorBadUseOfReturnValue=BadUseOfReturnValue|true
detectorBadlyOverriddenAdapter=BadlyOverriddenAdapter|true
detectorBooleanReturnNull=BooleanReturnNull|true
detectorCallToUnsupportedMethod=CallToUnsupportedMethod|true
detectorCheckImmutableAnnotation=CheckImmutableAnnotation|true
detectorCheckTypeQualifiers=CheckTypeQualifiers|true
detectorCloneIdiom=CloneIdiom|false
detectorComparatorIdiom=ComparatorIdiom|true
detectorConfusedInheritance=ConfusedInheritance|true
detectorConfusionBetweenInheritedAndOuterMethod=ConfusionBetweenInheritedAndOuterMethod|true
detectorCrossSiteScripting=CrossSiteScripting|true
detectorDoInsideDoPrivileged=DoInsideDoPrivileged|true
detectorDontCatchIllegalMonitorStateException=DontCatchIllegalMonitorStateException|true
detectorDontUseEnum=DontUseEnum|true
detectorDroppedException=DroppedException|true
detectorDumbMethodInvocations=DumbMethodInvocations|true
detectorDumbMethods=DumbMethods|true
detectorDuplicateBranches=DuplicateBranches|true
detectorEmptyZipFileEntry=EmptyZipFileEntry|true
detectorEqualsOperandShouldHaveClassCompatibleWithThis=EqualsOperandShouldHaveClassCompatibleWithThis|true
detectorFinalizerNullsFields=FinalizerNullsFields|true
detectorFindBadCast2=FindBadCast2|true
detectorFindBadForLoop=FindBadForLoop|true
detectorFindCircularDependencies=FindCircularDependencies|false
detectorFindDeadLocalStores=FindDeadLocalStores|true
detectorFindDoubleCheck=FindDoubleCheck|true
detectorFindEmptySynchronizedBlock=FindEmptySynchronizedBlock|true
detectorFindFieldSelfAssignment=FindFieldSelfAssignment|true
detectorFindFinalizeInvocations=FindFinalizeInvocations|true
detectorFindFloatEquality=FindFloatEquality|true
detectorFindHEmismatch=FindHEmismatch|true
detectorFindInconsistentSync2=FindInconsistentSync2|true
detectorFindJSR166LockMonitorenter=FindJSR166LockMonitorenter|true
detectorFindLocalSelfAssignment2=FindLocalSelfAssignment2|true
detectorFindMaskedFields=FindMaskedFields|true
detectorFindMismatchedWaitOrNotify=FindMismatchedWaitOrNotify|true
detectorFindNakedNotify=FindNakedNotify|true
detectorFindNonSerializableStoreIntoSession=FindNonSerializableStoreIntoSession|true
detectorFindNonSerializableValuePassedToWriteObject=FindNonSerializableValuePassedToWriteObject|true
detectorFindNonShortCircuit=FindNonShortCircuit|true
detectorFindNullDeref=FindNullDeref|true
detectorFindNullDerefsInvolvingNonShortCircuitEvaluation=FindNullDerefsInvolvingNonShortCircuitEvaluation|true
detectorFindOpenStream=FindOpenStream|true
detectorFindPuzzlers=FindPuzzlers|true
detectorFindRefComparison=FindRefComparison|true
detectorFindReturnRef=FindReturnRef|true
detectorFindRunInvocations=FindRunInvocations|true
detectorFindSelfComparison=FindSelfComparison|true
detectorFindSelfComparison2=FindSelfComparison2|true
detectorFindSleepWithLockHeld=FindSleepWithLockHeld|true
detectorFindSpinLoop=FindSpinLoop|true
detectorFindSqlInjection=FindSqlInjection|true
detectorFindTwoLockWait=FindTwoLockWait|true
detectorFindUncalledPrivateMethods=FindUncalledPrivateMethods|true
detectorFindUnconditionalWait=FindUnconditionalWait|true
detectorFindUninitializedGet=FindUninitializedGet|true
detectorFindUnrelatedTypesInGenericContainer=FindUnrelatedTypesInGenericContainer|true
detectorFindUnreleasedLock=FindUnreleasedLock|true
detectorFindUnsatisfiedObligation=FindUnsatisfiedObligation|true
detectorFindUnsyncGet=FindUnsyncGet|true
detectorFindUselessControlFlow=FindUselessControlFlow|true
detectorFormatStringChecker=FormatStringChecker|true
detectorHugeSharedStringConstants=HugeSharedStringConstants|true
detectorIDivResultCastToDouble=IDivResultCastToDouble|true
detectorIncompatMask=IncompatMask|true
detectorInconsistentAnnotations=InconsistentAnnotations|true
detectorInefficientMemberAccess=InefficientMemberAccess|false
detectorInefficientToArray=InefficientToArray|true
detectorInfiniteLoop=InfiniteLoop|true
detectorInfiniteRecursiveLoop=InfiniteRecursiveLoop|true
detectorInfiniteRecursiveLoop2=InfiniteRecursiveLoop2|false
detectorInheritanceUnsafeGetResource=InheritanceUnsafeGetResource|true
detectorInitializationChain=InitializationChain|true
detectorInstantiateStaticClass=InstantiateStaticClass|true
detectorInvalidJUnitTest=InvalidJUnitTest|true
detectorIteratorIdioms=IteratorIdioms|true
detectorLazyInit=LazyInit|true
detectorLoadOfKnownNullValue=LoadOfKnownNullValue|true
detectorMethodReturnCheck=MethodReturnCheck|true
detectorMultithreadedInstanceAccess=MultithreadedInstanceAccess|true
detectorMutableLock=MutableLock|true
detectorMutableStaticFields=MutableStaticFields|true
detectorNaming=Naming|true
detectorNumberConstructor=NumberConstructor|true
detectorOverridingEqualsNotSymmetrical=OverridingEqualsNotSymmetrical|true
detectorPreferZeroLengthArrays=PreferZeroLengthArrays|true
detectorPublicSemaphores=PublicSemaphores|false
detectorQuestionableBooleanAssignment=QuestionableBooleanAssignment|true
detectorReadReturnShouldBeChecked=ReadReturnShouldBeChecked|true
detectorRedundantInterfaces=RedundantInterfaces|true
detectorRepeatedConditionals=RepeatedConditionals|true
detectorRuntimeExceptionCapture=RuntimeExceptionCapture|true
detectorSerializableIdiom=SerializableIdiom|true
detectorStartInConstructor=StartInConstructor|true
detectorStaticCalendarDetector=StaticCalendarDetector|true
detectorStringConcatenation=StringConcatenation|true
detectorSuperfluousInstanceOf=SuperfluousInstanceOf|true
detectorSuspiciousThreadInterrupted=SuspiciousThreadInterrupted|true
detectorSwitchFallthrough=SwitchFallthrough|true
detectorSynchronizeAndNullCheckField=SynchronizeAndNullCheckField|true
detectorSynchronizeOnClassLiteralNotGetClass=SynchronizeOnClassLiteralNotGetClass|true
detectorSynchronizingOnContentsOfFieldToProtectField=SynchronizingOnContentsOfFieldToProtectField|true
detectorURLProblems=URLProblems|true
detectorUncallableMethodOfAnonymousClass=UncallableMethodOfAnonymousClass|true
detectorUnnecessaryMath=UnnecessaryMath|true
detectorUnreadFields=UnreadFields|true
detectorUseObjectEquals=UseObjectEquals|false
detectorUselessSubclassMethod=UselessSubclassMethod|false
detectorVarArgsProblems=VarArgsProblems|true
detectorVolatileUsage=VolatileUsage|true
detectorWaitInLoop=WaitInLoop|true
detectorWrongMapIterator=WrongMapIterator|true
detectorXMLFactoryBypass=XMLFactoryBypass|true
detector_threshold=2
effort=default
excludefilter0=findBugs/FindBugsExcludeFilter.xml
filter_settings=Medium|BAD_PRACTICE,CORRECTNESS,MT_CORRECTNESS,PERFORMANCE,STYLE|false
filter_settings_neg=MALICIOUS_CODE,NOISE,I18N,SECURITY,EXPERIMENTAL|
run_at_full_build=true

+ 0
- 2
org.eclipse.jgit.storage.dht/.gitignore View File

@@ -1,2 +0,0 @@
/bin
/target

+ 0
- 34
org.eclipse.jgit.storage.dht/.project View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.eclipse.jgit.storage.dht</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
</natures>
</projectDescription>

+ 0
- 3
org.eclipse.jgit.storage.dht/.settings/org.eclipse.core.resources.prefs View File

@@ -1,3 +0,0 @@
#Mon Aug 11 16:46:12 PDT 2008
eclipse.preferences.version=1
encoding/<project>=UTF-8

+ 0
- 3
org.eclipse.jgit.storage.dht/.settings/org.eclipse.core.runtime.prefs View File

@@ -1,3 +0,0 @@
#Mon Mar 24 18:55:50 EDT 2008
eclipse.preferences.version=1
line.separator=\n

+ 0
- 334
org.eclipse.jgit.storage.dht/.settings/org.eclipse.jdt.core.prefs View File

@@ -1,334 +0,0 @@
#Fri Oct 02 18:43:47 PDT 2009
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.doc.comment.support=enabled
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=warning
org.eclipse.jdt.core.compiler.problem.deprecation=warning
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
org.eclipse.jdt.core.compiler.problem.nullReference=warning
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedImport=error
org.eclipse.jdt.core.compiler.problem.unusedLabel=error
org.eclipse.jdt.core.compiler.problem.unusedLocal=error
org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
org.eclipse.jdt.core.compiler.source=1.5
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=1
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=80
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true

+ 0
- 62
org.eclipse.jgit.storage.dht/.settings/org.eclipse.jdt.ui.prefs View File

@@ -1,62 +0,0 @@
#Thu Aug 26 12:30:58 CDT 2010
eclipse.preferences.version=1
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_JGit Format
formatter_settings_version=11
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=99
org.eclipse.jdt.ui.staticondemandthreshold=99
org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
sp_cleanup.add_default_serial_version_id=true
sp_cleanup.add_generated_serial_version_id=false
sp_cleanup.add_missing_annotations=false
sp_cleanup.add_missing_deprecated_annotations=true
sp_cleanup.add_missing_methods=false
sp_cleanup.add_missing_nls_tags=false
sp_cleanup.add_missing_override_annotations=true
sp_cleanup.add_missing_override_annotations_interface_methods=false
sp_cleanup.add_serial_version_id=false
sp_cleanup.always_use_blocks=true
sp_cleanup.always_use_parentheses_in_expressions=false
sp_cleanup.always_use_this_for_non_static_field_access=false
sp_cleanup.always_use_this_for_non_static_method_access=false
sp_cleanup.convert_to_enhanced_for_loop=false
sp_cleanup.correct_indentation=false
sp_cleanup.format_source_code=true
sp_cleanup.format_source_code_changes_only=true
sp_cleanup.make_local_variable_final=false
sp_cleanup.make_parameters_final=false
sp_cleanup.make_private_fields_final=true
sp_cleanup.make_type_abstract_if_missing_method=false
sp_cleanup.make_variable_declarations_final=false
sp_cleanup.never_use_blocks=false
sp_cleanup.never_use_parentheses_in_expressions=true
sp_cleanup.on_save_use_additional_actions=true
sp_cleanup.organize_imports=false
sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
sp_cleanup.remove_private_constructors=true
sp_cleanup.remove_trailing_whitespaces=true
sp_cleanup.remove_trailing_whitespaces_all=true
sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
sp_cleanup.remove_unnecessary_casts=false
sp_cleanup.remove_unnecessary_nls_tags=false
sp_cleanup.remove_unused_imports=false
sp_cleanup.remove_unused_local_variables=false
sp_cleanup.remove_unused_private_fields=true
sp_cleanup.remove_unused_private_members=false
sp_cleanup.remove_unused_private_methods=true
sp_cleanup.remove_unused_private_types=true
sp_cleanup.sort_members=false
sp_cleanup.sort_members_all=false
sp_cleanup.use_blocks=false
sp_cleanup.use_blocks_only_for_return_and_throw=false
sp_cleanup.use_parentheses_in_expressions=false
sp_cleanup.use_this_for_non_static_field_access=false
sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
sp_cleanup.use_this_for_non_static_method_access=false
sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true

+ 0
- 4
org.eclipse.jgit.storage.dht/.settings/org.eclipse.mylyn.tasks.ui.prefs View File

@@ -1,4 +0,0 @@
#Tue Jul 19 20:11:28 CEST 2011
eclipse.preferences.version=1
project.repository.kind=bugzilla
project.repository.url=https\://bugs.eclipse.org/bugs

+ 0
- 3
org.eclipse.jgit.storage.dht/.settings/org.eclipse.mylyn.team.ui.prefs View File

@@ -1,3 +0,0 @@
#Tue Jul 19 20:11:28 CEST 2011
commit.comment.template=${task.description} \n\nBug\: ${task.key}
eclipse.preferences.version=1

+ 0
- 94
org.eclipse.jgit.storage.dht/.settings/org.eclipse.pde.api.tools.prefs View File

@@ -1,94 +0,0 @@
#Tue Oct 18 00:52:01 CEST 2011
ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
ILLEGAL_EXTEND=Warning
ILLEGAL_IMPLEMENT=Warning
ILLEGAL_INSTANTIATE=Warning
ILLEGAL_OVERRIDE=Warning
ILLEGAL_REFERENCE=Warning
INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
INVALID_JAVADOC_TAG=Ignore
INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
LEAK_EXTEND=Warning
LEAK_FIELD_DECL=Warning
LEAK_IMPLEMENT=Warning
LEAK_METHOD_PARAM=Warning
LEAK_METHOD_RETURN_TYPE=Warning
METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
UNUSED_PROBLEM_FILTERS=Warning
automatically_removed_unused_problem_filters=false
eclipse.preferences.version=1
incompatible_api_component_version=Error
incompatible_api_component_version_include_major_without_breaking_change=Disabled
incompatible_api_component_version_include_minor_without_api_change=Disabled
invalid_since_tag_version=Error
malformed_since_tag=Error
missing_since_tag=Error
report_api_breakage_when_major_version_incremented=Disabled
report_resolution_errors_api_component=Warning

+ 0
- 26
org.eclipse.jgit.storage.dht/META-INF/MANIFEST.MF View File

@@ -1,26 +0,0 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %plugin_name
Bundle-SymbolicName: org.eclipse.jgit.storage.dht
Bundle-Version: 2.1.0.qualifier
Bundle-Localization: plugin
Bundle-Vendor: %provider_name
Export-Package: org.eclipse.jgit.storage.dht;version="2.1.0",
org.eclipse.jgit.storage.dht.spi;version="2.1.0",
org.eclipse.jgit.storage.dht.spi.cache;version="2.1.0",
org.eclipse.jgit.storage.dht.spi.util;version="2.1.0",
org.eclipse.jgit.storage.dht.spi.memory;version="2.1.0"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: com.google.protobuf;version="[2.4.0,2.5.0)",
org.eclipse.jgit.errors;version="[2.1.0,2.2.0)",
org.eclipse.jgit.generated.storage.dht.proto;version="[2.1.0,2.2.0)",
org.eclipse.jgit.lib;version="[2.1.0,2.2.0)",
org.eclipse.jgit.nls;version="[2.1.0,2.2.0)",
org.eclipse.jgit.revwalk;version="[2.1.0,2.2.0)",
org.eclipse.jgit.transport;version="[2.1.0,2.2.0)",
org.eclipse.jgit.treewalk;version="[2.1.0,2.2.0)",
org.eclipse.jgit.storage.file;version="[2.1.0,2.2.0)",
org.eclipse.jgit.storage.pack;version="[2.1.0,2.2.0)",
org.eclipse.jgit.util;version="[2.1.0,2.2.0)",
org.eclipse.jgit.util.io;version="[2.1.0,2.2.0)"

+ 0
- 89
org.eclipse.jgit.storage.dht/README View File

@@ -1,89 +0,0 @@
JGit Storage on DHT
-------------------

This implementation still has some pending issues:

* DhtInserter must skip existing objects

DirCache writes all trees to the ObjectInserter, letting the
inserter figure out which trees we already have, and which are new.
DhtInserter should buffer trees into a chunk, then before writing
the chunk to the DHT do a batch lookup to find the existing
ObjectInfo (if any). If any exist, the chunk should be compacted to
eliminate these objects, and if there is room in the chunk for more
objects, it should go back to the DhtInserter to be filled further
before flushing.

This implies the DhtInserter needs to work on multiple chunks at
once, and may need to combine chunks together when there is more
than one partial chunk.

* DhtPackParser must check for collisions

Because ChunkCache blindly assumes any copy of an object is an OK
copy of an object, DhtPackParser needs to validate all new objects
at the end of its importing phase, before it links the objects into
the ObjectIndexTable. Most objects won't already exist, but some
may, and those that do must either be removed from their chunk, or
have their content byte-for-byte validated.

Removal from a chunk just means deleting it from the chunk's local
index, and not writing it to the global ObjectIndexTable. This
creates a hole in the chunk which is wasted space, and that isn't
very useful. Fortunately objects that fit fully within one chunk
may be easy to inflate and double check, as they are small. Objects
that are big span multiple chunks, and the new chunks can simply be
deleted from the ChunkTable, leaving the original chunks.

Deltas can be checked quickly by inflating the delta and checking
only the insertion point text, comparing that to the existing data
in the repository. Unfortunately the repository is likely to use a
different delta representation, which means at least one of them
will need to be fully inflated to check the delta against.

* DhtPackParser should handle small-huge-small-huge

Multiple chunks need to be open at once, in case we get a bad
pattern of small-object, huge-object, small-object, huge-object. In
this case the small-objects should be put together into the same
chunk, to prevent having too many tiny chunks. This is tricky to do
with OFS_DELTA. A long OFS_DELTA requires all prior chunks to be
closed out so we know their lengths.

* RepresentationSelector performance bad on Cassandra

The 1.8 million batch lookups done for linux-2.6 kills Cassandra, it
cannot handle this read load.

* READ_REPAIR isn't fully accurate

There are a lot of places where the generic DHT code should be
helping to validate the local replica is consistent, and where it is
not, help the underlying storage system to heal the local replica by
reading from a remote replica and putting it back to the local one.
Most of this should be handled in the DHT SPI layer, but the generic
DHT code should be giving better hints during get() method calls.

* LOCAL / WORLD writes

Many writes should be done locally first, before they replicate to
the other replicas, as they might be backed out on an abort.

Likewise some writes must take place across sufficient replicas to
ensure the write is not lost... and this may include ensuring that
earlier local-only writes have actually been committed to all
replicas. This committing to replicas might be happening in the
background automatically after the local write (e.g. Cassandra will
start to send writes made by one node to other nodes, but doesn't
promise they finish). But parts of the code may need to force this
replication to complete before the higher level git operation ends.

* Forks/alternates

Forking is common, but we should avoid duplicating content into the
fork if the base repository has it. This requires some sort of
change to the key structure so that chunks are owned by an object
pool, and the object pool owns the repositories that use it. GC
proceeds at the object pool level, rather than the repository level,
but might want to take some of the reference namespace into account
to avoid placing forked less-common content near primary content.

+ 0
- 59
org.eclipse.jgit.storage.dht/about.html View File

@@ -1,59 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Eclipse Distribution License - Version 1.0</title>
<style type="text/css">
body {
size: 8.5in 11.0in;
margin: 0.25in 0.5in 0.25in 0.5in;
tab-interval: 0.5in;
}
p {
margin-left: auto;
margin-top: 0.5em;
margin-bottom: 0.5em;
}
p.list {
margin-left: 0.5in;
margin-top: 0.05em;
margin-bottom: 0.05em;
}
</style>

</head>

<body lang="EN-US">

<p><b>Eclipse Distribution License - v 1.0</b></p>

<p>Copyright (c) 2007, Eclipse Foundation, Inc. and its licensors. </p>

<p>All rights reserved.</p>
<p>Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
<ul><li>Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. </li>
<li>Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. </li>
<li>Neither the name of the Eclipse Foundation, Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission. </li></ul>
</p>
<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.</p>

</body>

</html>

+ 0
- 6
org.eclipse.jgit.storage.dht/build.properties View File

@@ -1,6 +0,0 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.properties,\
about.html

+ 0
- 2
org.eclipse.jgit.storage.dht/plugin.properties View File

@@ -1,2 +0,0 @@
plugin_name=JGit DHT Storage
provider_name=Eclipse.org

+ 0
- 181
org.eclipse.jgit.storage.dht/pom.xml View File

@@ -1,181 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2011, Google Inc.
and other copyright owners as documented in the project's IP log.

This program and the accompanying materials are made available
under the terms of the Eclipse Distribution License v1.0 which
accompanies this distribution, is reproduced below, and is
available at http://www.eclipse.org/org/documents/edl-v10.php

All rights reserved.

Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following
conditions are met:

- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.

- Neither the name of the Eclipse Foundation, Inc. nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit-parent</artifactId>
<version>2.1.0-SNAPSHOT</version>
</parent>

<artifactId>org.eclipse.jgit.storage.dht</artifactId>
<name>JGit - DHT Storage</name>

<description>
Git repository storage on a distributed hashtable
</description>

<properties>
<translate-qualifier/>
</properties>

<dependencies>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.generated.storage.dht.proto</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

<build>
<sourceDirectory>src/</sourceDirectory>

<resources>
<resource>
<directory>.</directory>
<includes>
<include>plugin.properties</include>
<include>about.html</include>
</includes>
</resource>
<resource>
<directory>resources/</directory>
</resource>
</resources>

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<inherited>true</inherited>
<executions>
<execution>
<id>attach-sources</id>
<phase>process-classes</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<archive>
<manifestFile>${source-bundle-manifest}</manifestFile>
</archive>
</configuration>
</execution>
</executions>
</plugin>

<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>${bundle-manifest}</manifestFile>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<configuration>
<findbugsXmlOutput>true</findbugsXmlOutput>
<failOnError>false</failOnError>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<configuration>
<sourceEncoding>utf-8</sourceEncoding>
<minimumTokens>100</minimumTokens>
<targetJdk>1.5</targetJdk>
<format>xml</format>
<failOnViolation>false</failOnViolation>
</configuration>
<executions>
<execution>
<goals>
<goal>cpd-check</goal>
</goals>
</execution>
</executions>
</plugin>

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>clirr-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>clirr-maven-plugin</artifactId>
<version>${clirr-version}</version>
<configuration>
<comparisonVersion>${jgit-last-release-version}</comparisonVersion>
<minSeverity>info</minSeverity>
</configuration>
</plugin>
</plugins>
</reporting>
</project>

+ 0
- 32
org.eclipse.jgit.storage.dht/resources/org/eclipse/jgit/storage/dht/DhtText.properties View File

@@ -1,32 +0,0 @@
cannotInsertObject=Cannot insert any objects into a ChunkWriter
corruptChunk=Chunk {0} is corrupt and does not match its name
corruptCompressedObject=Corrupt deflate stream in {0} at {1}
cycleInDeltaChain=Cycle in delta chain {0} offset {1}
databaseRequired=Database is required
expectedObjectSizeDuringCopyAsIs=Object {0} has size of 0
invalidCachedPackInfo=Invalid CachedPackInfo on {0} {1}
invalidChunkKey=Invalid ChunkKey {0}
invalidChunkMeta=Invalid ChunkMeta on {0}
invalidObjectIndexKey=Invalid ObjectIndexKey {0}
invalidObjectInfo=Invalid ObjectInfo for {0} from {1}
invalidRefData=Invalid RefData on {0}
missingChunk=Missing {0}
missingLongOffsetBase=Missing base for offset -{1} in meta of {0}
nameRequired=Name or key is required
noSavedTypeForBase=No type information for base object at {0}
notTimeUnit=Invalid time unit value: {0}={1}
objectListSelectingName=Selecting list name
objectListCountingFrom=Counting objects in {0}
objectTypeUnknown=unknown
packParserInvalidPointer=Invalid pointer inside pack parser: {0}, chunk {1}, offset {2}.
packParserRollbackFailed=DhtPackParser rollback failed
recordingObjects=Recording objects
repositoryAlreadyExists=Repository {0} already exists
repositoryMustBeBare=Only bare repositories are supported
shortCompressedObject=Short deflate stream in {0} at {1}
timeoutChunkMeta=Timeout waiting for ChunkMeta
timeoutLocatingRepository=Timeout locating {0}
tooManyObjectsInPack={0} is too many objects in a pack file
unsupportedChunkIndex=Unsupported index version {0} in {1}
unsupportedObjectTypeInChunk=Unknown object type {0} in {1} at {2}
wrongChunkPositionInCachedPack=Cached pack {0} put chunk {1} at {2} but delta in {3} expects it at {4}

+ 0
- 1151
org.eclipse.jgit.storage.dht/resources/org/eclipse/jgit/storage/dht/dht-schema.html
File diff suppressed because it is too large
View File


+ 0
- 74
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/AsyncCallback.java View File

@@ -1,74 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

/**
* Receives notification when an asynchronous operation has finished.
* <p>
* Many storage provider interface operations use this type to signal completion
* or failure status of an operation that runs asynchronously to the caller.
* <p>
* Only one of {@link #onSuccess(Object)} or {@link #onFailure(DhtException)}
* should be invoked.
*
* @param <T>
* type of object returned from the operation on success.
*/
public interface AsyncCallback<T> {
/**
* Notification the operation completed.
*
* @param result
* the result value from the operation.
*/
public void onSuccess(T result);

/**
* Notification the operation failed.
*
* @param error
* a description of the error.
*/
public void onFailure(DhtException error);
}

+ 0
- 264
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/BatchObjectLookup.java View File

@@ -1,264 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static java.util.concurrent.TimeUnit.MILLISECONDS;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.ReentrantLock;

import org.eclipse.jgit.lib.NullProgressMonitor;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.lib.ThreadSafeProgressMonitor;
import org.eclipse.jgit.storage.dht.spi.Context;
import org.eclipse.jgit.storage.dht.spi.Database;

abstract class BatchObjectLookup<T extends ObjectId> {
private final RepositoryKey repo;

private final Database db;

private final DhtReader reader;

private final ThreadSafeProgressMonitor progress;

private final Semaphore batches;

private final ReentrantLock resultLock;

private final AtomicReference<DhtException> error;

private final int concurrentBatches;

private final List<T> retry;

private final ArrayList<ObjectInfo> tmp;

private boolean retryMissingObjects;

private boolean cacheLoadedInfo;

BatchObjectLookup(DhtReader reader) {
this(reader, null);
}

BatchObjectLookup(DhtReader reader, ProgressMonitor monitor) {
this.repo = reader.getRepositoryKey();
this.db = reader.getDatabase();
this.reader = reader;

if (monitor != null && monitor != NullProgressMonitor.INSTANCE)
this.progress = new ThreadSafeProgressMonitor(monitor);
else
this.progress = null;

this.concurrentBatches = reader.getOptions()
.getObjectIndexConcurrentBatches();

this.batches = new Semaphore(concurrentBatches);
this.resultLock = new ReentrantLock();
this.error = new AtomicReference<DhtException>();
this.retry = new ArrayList<T>();
this.tmp = new ArrayList<ObjectInfo>(4);
}

void setRetryMissingObjects(boolean on) {
retryMissingObjects = on;
}

void setCacheLoadedInfo(boolean on) {
cacheLoadedInfo = on;
}

void select(Iterable<T> objects) throws IOException {
selectInBatches(Context.FAST_MISSING_OK, lookInCache(objects));

// Not all of the selection ran with fast options.
if (retryMissingObjects && !retry.isEmpty()) {
batches.release(concurrentBatches);
selectInBatches(Context.READ_REPAIR, retry);
}

if (progress != null)
progress.pollForUpdates();
}

private Iterable<T> lookInCache(Iterable<T> objects) {
RecentInfoCache infoCache = reader.getRecentInfoCache();
List<T> missing = null;
for (T obj : objects) {
List<ObjectInfo> info = infoCache.get(obj);
if (info != null) {
onResult(obj, info);
if (progress != null)
progress.update(1);
} else {
if (missing == null) {
if (objects instanceof List<?>)
missing = new ArrayList<T>(((List<?>) objects).size());
else
missing = new ArrayList<T>();
}
missing.add(obj);
}
}
if (missing != null)
return missing;
return Collections.emptyList();
}

private void selectInBatches(Context options, Iterable<T> objects)
throws DhtException {
final int batchSize = reader.getOptions()
.getObjectIndexBatchSize();

Map<ObjectIndexKey, T> batch = new HashMap<ObjectIndexKey, T>();
Iterator<T> otpItr = objects.iterator();
while (otpItr.hasNext()) {
T otp = otpItr.next();

batch.put(ObjectIndexKey.create(repo, otp), otp);

if (batch.size() < batchSize && otpItr.hasNext())
continue;

if (error.get() != null)
break;

try {
if (progress != null) {
while (!batches.tryAcquire(500, MILLISECONDS))
progress.pollForUpdates();
progress.pollForUpdates();
} else {
batches.acquire();
}
} catch (InterruptedException err) {
error.compareAndSet(null, new DhtTimeoutException(err));
break;
}

startQuery(options, batch);
batch = new HashMap<ObjectIndexKey, T>();
}

try {
if (progress != null) {
while (!batches.tryAcquire(concurrentBatches, 500, MILLISECONDS))
progress.pollForUpdates();
progress.pollForUpdates();
} else {
batches.acquire(concurrentBatches);
}
} catch (InterruptedException err) {
error.compareAndSet(null, new DhtTimeoutException(err));
}

if (error.get() != null)
throw error.get();

// Make sure retry changes are visible to us.
resultLock.lock();
resultLock.unlock();
}

private void startQuery(final Context context,
final Map<ObjectIndexKey, T> batch) {
final AsyncCallback<Map<ObjectIndexKey, Collection<ObjectInfo>>> cb;

cb = new AsyncCallback<Map<ObjectIndexKey, Collection<ObjectInfo>>>() {
public void onSuccess(Map<ObjectIndexKey, Collection<ObjectInfo>> r) {
resultLock.lock();
try {
processResults(context, batch, r);
} finally {
resultLock.unlock();
batches.release();
}
}

public void onFailure(DhtException e) {
error.compareAndSet(null, e);
batches.release();
}
};
db.objectIndex().get(context, batch.keySet(), cb);
}

private void processResults(Context context, Map<ObjectIndexKey, T> batch,
Map<ObjectIndexKey, Collection<ObjectInfo>> objects) {
for (T obj : batch.values()) {
Collection<ObjectInfo> matches = objects.get(obj);

if (matches == null || matches.isEmpty()) {
if (retryMissingObjects && context == Context.FAST_MISSING_OK)
retry.add(obj);
continue;
}

tmp.clear();
tmp.addAll(matches);
ObjectInfo.sort(tmp);
if (cacheLoadedInfo)
reader.getRecentInfoCache().put(obj, tmp);

onResult(obj, tmp);
}

if (progress != null)
progress.update(objects.size());
}

protected abstract void onResult(T obj, List<ObjectInfo> info);
}

+ 0
- 153
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/CachedPackKey.java View File

@@ -1,153 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.eclipse.jgit.util.RawParseUtils.decode;

import java.text.MessageFormat;

import org.eclipse.jgit.generated.storage.dht.proto.GitStore.CachedPackInfo;
import org.eclipse.jgit.lib.ObjectId;

/** Unique identifier of a {@link CachedPackInfo} in the DHT. */
public final class CachedPackKey implements RowKey {
static final int KEYLEN = 81;

/**
* @param key
* @return the key
*/
public static CachedPackKey fromBytes(byte[] key) {
return fromBytes(key, 0, key.length);
}

/**
* @param key
* @param ptr
* @param len
* @return the key
*/
public static CachedPackKey fromBytes(byte[] key, int ptr, int len) {
if (len != KEYLEN)
throw new IllegalArgumentException(MessageFormat.format(
DhtText.get().invalidChunkKey, decode(key, ptr, ptr + len)));

ObjectId name = ObjectId.fromString(key, ptr);
ObjectId vers = ObjectId.fromString(key, ptr + 41);
return new CachedPackKey(name, vers);
}

/**
* @param key
* @return the key
*/
public static CachedPackKey fromString(String key) {
int d = key.indexOf('.');
ObjectId name = ObjectId.fromString(key.substring(0, d));
ObjectId vers = ObjectId.fromString(key.substring(d + 1));
return new CachedPackKey(name, vers);
}

/**
* @param info
* @return the key
*/
public static CachedPackKey fromInfo(CachedPackInfo info) {
ObjectId name = ObjectId.fromString(info.getName());
ObjectId vers = ObjectId.fromString(info.getVersion());
return new CachedPackKey(name, vers);
}

private final ObjectId name;

private final ObjectId version;

CachedPackKey(ObjectId name, ObjectId version) {
this.name = name;
this.version = version;
}

/** @return unique SHA-1 name of the pack. */
public ObjectId getName() {
return name;
}

/** @return unique version of the pack. */
public ObjectId getVersion() {
return version;
}

public byte[] asBytes() {
byte[] r = new byte[KEYLEN];
name.copyTo(r, 0);
r[40] = '.';
version.copyTo(r, 41);
return r;
}

public String asString() {
return name.name() + "." + version.name();
}

@Override
public int hashCode() {
return name.hashCode();
}

@Override
public boolean equals(Object other) {
if (this == other)
return true;
if (other instanceof CachedPackKey) {
CachedPackKey key = (CachedPackKey) other;
return name.equals(key.name) && version.equals(key.version);
}
return false;
}

@Override
public String toString() {
return "cached-pack:" + asString();
}
}

+ 0
- 497
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkFormatter.java View File

@@ -1,497 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.Deflater;

import org.eclipse.jgit.generated.storage.dht.proto.GitStore;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta.BaseChunk;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ObjectInfo.ObjectType;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.storage.dht.spi.Database;
import org.eclipse.jgit.storage.dht.spi.WriteBuffer;
import org.eclipse.jgit.transport.PackedObjectInfo;
import org.eclipse.jgit.util.NB;

/**
* Formats one {@link PackChunk} for storage in the DHT.
* <p>
* Each formatter instance can be used only once.
*/
class ChunkFormatter {
static final int TRAILER_SIZE = 4;

private final RepositoryKey repo;

private final DhtInserterOptions options;

private final byte[] varIntBuf;

private final int maxObjects;

private Map<ChunkKey, BaseChunkInfo> baseChunks;

private List<StoredObject> objectList;

private byte[] chunkData;

private int ptr;

private int mark;

private int currentObjectType;

private BaseChunkInfo currentObjectBase;

private PackChunk.Members builder;

private GitStore.ChunkInfo.Source source;

private boolean fragment;

private int objectType;

private int objectsTotal, objectsWhole, objectsRefDelta, objectsOfsDelta;

private ChunkInfo chunkInfo;

ChunkFormatter(RepositoryKey repo, DhtInserterOptions options) {
this.repo = repo;
this.options = options;
this.varIntBuf = new byte[32];
this.chunkData = new byte[options.getChunkSize()];
this.maxObjects = options.getMaxObjectCount();
this.objectType = -1;
}

void setSource(GitStore.ChunkInfo.Source src) {
source = src;
}

void setObjectType(int type) {
objectType = type;
}

void setFragment() {
fragment = true;
}

ChunkKey getChunkKey() {
return getChunkInfo().getChunkKey();
}

ChunkInfo getChunkInfo() {
return chunkInfo;
}

ChunkMeta getChunkMeta() {
return builder.getMeta();
}

PackChunk getPackChunk() throws DhtException {
return builder.build();
}

void setChunkIndex(List<PackedObjectInfo> objs) {
builder.setChunkIndex(ChunkIndex.create(objs));
}

ChunkKey end(MessageDigest md) {
if (md == null)
md = Constants.newMessageDigest();

// Embed a small amount of randomness into the chunk content,
// and thus impact its name. This prevents malicious clients from
// being able to predict what a chunk is called, which keeps them
// from replacing an existing chunk.
//
chunkData = cloneArray(chunkData, ptr + TRAILER_SIZE);
NB.encodeInt32(chunkData, ptr, options.nextChunkSalt());
ptr += 4;

md.update(chunkData, 0, ptr);
ChunkKey key = ChunkKey.create(repo, ObjectId.fromRaw(md.digest()));

GitStore.ChunkInfo.Builder info = GitStore.ChunkInfo.newBuilder();
info.setSource(source);
info.setObjectType(GitStore.ChunkInfo.ObjectType.valueOf(objectType));
if (fragment)
info.setIsFragment(true);
info.setChunkSize(chunkData.length);

GitStore.ChunkInfo.ObjectCounts.Builder cnts = info.getObjectCountsBuilder();
cnts.setTotal(objectsTotal);
if (objectsWhole > 0)
cnts.setWhole(objectsWhole);
if (objectsRefDelta > 0)
cnts.setRefDelta(objectsRefDelta);
if (objectsOfsDelta > 0)
cnts.setOfsDelta(objectsOfsDelta);

builder = new PackChunk.Members();
builder.setChunkKey(key);
builder.setChunkData(chunkData);

if (baseChunks != null) {
List<BaseChunk> list = new ArrayList<BaseChunk>(baseChunks.size());
for (BaseChunkInfo b : baseChunks.values()) {
if (0 < b.useCount) {
BaseChunk.Builder c = BaseChunk.newBuilder();
c.setRelativeStart(b.relativeStart);
c.setChunkKey(b.key.asString());
list.add(c.build());
}
}
Collections.sort(list, new Comparator<BaseChunk>() {
public int compare(BaseChunk a, BaseChunk b) {
return Long.signum(a.getRelativeStart()
- b.getRelativeStart());
}
});
ChunkMeta.Builder b = ChunkMeta.newBuilder();
b.addAllBaseChunk(list);
ChunkMeta meta = b.build();
builder.setMeta(meta);
info.setMetaSize(meta.getSerializedSize());
}

if (objectList != null && !objectList.isEmpty()) {
byte[] index = ChunkIndex.create(objectList);
builder.setChunkIndex(index);
info.setIndexSize(index.length);
}

chunkInfo = new ChunkInfo(key, info.build());
return getChunkKey();
}

/**
* Safely put the chunk to the database.
* <p>
* This method is slow. It first puts the chunk info, waits for success,
* then puts the chunk itself, waits for success, and finally queues up the
* object index with its chunk links in the supplied buffer.
*
* @param db
* @param dbWriteBuffer
* @throws DhtException
*/
void safePut(Database db, WriteBuffer dbWriteBuffer) throws DhtException {
WriteBuffer chunkBuf = db.newWriteBuffer();

db.repository().put(repo, getChunkInfo(), chunkBuf);
chunkBuf.flush();

db.chunk().put(builder, chunkBuf);
chunkBuf.flush();

linkObjects(db, dbWriteBuffer);
}

void unsafePut(Database db, WriteBuffer dbWriteBuffer) throws DhtException {
db.repository().put(repo, getChunkInfo(), dbWriteBuffer);
db.chunk().put(builder, dbWriteBuffer);
linkObjects(db, dbWriteBuffer);
}

private void linkObjects(Database db, WriteBuffer dbWriteBuffer)
throws DhtException {
if (objectList != null && !objectList.isEmpty()) {
for (StoredObject obj : objectList) {
db.objectIndex().add(ObjectIndexKey.create(repo, obj),
obj.link(getChunkKey()), dbWriteBuffer);
}
}
}

boolean whole(Deflater def, int type, byte[] data, int off, final int size,
ObjectId objId) {
if (free() < 10 || maxObjects <= objectsTotal)
return false;

header(type, size);
objectsWhole++;
currentObjectType = type;

int endOfHeader = ptr;
def.setInput(data, off, size);
def.finish();
do {
int left = free();
if (left == 0) {
rollback();
return false;
}

int n = def.deflate(chunkData, ptr, left);
if (n == 0) {
rollback();
return false;
}

ptr += n;
} while (!def.finished());

if (objectList == null)
objectList = new ArrayList<StoredObject>();

final int packedSize = ptr - endOfHeader;
objectList.add(new StoredObject(objId, type, mark, packedSize, size));

if (objectType < 0)
objectType = type;
else if (objectType != type)
objectType = ChunkInfo.OBJ_MIXED;

return true;
}

boolean whole(int type, long inflatedSize) {
if (free() < 10 || maxObjects <= objectsTotal)
return false;

header(type, inflatedSize);
objectsWhole++;
currentObjectType = type;
return true;
}

boolean ofsDelta(long inflatedSize, long negativeOffset) {
final int ofsPtr = encodeVarInt(negativeOffset);
final int ofsLen = varIntBuf.length - ofsPtr;
if (free() < 10 + ofsLen || maxObjects <= objectsTotal)
return false;

header(Constants.OBJ_OFS_DELTA, inflatedSize);
objectsOfsDelta++;
currentObjectType = Constants.OBJ_OFS_DELTA;
currentObjectBase = null;

if (append(varIntBuf, ofsPtr, ofsLen))
return true;

rollback();
return false;
}

boolean refDelta(long inflatedSize, AnyObjectId baseId) {
if (free() < 30 || maxObjects <= objectsTotal)
return false;

header(Constants.OBJ_REF_DELTA, inflatedSize);
objectsRefDelta++;
currentObjectType = Constants.OBJ_REF_DELTA;

baseId.copyRawTo(chunkData, ptr);
ptr += 20;
return true;
}

void useBaseChunk(long relativeStart, ChunkKey baseChunkKey) {
if (baseChunks == null)
baseChunks = new HashMap<ChunkKey, BaseChunkInfo>();

BaseChunkInfo base = baseChunks.get(baseChunkKey);
if (base == null) {
base = new BaseChunkInfo(relativeStart, baseChunkKey);
baseChunks.put(baseChunkKey, base);
}
base.useCount++;
currentObjectBase = base;
}

void appendDeflateOutput(Deflater def) {
while (!def.finished()) {
int left = free();
if (left == 0)
return;
int n = def.deflate(chunkData, ptr, left);
if (n == 0)
return;
ptr += n;
}
}

boolean append(byte[] data, int off, int len) {
if (free() < len)
return false;

System.arraycopy(data, off, chunkData, ptr, len);
ptr += len;
return true;
}

boolean isEmpty() {
return ptr == 0;
}

int getObjectCount() {
return objectsTotal;
}

int position() {
return ptr;
}

int size() {
return ptr;
}

int free() {
return (chunkData.length - TRAILER_SIZE) - ptr;
}

byte[] getRawChunkDataArray() {
return chunkData;
}

int getCurrentObjectType() {
return currentObjectType;
}

void rollback() {
ptr = mark;
adjustObjectCount(-1, currentObjectType);
}

void adjustObjectCount(int delta, int type) {
objectsTotal += delta;

switch (type) {
case Constants.OBJ_COMMIT:
case Constants.OBJ_TREE:
case Constants.OBJ_BLOB:
case Constants.OBJ_TAG:
objectsWhole += delta;
break;

case Constants.OBJ_OFS_DELTA:
objectsOfsDelta += delta;
if (currentObjectBase != null && --currentObjectBase.useCount == 0)
baseChunks.remove(currentObjectBase.key);
currentObjectBase = null;
break;

case Constants.OBJ_REF_DELTA:
objectsRefDelta += delta;
break;
}
}

private void header(int type, long inflatedSize) {
mark = ptr;
objectsTotal++;

long nextLength = inflatedSize >>> 4;
chunkData[ptr++] = (byte) ((nextLength > 0 ? 0x80 : 0x00) | (type << 4) | (inflatedSize & 0x0F));
inflatedSize = nextLength;
while (inflatedSize > 0) {
nextLength >>>= 7;
chunkData[ptr++] = (byte) ((nextLength > 0 ? 0x80 : 0x00) | (inflatedSize & 0x7F));
inflatedSize = nextLength;
}
}

private int encodeVarInt(long value) {
int n = varIntBuf.length - 1;
varIntBuf[n] = (byte) (value & 0x7F);
while ((value >>= 7) > 0)
varIntBuf[--n] = (byte) (0x80 | (--value & 0x7F));
return n;
}

private static byte[] cloneArray(byte[] src, int len) {
byte[] dst = new byte[len];
System.arraycopy(src, 0, dst, 0, len);
return dst;
}

private static class BaseChunkInfo {
final long relativeStart;

final ChunkKey key;

int useCount;

BaseChunkInfo(long relativeStart, ChunkKey key) {
this.relativeStart = relativeStart;
this.key = key;
}
}

private static class StoredObject extends PackedObjectInfo {
private final int type;

private final int packed;

private final int inflated;

StoredObject(AnyObjectId id, int type, int offset, int packed, int size) {
super(id);
setOffset(offset);
this.type = type;
this.packed = packed;
this.inflated = size;
}

ObjectInfo link(ChunkKey key) {
GitStore.ObjectInfo.Builder b = GitStore.ObjectInfo.newBuilder();
b.setObjectType(ObjectType.valueOf(type));
b.setOffset((int) getOffset());
b.setPackedSize(packed);
b.setInflatedSize(inflated);
return new ObjectInfo(key, b.build());
}
}
}

+ 0
- 428
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkIndex.java View File

@@ -1,428 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.text.MessageFormat;
import java.util.Collections;
import java.util.List;

import org.eclipse.jgit.lib.AnyObjectId;
import static org.eclipse.jgit.lib.Constants.*;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.transport.PackedObjectInfo;
import org.eclipse.jgit.util.NB;

/** Index into a {@link PackChunk}. */
public abstract class ChunkIndex {
private static final int V1 = 0x01;

static ChunkIndex fromBytes(ChunkKey key, byte[] index, int ptr, int len)
throws DhtException {
int v = index[ptr] & 0xff;
switch (v) {
case V1: {
final int offsetFormat = index[ptr + 1] & 7;
switch (offsetFormat) {
case 1:
return new Offset1(index, ptr, len, key);
case 2:
return new Offset2(index, ptr, len, key);
case 3:
return new Offset3(index, ptr, len, key);
case 4:
return new Offset4(index, ptr, len, key);
default:
throw new DhtException(MessageFormat.format(
DhtText.get().unsupportedChunkIndex,
Integer.toHexString(NB.decodeUInt16(index, ptr)), key));
}
}
default:
throw new DhtException(MessageFormat.format(
DhtText.get().unsupportedChunkIndex,
Integer.toHexString(v), key));
}
}

/**
* Format the chunk index and return its binary representation.
*
* @param list
* the list of objects that appear in the chunk. This list will
* be sorted in-place if it has more than 1 element.
* @return binary representation of the chunk's objects and their starting
* offsets. The format is private to this class.
*/
@SuppressWarnings("null")
static byte[] create(List<? extends PackedObjectInfo> list) {
int cnt = list.size();
sortObjectList(list);

int fanoutFormat = 0;
int[] buckets = null;
if (64 < cnt) {
buckets = new int[256];
for (PackedObjectInfo oe : list)
buckets[oe.getFirstByte()]++;
fanoutFormat = selectFanoutFormat(buckets);
}

int offsetFormat = selectOffsetFormat(list);
byte[] index = new byte[2 // header
+ 256 * fanoutFormat // (optional) fanout
+ cnt * OBJECT_ID_LENGTH // ids
+ cnt * offsetFormat // offsets
];
index[0] = V1;
index[1] = (byte) ((fanoutFormat << 3) | offsetFormat);

int ptr = 2;

switch (fanoutFormat) {
case 0:
break;
case 1:
for (int i = 0; i < 256; i++, ptr++)
index[ptr] = (byte) buckets[i];
break;
case 2:
for (int i = 0; i < 256; i++, ptr += 2)
NB.encodeInt16(index, ptr, buckets[i]);
break;
case 3:
for (int i = 0; i < 256; i++, ptr += 3)
encodeUInt24(index, ptr, buckets[i]);
break;
case 4:
for (int i = 0; i < 256; i++, ptr += 4)
NB.encodeInt32(index, ptr, buckets[i]);
break;
}

for (PackedObjectInfo oe : list) {
oe.copyRawTo(index, ptr);
ptr += OBJECT_ID_LENGTH;
}

switch (offsetFormat) {
case 1:
for (PackedObjectInfo oe : list)
index[ptr++] = (byte) oe.getOffset();
break;

case 2:
for (PackedObjectInfo oe : list) {
NB.encodeInt16(index, ptr, (int) oe.getOffset());
ptr += 2;
}
break;

case 3:
for (PackedObjectInfo oe : list) {
encodeUInt24(index, ptr, (int) oe.getOffset());
ptr += 3;
}
break;

case 4:
for (PackedObjectInfo oe : list) {
NB.encodeInt32(index, ptr, (int) oe.getOffset());
ptr += 4;
}
break;
}

return index;
}

private static int selectFanoutFormat(int[] buckets) {
int fmt = 1;
int max = 1 << (8 * fmt);

for (int cnt : buckets) {
while (max <= cnt && fmt < 4) {
if (++fmt == 4)
return fmt;
max = 1 << (8 * fmt);
}
}
return fmt;
}

private static int selectOffsetFormat(List<? extends PackedObjectInfo> list) {
int fmt = 1;
int max = 1 << (8 * fmt);

for (PackedObjectInfo oe : list) {
while (max <= oe.getOffset() && fmt < 4) {
if (++fmt == 4)
return fmt;
max = 1 << (8 * fmt);
}
}
return fmt;
}

private static void sortObjectList(List<? extends PackedObjectInfo> list) {
Collections.sort(list);
}

private final byte[] indexBuf;

private final int indexPtr;

private final int indexLen;

private final int[] fanout;

private final int idTable;

private final int offsetTable;

private final int count;

ChunkIndex(byte[] indexBuf, int ptr, int len, ChunkKey key)
throws DhtException {
final int ctl = indexBuf[ptr + 1];
final int fanoutFormat = (ctl >>> 3) & 7;
final int offsetFormat = ctl & 7;

switch (fanoutFormat) {
case 0:
fanout = null; // no fanout, too small
break;

case 1: {
int last = 0;
fanout = new int[256];
for (int i = 0; i < 256; i++) {
last += indexBuf[ptr + 2 + i] & 0xff;
fanout[i] = last;
}
break;
}
case 2: {
int last = 0;
fanout = new int[256];
for (int i = 0; i < 256; i++) {
last += NB.decodeUInt16(indexBuf, ptr + 2 + i * 2);
fanout[i] = last;
}
break;
}
case 3: {
int last = 0;
fanout = new int[256];
for (int i = 0; i < 256; i++) {
last += decodeUInt24(indexBuf, ptr + 2 + i * 3);
fanout[i] = last;
}
break;
}
case 4: {
int last = 0;
fanout = new int[256];
for (int i = 0; i < 256; i++) {
last += NB.decodeInt32(indexBuf, ptr + 2 + i * 4);
fanout[i] = last;
}
break;
}
default:
throw new DhtException(MessageFormat.format(
DhtText.get().unsupportedChunkIndex,
Integer.toHexString(NB.decodeUInt16(indexBuf, ptr)), key));
}

this.indexBuf = indexBuf;
this.indexPtr = ptr;
this.indexLen = len;
this.idTable = indexPtr + 2 + 256 * fanoutFormat;

int recsz = OBJECT_ID_LENGTH + offsetFormat;
this.count = (indexLen - (idTable - indexPtr)) / recsz;
this.offsetTable = idTable + count * OBJECT_ID_LENGTH;
}

/**
* Get the total number of objects described by this index.
*
* @return number of objects in this index and its associated chunk.
*/
public final int getObjectCount() {
return count;
}

/**
* Get an ObjectId from this index.
*
* @param nth
* the object to return. Must be in range [0, getObjectCount).
* @return the object id.
*/
public final ObjectId getObjectId(int nth) {
return ObjectId.fromRaw(indexBuf, idPosition(nth));
}

/**
* Get the offset of an object in the chunk.
*
* @param nth
* offset to return. Must be in range [0, getObjectCount).
* @return the offset.
*/
public final int getOffset(int nth) {
return getOffset(indexBuf, offsetTable, nth);
}

/** @return the size of this index, in bytes. */
int getIndexSize() {
int sz = indexBuf.length;
if (fanout != null)
sz += 12 + 256 * 4;
return sz;
}

/**
* Search for an object in the index.
*
* @param objId
* the object to locate.
* @return offset of the object in the corresponding chunk; -1 if not found.
*/
final int findOffset(AnyObjectId objId) {
int hi, lo;

if (fanout != null) {
int fb = objId.getFirstByte();
lo = fb == 0 ? 0 : fanout[fb - 1];
hi = fanout[fb];
} else {
lo = 0;
hi = count;
}

while (lo < hi) {
final int mid = (lo + hi) >>> 1;
final int cmp = objId.compareTo(indexBuf, idPosition(mid));
if (cmp < 0)
hi = mid;
else if (cmp == 0)
return getOffset(mid);
else
lo = mid + 1;
}
return -1;
}

abstract int getOffset(byte[] indexArray, int offsetTableStart, int nth);

private int idPosition(int nth) {
return idTable + (nth * OBJECT_ID_LENGTH);
}

private static class Offset1 extends ChunkIndex {
Offset1(byte[] index, int ptr, int len, ChunkKey key)
throws DhtException {
super(index, ptr, len, key);
}

int getOffset(byte[] index, int offsetTable, int nth) {
return index[offsetTable + nth] & 0xff;
}
}

private static class Offset2 extends ChunkIndex {
Offset2(byte[] index, int ptr, int len, ChunkKey key)
throws DhtException {
super(index, ptr, len, key);
}

int getOffset(byte[] index, int offsetTable, int nth) {
return NB.decodeUInt16(index, offsetTable + (nth * 2));
}
}

private static class Offset3 extends ChunkIndex {
Offset3(byte[] index, int ptr, int len, ChunkKey key)
throws DhtException {
super(index, ptr, len, key);
}

int getOffset(byte[] index, int offsetTable, int nth) {
return decodeUInt24(index, offsetTable + (nth * 3));
}
}

private static class Offset4 extends ChunkIndex {
Offset4(byte[] index, int ptr, int len, ChunkKey key)
throws DhtException {
super(index, ptr, len, key);
}

int getOffset(byte[] index, int offsetTable, int nth) {
return NB.decodeInt32(index, offsetTable + (nth * 4));
}
}

private static void encodeUInt24(byte[] intbuf, int offset, int v) {
intbuf[offset + 2] = (byte) v;
v >>>= 8;

intbuf[offset + 1] = (byte) v;
v >>>= 8;

intbuf[offset] = (byte) v;
}

private static int decodeUInt24(byte[] intbuf, int offset) {
int r = (intbuf[offset] & 0xff) << 8;

r |= intbuf[offset + 1] & 0xff;
r <<= 8;

r |= intbuf[offset + 2] & 0xff;
return r;
}
}

+ 0
- 96
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkInfo.java View File

@@ -1,96 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import org.eclipse.jgit.generated.storage.dht.proto.GitStore;

/**
* Summary information about a chunk owned by a repository.
*/
public class ChunkInfo {
/** Mixed objects are stored in the chunk (instead of single type). */
public static final int OBJ_MIXED = 0;

private final ChunkKey chunkKey;

private final GitStore.ChunkInfo data;

/**
* Wrap a ChunkInfo message.
*
* @param key
* associated chunk key.
* @param data
* data.
*/
public ChunkInfo(ChunkKey key, GitStore.ChunkInfo data) {
this.chunkKey = key;
this.data = data;
}

/** @return the repository that contains the chunk. */
public RepositoryKey getRepositoryKey() {
return chunkKey.getRepositoryKey();
}

/** @return the chunk this information describes. */
public ChunkKey getChunkKey() {
return chunkKey;
}

/** @return the underlying message containing all data. */
public GitStore.ChunkInfo getData() {
return data;
}

@Override
public String toString() {
StringBuilder b = new StringBuilder();
b.append("ChunkInfo:");
b.append(chunkKey);
b.append("\n");
b.append(data);
return b.toString();
}
}

+ 0
- 160
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkKey.java View File

@@ -1,160 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.eclipse.jgit.storage.dht.KeyUtils.format32;
import static org.eclipse.jgit.storage.dht.KeyUtils.parse32;
import static org.eclipse.jgit.util.RawParseUtils.decode;

import java.io.Serializable;
import java.text.MessageFormat;

import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;

/** Unique identifier of a {@link PackChunk} in the DHT. */
public final class ChunkKey implements RowKey, Serializable {
private static final long serialVersionUID = 1L;

static final int KEYLEN = 49;

/**
* @param repo
* @param chunk
* @return the key
*/
public static ChunkKey create(RepositoryKey repo, ObjectId chunk) {
return new ChunkKey(repo.asInt(), chunk);
}

/**
* @param key
* @return the key
*/
public static ChunkKey fromBytes(byte[] key) {
return fromBytes(key, 0, key.length);
}

/**
* @param key
* @param ptr
* @param len
* @return the key
*/
public static ChunkKey fromBytes(byte[] key, int ptr, int len) {
if (len != KEYLEN)
throw new IllegalArgumentException(MessageFormat.format(
DhtText.get().invalidChunkKey, decode(key, ptr, ptr + len)));

int repo = parse32(key, ptr);
ObjectId chunk = ObjectId.fromString(key, ptr + 9);
return new ChunkKey(repo, chunk);
}

/**
* @param key
* @return the key
*/
public static ChunkKey fromString(String key) {
return fromBytes(Constants.encodeASCII(key));
}

private final int repo;

private final ObjectId chunk;

ChunkKey(int repo, ObjectId chunk) {
this.repo = repo;
this.chunk = chunk;
}

/** @return the repository that contains the chunk. */
public RepositoryKey getRepositoryKey() {
return RepositoryKey.fromInt(repo);
}

int getRepositoryId() {
return repo;
}

/** @return unique SHA-1 describing the chunk. */
public ObjectId getChunkHash() {
return chunk;
}

public byte[] asBytes() {
byte[] r = new byte[KEYLEN];
format32(r, 0, repo);
r[8] = '.';
chunk.copyTo(r, 9);
return r;
}

public String asString() {
return decode(asBytes());
}

@Override
public int hashCode() {
return chunk.hashCode();
}

@Override
public boolean equals(Object other) {
if (this == other)
return true;
if (other instanceof ChunkKey) {
ChunkKey thisChunk = this;
ChunkKey otherChunk = (ChunkKey) other;
return thisChunk.repo == otherChunk.repo
&& thisChunk.chunk.equals(otherChunk.chunk);
}
return false;
}

@Override
public String toString() {
return "chunk:" + asString();
}
}

+ 0
- 111
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ChunkMetaUtil.java View File

@@ -1,111 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.text.MessageFormat;
import java.util.List;

import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta.BaseChunk;

class ChunkMetaUtil {
static BaseChunk getBaseChunk(ChunkKey chunkKey, ChunkMeta meta,
long position) throws DhtException {
// Chunks are sorted by ascending relative_start order.
// Thus for a pack sequence of: A B C, we have:
//
// -- C relative_start = 10,000
// -- B relative_start = 20,000
// -- A relative_start = 30,000
//
// Indicating that chunk C starts 10,000 bytes before us,
// chunk B starts 20,000 bytes before us (and 10,000 before C),
// chunk A starts 30,000 bytes before us (and 10,000 before B),
//
// If position falls within:
//
// -- C (10k), then position is between 0..10,000
// -- B (20k), then position is between 10,000 .. 20,000
// -- A (30k), then position is between 20,000 .. 30,000

List<BaseChunk> baseChunks = meta.getBaseChunkList();
int high = baseChunks.size();
int low = 0;
while (low < high) {
final int mid = (low + high) >>> 1;
final BaseChunk base = baseChunks.get(mid);

if (position > base.getRelativeStart()) {
low = mid + 1;

} else if (mid == 0 || position == base.getRelativeStart()) {
return base;

} else if (baseChunks.get(mid - 1).getRelativeStart() < position) {
return base;

} else {
high = mid;
}
}

throw new DhtException(MessageFormat.format(
DhtText.get().missingLongOffsetBase, chunkKey,
Long.valueOf(position)));
}

static ChunkKey getNextFragment(ChunkMeta meta, ChunkKey chunkKey) {
int cnt = meta.getFragmentCount();
for (int i = 0; i < cnt - 1; i++) {
ChunkKey key = ChunkKey.fromString(meta.getFragment(i));
if (chunkKey.equals(key))
return ChunkKey.fromString(meta.getFragment(i + 1));
}
return null;
}

private ChunkMetaUtil() {
// Static utilities only, do not create instances.
}
}

+ 0
- 196
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DeltaBaseCache.java View File

@@ -1,196 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.lang.ref.SoftReference;

/**
* Caches recently used objects for {@link DhtReader}.
* <p>
* This cache is not thread-safe. Each reader should have its own cache.
*/
final class DeltaBaseCache {
private final DhtReader.Statistics stats;

private int maxByteCount;

private final Slot[] table;

private Slot lruHead;

private Slot lruTail;

private int curByteCount;

DeltaBaseCache(DhtReader reader) {
stats = reader.getStatistics();

DhtReaderOptions options = reader.getOptions();
maxByteCount = options.getDeltaBaseCacheLimit();
table = new Slot[options.getDeltaBaseCacheSize()];
}

Entry get(ChunkKey key, int position) {
Slot e = table[hash(key, position)];
for (; e != null; e = e.tableNext) {
if (e.offset == position && key.equals(e.chunkKey)) {
Entry buf = e.data.get();
if (buf != null) {
moveToHead(e);
stats.deltaBaseCache_Hits++;
return buf;
}
}
}
stats.deltaBaseCache_Miss++;
return null;
}

void put(ChunkKey key, int offset, int objectType, byte[] data) {
if (data.length > maxByteCount)
return; // Too large to cache.

curByteCount += data.length;
releaseMemory();

int tableIdx = hash(key, offset);
Slot e = new Slot(key, offset, data.length);
e.data = new SoftReference<Entry>(new Entry(data, objectType));
e.tableNext = table[tableIdx];
table[tableIdx] = e;
moveToHead(e);
}

private void releaseMemory() {
while (curByteCount > maxByteCount && lruTail != null) {
Slot currOldest = lruTail;
Slot nextOldest = currOldest.lruPrev;

curByteCount -= currOldest.size;
unlink(currOldest);
removeFromTable(currOldest);

if (nextOldest == null)
lruHead = null;
else
nextOldest.lruNext = null;
lruTail = nextOldest;
}
}

private void removeFromTable(Slot e) {
int tableIdx = hash(e.chunkKey, e.offset);
Slot p = table[tableIdx];

if (p == e) {
table[tableIdx] = e.tableNext;
return;
}

for (; p != null; p = p.tableNext) {
if (p.tableNext == e) {
p.tableNext = e.tableNext;
return;
}
}
}

private void moveToHead(final Slot e) {
unlink(e);
e.lruPrev = null;
e.lruNext = lruHead;
if (lruHead != null)
lruHead.lruPrev = e;
else
lruTail = e;
lruHead = e;
}

private void unlink(final Slot e) {
Slot prev = e.lruPrev;
Slot next = e.lruNext;

if (prev != null)
prev.lruNext = next;
if (next != null)
next.lruPrev = prev;
}

private int hash(ChunkKey key, int position) {
return (((key.hashCode() & 0xfffff000) + position) >>> 1) % table.length;
}

static class Entry {
final byte[] data;

final int type;

Entry(final byte[] aData, final int aType) {
data = aData;
type = aType;
}
}

private static class Slot {
final ChunkKey chunkKey;

final int offset;

final int size;

Slot tableNext;

Slot lruPrev;

Slot lruNext;

SoftReference<Entry> data;

Slot(ChunkKey key, int offset, int size) {
this.chunkKey = key;
this.offset = offset;
this.size = size;
}
}
}

+ 0
- 192
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtCachedPack.java View File

@@ -1,192 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.IOException;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.jgit.generated.storage.dht.proto.GitStore.CachedPackInfo;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.CachedPackInfo.ChunkList;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.storage.pack.CachedPack;
import org.eclipse.jgit.storage.pack.ObjectToPack;
import org.eclipse.jgit.storage.pack.PackOutputStream;
import org.eclipse.jgit.storage.pack.StoredObjectRepresentation;

/** A cached pack stored by the DHT. */
public class DhtCachedPack extends CachedPack {
private final CachedPackInfo info;

private Set<ObjectId> tips;

private Set<ChunkKey> keySet;

private ChunkKey[] keyList;

DhtCachedPack(CachedPackInfo info) {
this.info = info;
}

@Override
public Set<ObjectId> getTips() {
if (tips == null) {
tips = new HashSet<ObjectId>();
for (String idString : info.getTipList().getObjectNameList())
tips.add(ObjectId.fromString(idString));
tips = Collections.unmodifiableSet(tips);
}
return tips;
}

@Override
public long getObjectCount() {
return info.getObjectsTotal();
}

@Override
public long getDeltaCount() throws IOException {
return info.getObjectsDelta();
}

/** @return information describing this cached pack. */
public CachedPackInfo getCachedPackInfo() {
return info;
}

@Override
public boolean hasObject(ObjectToPack obj, StoredObjectRepresentation rep) {
DhtObjectRepresentation objrep = (DhtObjectRepresentation) rep;
if (keySet == null)
init();
return keySet.contains(objrep.getChunkKey());
}

private void init() {
ChunkList chunkList = info.getChunkList();
int cnt = chunkList.getChunkKeyCount();
keySet = new HashSet<ChunkKey>();
keyList = new ChunkKey[cnt];
for (int i = 0; i < cnt; i++) {
ChunkKey key = ChunkKey.fromString(chunkList.getChunkKey(i));
keySet.add(key);
keyList[i] = key;
}
}

void copyAsIs(PackOutputStream out, boolean validate, DhtReader ctx)
throws IOException {
if (keyList == null)
init();

// Clear the recent chunks because all of the reader's
// chunk limit should be made available for prefetch.
int cacheLimit = ctx.getOptions().getChunkLimit();
ctx.getRecentChunks().setMaxBytes(0);
try {
Prefetcher p = new Prefetcher(ctx, 0, cacheLimit);
p.push(Arrays.asList(keyList));
copyPack(out, p, validate);
} finally {
ctx.getRecentChunks().setMaxBytes(cacheLimit);
}
}

private void copyPack(PackOutputStream out, Prefetcher prefetcher,
boolean validate) throws DhtException, DhtMissingChunkException,
IOException {
Map<String, Long> startsAt = new HashMap<String, Long>();
for (ChunkKey key : keyList) {
PackChunk chunk = prefetcher.get(key);

// The prefetcher should always produce the chunk for us, if not
// there is something seriously wrong with the ordering or
// within the prefetcher code and aborting is more sane than
// using slow synchronous lookups.
//
if (chunk == null)
throw new DhtMissingChunkException(key);

// Verify each long OFS_DELTA chunk appears at the right offset.
// This is a cheap validation that the cached pack hasn't been
// incorrectly created and would confuse the client.
//
long position = out.length();
ChunkMeta meta = chunk.getMeta();
if (meta != null && meta.getBaseChunkCount() != 0) {
for (ChunkMeta.BaseChunk base : meta.getBaseChunkList()) {
Long act = startsAt.get(base.getChunkKey());
long exp = position - base.getRelativeStart();

if (act == null) {
throw new DhtException(MessageFormat.format(DhtText
.get().wrongChunkPositionInCachedPack,
rowKey(), base.getChunkKey(),
"[not written]", key, Long.valueOf(exp)));
}

if (act.longValue() != exp) {
throw new DhtException(MessageFormat.format(DhtText
.get().wrongChunkPositionInCachedPack,
rowKey(), base.getChunkKey(),
act, key, Long.valueOf(exp)));
}
}
}

startsAt.put(key.asString(), Long.valueOf(position));
chunk.copyEntireChunkAsIs(out, null, validate);
}
}

private String rowKey() {
return info.getName() + "." + info.getVersion();
}
}

+ 0
- 61
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtConfig.java View File

@@ -1,61 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.IOException;

import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.StoredConfig;

final class DhtConfig extends StoredConfig {
@Override
public void load() throws IOException, ConfigInvalidException {
clear();
}

@Override
public void save() throws IOException {
// TODO actually store this configuration.
}
}

+ 0
- 89
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtException.java View File

@@ -1,89 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.IOException;

import org.eclipse.jgit.storage.dht.spi.Database;

/** Any error caused by a {@link Database} operation. */
public class DhtException extends IOException {
private static final long serialVersionUID = 1L;

/**
* @param message
*/
public DhtException(String message) {
super(message);
}

/**
* @param cause
*/
public DhtException(Throwable cause) {
super(cause.getMessage());
initCause(cause);
}

/**
* @param message
* @param cause
*/
public DhtException(String message, Throwable cause) {
super(message);
initCause(cause);
}

/** TODO: Remove this type and all of its locations. */
public static class TODO extends RuntimeException {
private static final long serialVersionUID = 1L;

/**
* @param what
*/
public TODO(String what) {
super(what);
}
}
}

+ 0
- 321
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtInserter.java View File

@@ -1,321 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.ByteArrayInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.zip.Deflater;

import org.eclipse.jgit.generated.storage.dht.proto.GitStore;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ObjectInfo.ObjectType;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.storage.dht.spi.Database;
import org.eclipse.jgit.storage.dht.spi.WriteBuffer;
import org.eclipse.jgit.transport.PackParser;
import org.eclipse.jgit.transport.PackedObjectInfo;
import org.eclipse.jgit.util.IO;

class DhtInserter extends ObjectInserter {
private final DhtObjDatabase objdb;

private final RepositoryKey repo;

private final Database db;

private final DhtInserterOptions options;

private Deflater deflater;

private WriteBuffer dbWriteBuffer;

private ChunkFormatter activeChunk;

DhtInserter(DhtObjDatabase objdb) {
this.objdb = objdb;
this.repo = objdb.getRepository().getRepositoryKey();
this.db = objdb.getDatabase();
this.options = objdb.getInserterOptions();
}

@Override
public ObjectId insert(int type, long len, InputStream in)
throws IOException {
if (Integer.MAX_VALUE < len || mustFragmentSize() < len)
return insertStream(type, len, in);

byte[] tmp;
try {
tmp = new byte[(int) len];
} catch (OutOfMemoryError tooLarge) {
return insertStream(type, len, in);
}
IO.readFully(in, tmp, 0, tmp.length);
return insert(type, tmp, 0, tmp.length);
}

private ObjectId insertStream(final int type, final long inflatedSize,
final InputStream in) throws IOException {

// TODO Permit multiple chunks to be buffered here at once.
// It might be possible to compress and hold all chunks for
// an object, which would then allow them to write their
// ChunkInfo and chunks in parallel, as well as avoid the
// rewrite with the ChunkFragments at the end.

MessageDigest chunkDigest = Constants.newMessageDigest();
LinkedList<ChunkKey> fragmentList = new LinkedList<ChunkKey>();

ChunkFormatter chunk = newChunk();
int position = chunk.position();
if (!chunk.whole(type, inflatedSize))
throw new DhtException(DhtText.get().cannotInsertObject);

MessageDigest objDigest = digest();
objDigest.update(Constants.encodedTypeString(type));
objDigest.update((byte) ' ');
objDigest.update(Constants.encodeASCII(inflatedSize));
objDigest.update((byte) 0);

Deflater def = deflater();
byte[] inBuf = buffer();
long packedSize = 0;
long done = 0;
while (done < inflatedSize) {
if (done == 0 || def.needsInput()) {
int inAvail = in.read(inBuf);
if (inAvail <= 0)
throw new EOFException();
objDigest.update(inBuf, 0, inAvail);
def.setInput(inBuf, 0, inAvail);
done += inAvail;
}

if (chunk.free() == 0) {
packedSize += chunk.size();
chunk.setObjectType(type);
chunk.setFragment();
fragmentList.add(chunk.end(chunkDigest));
chunk.safePut(db, dbBuffer());
chunk = newChunk();
}
chunk.appendDeflateOutput(def);
}

def.finish();

while (!def.finished()) {
if (chunk.free() == 0) {
packedSize += chunk.size();
chunk.setObjectType(type);
chunk.setFragment();
fragmentList.add(chunk.end(chunkDigest));
chunk.safePut(db, dbBuffer());
chunk = newChunk();
}
chunk.appendDeflateOutput(def);
}

ObjectId objId = ObjectId.fromRaw(objDigest.digest());
PackedObjectInfo oe = new PackedObjectInfo(objId);
oe.setOffset(position);

if (!chunk.isEmpty()) {
packedSize += chunk.size();
chunk.setObjectType(type);

if (fragmentList.isEmpty()) {
ChunkKey key = chunk.end(chunkDigest);
chunk.setChunkIndex(Collections.singletonList(oe));
chunk.safePut(db, dbBuffer());

GitStore.ObjectInfo.Builder b = GitStore.ObjectInfo.newBuilder();
b.setObjectType(ObjectType.valueOf(type));
b.setOffset(position);
b.setPackedSize(packedSize);
b.setInflatedSize(inflatedSize);
ObjectInfo info = new ObjectInfo(key, b.build());
ObjectIndexKey objKey = ObjectIndexKey.create(repo, objId);
db.objectIndex().add(objKey, info, dbBuffer());
return objId;
}

chunk.setFragment();
fragmentList.add(chunk.end(chunkDigest));
chunk.safePut(db, dbBuffer());
}
chunk = null;

ChunkKey firstChunkKey = fragmentList.get(0);

ChunkMeta.Builder metaBuilder = ChunkMeta.newBuilder();
for (ChunkKey k : fragmentList)
metaBuilder.addFragment(k.asString());
ChunkMeta meta = metaBuilder.build();

for (ChunkKey key : fragmentList) {
PackChunk.Members builder = new PackChunk.Members();
builder.setChunkKey(key);
builder.setMeta(meta);

if (firstChunkKey.equals(key))
builder.setChunkIndex(ChunkIndex.create(Arrays.asList(oe)));

db.chunk().put(builder, dbBuffer());
}

GitStore.ObjectInfo.Builder b = GitStore.ObjectInfo.newBuilder();
b.setObjectType(ObjectType.valueOf(type));
b.setOffset(position);
b.setPackedSize(packedSize);
b.setInflatedSize(inflatedSize);
ObjectInfo info = new ObjectInfo(firstChunkKey, b.build());
ObjectIndexKey objKey = ObjectIndexKey.create(repo, objId);
db.objectIndex().add(objKey, info, dbBuffer());

return objId;
}

@Override
public ObjectId insert(int type, byte[] data, int off, int len)
throws IOException {
// TODO Is it important to avoid duplicate objects here?
// IIRC writing out a DirCache just blindly writes all of the
// tree objects to the inserter, relying on the inserter to
// strip out duplicates. We might need to buffer trees as
// long as possible, then collapse the buffer by looking up
// any existing objects and avoiding inserting those.

if (mustFragmentSize() < len)
return insertStream(type, len, asStream(data, off, len));

ObjectId objId = idFor(type, data, off, len);

if (activeChunk == null)
activeChunk = newChunk();

if (activeChunk.whole(deflater(), type, data, off, len, objId))
return objId;

// TODO Allow more than one chunk pending at a time, this would
// permit batching puts of the ChunkInfo records.

if (!activeChunk.isEmpty()) {
activeChunk.end(digest());
activeChunk.safePut(db, dbBuffer());
activeChunk = newChunk();
if (activeChunk.whole(deflater(), type, data, off, len, objId))
return objId;
}

return insertStream(type, len, asStream(data, off, len));
}

/** @return size that compressing still won't fit into a single chunk. */
private int mustFragmentSize() {
return 4 * options.getChunkSize();
}

@Override
public PackParser newPackParser(InputStream in) throws IOException {
return new DhtPackParser(objdb, in);
}

@Override
public void flush() throws IOException {
if (activeChunk != null && !activeChunk.isEmpty()) {
activeChunk.end(digest());
activeChunk.safePut(db, dbBuffer());
activeChunk = null;
}

if (dbWriteBuffer != null)
dbWriteBuffer.flush();
}

@Override
public void release() {
if (deflater != null) {
deflater.end();
deflater = null;
}

dbWriteBuffer = null;
activeChunk = null;
}

private Deflater deflater() {
if (deflater == null)
deflater = new Deflater(options.getCompression());
else
deflater.reset();
return deflater;
}

private WriteBuffer dbBuffer() {
if (dbWriteBuffer == null)
dbWriteBuffer = db.newWriteBuffer();
return dbWriteBuffer;
}

private ChunkFormatter newChunk() {
ChunkFormatter fmt;

fmt = new ChunkFormatter(repo, options);
fmt.setSource(GitStore.ChunkInfo.Source.INSERT);
return fmt;
}

private static ByteArrayInputStream asStream(byte[] data, int off, int len) {
return new ByteArrayInputStream(data, off, len);
}
}

+ 0
- 224
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtInserterOptions.java View File

@@ -1,224 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static java.util.zip.Deflater.DEFAULT_COMPRESSION;
import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH;

import java.security.SecureRandom;
import java.util.zip.Deflater;

import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.CoreConfig;
import org.eclipse.jgit.storage.dht.spi.WriteBuffer;

/** Options controlling how objects are inserted into a DHT stored repository. */
public class DhtInserterOptions {
private static final SecureRandom prng = new SecureRandom();

/** 1024 (number of bytes in one kibibyte/kilobyte) */
public static final int KiB = 1024;

/** 1024 {@link #KiB} (number of bytes in one mebibyte/megabyte) */
public static final int MiB = 1024 * KiB;

private int chunkSize;

private int writeBufferSize;

private int compression;

private int prefetchDepth;

private long parserCacheLimit;

/** Create a default inserter configuration. */
public DhtInserterOptions() {
setChunkSize(1 * MiB);
setWriteBufferSize(1 * MiB);
setCompression(DEFAULT_COMPRESSION);
setPrefetchDepth(50);
setParserCacheLimit(512 * getChunkSize());
}

/** @return maximum size of a chunk, in bytes. */
public int getChunkSize() {
return chunkSize;
}

/**
* Set the maximum size of a chunk, in bytes.
*
* @param sizeInBytes
* the maximum size. A chunk's data segment won't exceed this.
* @return {@code this}
*/
public DhtInserterOptions setChunkSize(int sizeInBytes) {
chunkSize = Math.max(1024, sizeInBytes);
return this;
}

/** @return maximum number of outstanding write bytes. */
public int getWriteBufferSize() {
return writeBufferSize;
}

/**
* Set the maximum number of outstanding bytes in a {@link WriteBuffer}.
*
* @param sizeInBytes
* maximum number of bytes.
* @return {@code this}
*/
public DhtInserterOptions setWriteBufferSize(int sizeInBytes) {
writeBufferSize = Math.max(1024, sizeInBytes);
return this;
}

/** @return maximum number of objects to put into a chunk. */
public int getMaxObjectCount() {
// Do not allow the index to be larger than a chunk itself.
return getChunkSize() / (OBJECT_ID_LENGTH + 4);
}

/** @return compression level used when writing new objects into chunks. */
public int getCompression() {
return compression;
}

/**
* Set the compression level used when writing new objects.
*
* @param level
* the compression level. Use
* {@link Deflater#DEFAULT_COMPRESSION} to specify a default
* compression setting.
* @return {@code this}
*/
public DhtInserterOptions setCompression(int level) {
compression = level;
return this;
}

/**
* Maximum number of entries in a chunk's prefetch list.
* <p>
* Each commit or tree chunk stores an optional prefetch list containing the
* next X chunk keys that a reader would need if they were traversing the
* project history. This implies that chunk prefetch lists are overlapping.
* <p>
* The depth at insertion time needs to be deep enough to allow readers to
* have sufficient parallel prefetch to keep themselves busy without waiting
* on sequential loads. If the depth is not sufficient, readers will stall
* while they sequentially look up the next chunk they need.
*
* @return maximum number of entries in a {@link ChunkMeta} list.
*/
public int getPrefetchDepth() {
return prefetchDepth;
}

/**
* Maximum number of entries in a chunk's prefetch list.
*
* @param depth
* maximum depth of the prefetch list.
* @return {@code this}
*/
public DhtInserterOptions setPrefetchDepth(int depth) {
prefetchDepth = Math.max(0, depth);
return this;
}

/**
* Number of chunks the parser can cache for delta resolution support.
*
* @return chunks to hold in memory to support delta resolution.
*/
public int getParserCacheSize() {
return (int) (getParserCacheLimit() / getChunkSize());
}

/** @return number of bytes the PackParser can cache for delta resolution. */
public long getParserCacheLimit() {
return parserCacheLimit;
}

/**
* Set the number of bytes the PackParser can cache.
*
* @param limit
* number of bytes the parser can cache.
* @return {@code this}
*/
public DhtInserterOptions setParserCacheLimit(long limit) {
parserCacheLimit = Math.max(0, limit);
return this;
}

/** @return next random 32 bits to salt chunk keys. */
int nextChunkSalt() {
return prng.nextInt();
}

/**
* Update properties by setting fields from the configuration.
* <p>
* If a property is not defined in the configuration, then it is left
* unmodified.
*
* @param rc
* configuration to read properties from.
* @return {@code this}
*/
public DhtInserterOptions fromConfig(Config rc) {
setChunkSize(rc.getInt("core", "dht", "chunkSize", getChunkSize()));
setWriteBufferSize(rc.getInt("core", "dht", "writeBufferSize", getWriteBufferSize()));
setCompression(rc.get(CoreConfig.KEY).getCompression());
setPrefetchDepth(rc.getInt("core", "dht", "packParserPrefetchDepth", getPrefetchDepth()));
setParserCacheLimit(rc.getLong("core", "dht", "packParserCacheLimit", getParserCacheLimit()));
return this;
}
}

+ 0
- 83
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtMissingChunkException.java View File

@@ -1,83 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.text.MessageFormat;

/** Indicates a {@link PackChunk} doesn't exist in the database. */
public class DhtMissingChunkException extends DhtException {
private static final long serialVersionUID = 1L;

private final ChunkKey chunkKey;

/**
* Initialize a new missing chunk exception.
*
* @param key
* the key of the chunk that is not found.
*/
public DhtMissingChunkException(ChunkKey key) {
super(MessageFormat.format(DhtText.get().missingChunk, key));
chunkKey = key;
}

/**
* Initialize a new missing chunk exception.
*
* @param key
* the key of the chunk that is not found.
* @param why
* reason the chunk is missing. This may be an explanation about
* low-level data corruption in the database.
*/
public DhtMissingChunkException(ChunkKey key, Throwable why) {
this(key);
initCause(why);
}

/** @return key of the chunk that is missing. */
public ChunkKey getChunkKey() {
return chunkKey;
}
}

+ 0
- 103
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtObjDatabase.java View File

@@ -1,103 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import org.eclipse.jgit.lib.ObjectDatabase;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.storage.dht.spi.Database;

/** ObjectDatabase stored on top of the DHT database. */
public class DhtObjDatabase extends ObjectDatabase {
private final DhtRepository repository;

private final Database db;

private final DhtReaderOptions readerOptions;

private final DhtInserterOptions inserterOptions;

DhtObjDatabase(DhtRepository repository, DhtRepositoryBuilder builder) {
this.repository = repository;
this.db = builder.getDatabase();
this.readerOptions = builder.getReaderOptions();
this.inserterOptions = builder.getInserterOptions();
}

DhtRepository getRepository() {
return repository;
}

Database getDatabase() {
return db;
}

DhtReaderOptions getReaderOptions() {
return readerOptions;
}

DhtInserterOptions getInserterOptions() {
return inserterOptions;
}

@Override
public boolean exists() {
return repository.getRepositoryKey() != null;
}

@Override
public void close() {
// Do nothing.
}

@Override
public ObjectReader newReader() {
return new DhtReader(this);
}

@Override
public ObjectInserter newInserter() {
return new DhtInserter(this);
}
}

+ 0
- 89
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtObjectRepresentation.java View File

@@ -1,89 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.storage.pack.StoredObjectRepresentation;

final class DhtObjectRepresentation extends StoredObjectRepresentation {
private ObjectInfo info;

void set(ObjectInfo link) {
this.info = link;
}

ChunkKey getChunkKey() {
return info.getChunkKey();
}

int getOffset() {
return info.getOffset();
}

long getPackedSize() {
return info.getPackedSize();
}

boolean isFragmented() {
return info.isFragmented();
}

@Override
public ObjectId getDeltaBase() {
return info.getDeltaBase();
}

@Override
public int getFormat() {
if (info.isDelta())
return PACK_DELTA;
return PACK_WHOLE;
}

@Override
public int getWeight() {
long size = info.getPackedSize();
return (int) Math.min(size, Integer.MAX_VALUE);
}
}

+ 0
- 90
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtObjectToPack.java View File

@@ -1,90 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.storage.pack.ObjectToPack;
import org.eclipse.jgit.storage.pack.StoredObjectRepresentation;

final class DhtObjectToPack extends ObjectToPack {
private static final int FRAGMENTED = 1 << 0;

/** Chunk that contains this object. */
ChunkKey chunk;

/** Offset of this object within its chunk. */
int offset;

/** Number of bytes in the object's compressed form, excluding pack header. */
int size;

/** Order this chunk occurs in the {@link Prefetcher}. */
int visitOrder;

DhtObjectToPack(RevObject obj) {
super(obj);
}

boolean isFragmented() {
return isExtendedFlag(FRAGMENTED);
}

@Override
public void select(StoredObjectRepresentation ref) {
DhtObjectRepresentation rep = (DhtObjectRepresentation) ref;
chunk = rep.getChunkKey();
offset = rep.getOffset();

final long sz = rep.getPackedSize();
if (sz <= Integer.MAX_VALUE)
size = (int) sz;
else
size = -1;

if (rep.isFragmented())
setExtendedFlag(FRAGMENTED);
else
clearExtendedFlag(FRAGMENTED);
}
}

+ 0
- 1442
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtPackParser.java
File diff suppressed because it is too large
View File


+ 0
- 710
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtReader.java View File

@@ -1,710 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT;
import static org.eclipse.jgit.lib.Constants.OBJ_TREE;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException;
import java.util.zip.Inflater;

import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.StoredObjectRepresentationNotAvailableException;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.CachedPackInfo;
import org.eclipse.jgit.lib.AbbreviatedObjectId;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.AsyncObjectLoaderQueue;
import org.eclipse.jgit.lib.AsyncObjectSizeQueue;
import org.eclipse.jgit.lib.InflaterCache;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.revwalk.ObjectWalk;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.storage.dht.spi.Context;
import org.eclipse.jgit.storage.dht.spi.Database;
import org.eclipse.jgit.storage.dht.spi.ObjectIndexTable;
import org.eclipse.jgit.storage.pack.CachedPack;
import org.eclipse.jgit.storage.pack.ObjectReuseAsIs;
import org.eclipse.jgit.storage.pack.ObjectToPack;
import org.eclipse.jgit.storage.pack.PackOutputStream;
import org.eclipse.jgit.storage.pack.PackWriter;

/**
* ObjectReader implementation for DHT based repositories.
* <p>
* This class is public only to expose its unique statistics for runtime
* performance reporting. Applications should always prefer to use the more
* generic base class, {@link ObjectReader}.
*/
public class DhtReader extends ObjectReader implements ObjectReuseAsIs {
private final DhtRepository repository;

private final RepositoryKey repo;

private final Database db;

private final DhtReaderOptions readerOptions;

private final DhtInserterOptions inserterOptions;

private final Statistics stats;

private final RecentInfoCache recentInfo;

private final RecentChunks recentChunks;

private final DeltaBaseCache deltaBaseCache;

private Collection<CachedPack> cachedPacks;

private Inflater inflater;

private Prefetcher prefetcher;

DhtReader(DhtObjDatabase objdb) {
this.repository = objdb.getRepository();
this.repo = objdb.getRepository().getRepositoryKey();
this.db = objdb.getDatabase();
this.readerOptions = objdb.getReaderOptions();
this.inserterOptions = objdb.getInserterOptions();

this.stats = new Statistics();
this.recentInfo = new RecentInfoCache(getOptions());
this.recentChunks = new RecentChunks(this);
this.deltaBaseCache = new DeltaBaseCache(this);
}

/** @return describes how this DhtReader has performed. */
public Statistics getStatistics() {
return stats;
}

Database getDatabase() {
return db;
}

RepositoryKey getRepositoryKey() {
return repo;
}

DhtReaderOptions getOptions() {
return readerOptions;
}

DhtInserterOptions getInserterOptions() {
return inserterOptions;
}

RecentInfoCache getRecentInfoCache() {
return recentInfo;
}

RecentChunks getRecentChunks() {
return recentChunks;
}

DeltaBaseCache getDeltaBaseCache() {
return deltaBaseCache;
}

Inflater inflater() {
if (inflater == null)
inflater = InflaterCache.get();
else
inflater.reset();
return inflater;
}

@Override
public void release() {
recentChunks.clear();
endPrefetch();

InflaterCache.release(inflater);
inflater = null;

super.release();
}

@Override
public ObjectReader newReader() {
return new DhtReader(repository.getObjectDatabase());
}

@Override
public boolean has(AnyObjectId objId, int typeHint) throws IOException {
if (objId instanceof RefDataUtil.IdWithChunk)
return true;

if (recentChunks.has(repo, objId))
return true;

if (repository.getRefDatabase().findChunk(objId) != null)
return true;

return !find(objId).isEmpty();
}

@Override
public ObjectLoader open(AnyObjectId objId, int typeHint)
throws MissingObjectException, IncorrectObjectTypeException,
IOException {
ObjectLoader ldr = recentChunks.open(repo, objId, typeHint);
if (ldr != null)
return ldr;

ChunkAndOffset p = getChunk(objId, typeHint, false);
ldr = PackChunk.read(p.chunk, p.offset, this, typeHint);
recentChunk(p.chunk);
return ldr;
}

@Override
public <T extends ObjectId> AsyncObjectLoaderQueue<T> open(
Iterable<T> objectIds, boolean reportMissing) {
return new OpenQueue<T>(this, objectIds, reportMissing);
}

@Override
public long getObjectSize(AnyObjectId objectId, int typeHint)
throws MissingObjectException, IncorrectObjectTypeException,
IOException {
for (ObjectInfo info : find(objectId))
return info.getSize();
throw missing(objectId, typeHint);
}

@Override
public <T extends ObjectId> AsyncObjectSizeQueue<T> getObjectSize(
Iterable<T> objectIds, boolean reportMissing) {
return new SizeQueue<T>(this, objectIds, reportMissing);
}

@Override
public void walkAdviceBeginCommits(RevWalk rw, Collection<RevCommit> roots)
throws IOException {
endPrefetch();

// Don't assign the prefetcher right away. Delay until its
// configured as push might invoke our own methods that may
// try to call back into the active prefetcher.
//
Prefetcher p = prefetch(OBJ_COMMIT, readerOptions.getWalkCommitsPrefetchRatio());
p.push(this, roots);
prefetcher = p;
}

@Override
public void walkAdviceBeginTrees(ObjectWalk ow, RevCommit min, RevCommit max)
throws IOException {
endPrefetch();

// Don't assign the prefetcher right away. Delay until its
// configured as push might invoke our own methods that may
// try to call back into the active prefetcher.
//
Prefetcher p = prefetch(OBJ_TREE, readerOptions.getWalkTreesPrefetchRatio());
p.push(this, min.getTree(), max.getTree());
prefetcher = p;
}

@Override
public void walkAdviceEnd() {
endPrefetch();
}

void recentChunk(PackChunk chunk) {
recentChunks.put(chunk);
}

ChunkAndOffset getChunkGently(AnyObjectId objId) {
return recentChunks.find(repo, objId);
}

ChunkAndOffset getChunk(AnyObjectId objId, int typeHint, boolean checkRecent)
throws DhtException, MissingObjectException {
if (checkRecent) {
ChunkAndOffset r = recentChunks.find(repo, objId);
if (r != null)
return r;
}

ChunkKey key;
if (objId instanceof RefDataUtil.IdWithChunk)
key = ((RefDataUtil.IdWithChunk) objId).getChunkKey();
else
key = repository.getRefDatabase().findChunk(objId);

if (key != null) {
PackChunk chunk = load(key);
if (chunk != null && chunk.hasIndex()) {
int pos = chunk.findOffset(repo, objId);
if (0 <= pos)
return new ChunkAndOffset(chunk, pos);
}

// The hint above is stale. Fall through and do a
// more exhaustive lookup to find the object.
}

if (prefetcher != null) {
ChunkAndOffset r = prefetcher.find(repo, objId);
if (r != null)
return r;
}

for (ObjectInfo link : find(objId)) {
PackChunk chunk;

if (prefetcher != null) {
chunk = prefetcher.get(link.getChunkKey());
if (chunk == null) {
chunk = load(link.getChunkKey());
if (chunk == null)
continue;
if (prefetcher.isType(typeHint))
prefetcher.push(chunk.getMeta());
}
} else {
chunk = load(link.getChunkKey());
if (chunk == null)
continue;
}

return new ChunkAndOffset(chunk, link.getOffset());
}

throw missing(objId, typeHint);
}

ChunkKey findChunk(AnyObjectId objId) throws DhtException {
if (objId instanceof RefDataUtil.IdWithChunk)
return ((RefDataUtil.IdWithChunk) objId).getChunkKey();

ChunkKey key = repository.getRefDatabase().findChunk(objId);
if (key != null)
return key;

ChunkAndOffset r = recentChunks.find(repo, objId);
if (r != null)
return r.chunk.getChunkKey();

for (ObjectInfo link : find(objId))
return link.getChunkKey();

return null;
}

static MissingObjectException missing(AnyObjectId objId, int typeHint) {
ObjectId id = objId.copy();
if (typeHint != OBJ_ANY)
return new MissingObjectException(id, typeHint);
return new MissingObjectException(id, DhtText.get().objectTypeUnknown);
}

PackChunk getChunk(ChunkKey key) throws DhtException {
PackChunk chunk = recentChunks.get(key);
if (chunk != null)
return chunk;

chunk = load(key);
if (chunk != null)
return chunk;

throw new DhtMissingChunkException(key);
}

@Override
public Collection<ObjectId> resolve(AbbreviatedObjectId id)
throws IOException {
// Because ObjectIndexKey requires at least 4 leading digits
// don't resolve anything that is shorter than 4 digits.
//
if (id.length() < 4)
return Collections.emptySet();

throw new DhtException.TODO("resolve abbreviations");
}

public DhtObjectToPack newObjectToPack(RevObject obj) {
return new DhtObjectToPack(obj);
}

@SuppressWarnings("unchecked")
public void selectObjectRepresentation(PackWriter packer,
ProgressMonitor monitor, Iterable<ObjectToPack> objects)
throws IOException, MissingObjectException {
Iterable itr = objects;
new RepresentationSelector(packer, this, monitor).select(itr);
}

private Prefetcher prefetch(final int type, final int ratio) {
int limit = readerOptions.getChunkLimit();
int prefetchLimit = (int) (limit * (ratio / 100.0));
recentChunks.setMaxBytes(limit - prefetchLimit);
return new Prefetcher(this, type, prefetchLimit);
}

private void endPrefetch() {
recentChunks.setMaxBytes(getOptions().getChunkLimit());
prefetcher = null;
}

@SuppressWarnings("unchecked")
public void writeObjects(PackOutputStream out, List<ObjectToPack> objects)
throws IOException {
prefetcher = prefetch(0, readerOptions.getWriteObjectsPrefetchRatio());
try {
List itr = objects;
new ObjectWriter(this, prefetcher).plan(itr);
for (ObjectToPack otp : objects)
out.writeObject(otp);
} finally {
endPrefetch();
}
}

public void copyObjectAsIs(PackOutputStream out, ObjectToPack otp,
boolean validate) throws IOException,
StoredObjectRepresentationNotAvailableException {
DhtObjectToPack obj = (DhtObjectToPack) otp;
try {
PackChunk chunk = recentChunks.get(obj.chunk);
if (chunk == null) {
chunk = prefetcher.get(obj.chunk);
if (chunk == null) {
// This should never happen during packing, it implies
// the fetch plan was incorrect. Unfortunately that can
// occur if objects need to be recompressed on the fly.
//
stats.access(obj.chunk).cntCopyObjectAsIs_PrefetchMiss++;
chunk = getChunk(obj.chunk);
}
if (!chunk.isFragment())
recentChunk(chunk);
}
chunk.copyObjectAsIs(out, obj, validate, this);
} catch (DhtMissingChunkException missingChunk) {
stats.access(missingChunk.getChunkKey()).cntCopyObjectAsIs_InvalidChunk++;
throw new StoredObjectRepresentationNotAvailableException(otp);
}
}

public Collection<CachedPack> getCachedPacks() throws IOException {
if (cachedPacks == null) {
Collection<CachedPackInfo> info;
Collection<CachedPack> packs;

try {
info = db.repository().getCachedPacks(repo);
} catch (TimeoutException e) {
throw new DhtTimeoutException(e);
}

packs = new ArrayList<CachedPack>(info.size());
for (CachedPackInfo i : info)
packs.add(new DhtCachedPack(i));
cachedPacks = packs;
}
return cachedPacks;
}

public void copyPackAsIs(PackOutputStream out, CachedPack pack,
boolean validate) throws IOException {
((DhtCachedPack) pack).copyAsIs(out, validate, this);
}

private List<ObjectInfo> find(AnyObjectId obj) throws DhtException {
List<ObjectInfo> info = recentInfo.get(obj);
if (info != null)
return info;

stats.cntObjectIndex_Load++;
ObjectIndexKey idxKey = ObjectIndexKey.create(repo, obj);
Context opt = Context.READ_REPAIR;
Sync<Map<ObjectIndexKey, Collection<ObjectInfo>>> sync = Sync.create();
db.objectIndex().get(opt, Collections.singleton(idxKey), sync);
try {
Collection<ObjectInfo> m;

m = sync.get(getOptions().getTimeout()).get(idxKey);
if (m == null || m.isEmpty())
return Collections.emptyList();

info = new ArrayList<ObjectInfo>(m);
ObjectInfo.sort(info);
recentInfo.put(obj, info);
return info;
} catch (InterruptedException e) {
throw new DhtTimeoutException(e);
} catch (TimeoutException e) {
throw new DhtTimeoutException(e);
}
}

private PackChunk load(ChunkKey chunkKey) throws DhtException {
if (0 == stats.access(chunkKey).cntReader_Load++
&& readerOptions.isTrackFirstChunkLoad())
stats.access(chunkKey).locReader_Load = new Throwable("first");
Context opt = Context.READ_REPAIR;
Sync<Collection<PackChunk.Members>> sync = Sync.create();
db.chunk().get(opt, Collections.singleton(chunkKey), sync);
try {
Collection<PackChunk.Members> c = sync.get(getOptions()
.getTimeout());
if (c.isEmpty())
return null;
if (c instanceof List)
return ((List<PackChunk.Members>) c).get(0).build();
return c.iterator().next().build();
} catch (InterruptedException e) {
throw new DhtTimeoutException(e);
} catch (TimeoutException e) {
throw new DhtTimeoutException(e);
}
}

static class ChunkAndOffset {
final PackChunk chunk;

final int offset;

ChunkAndOffset(PackChunk chunk, int offset) {
this.chunk = chunk;
this.offset = offset;
}
}

/** How this DhtReader has performed since creation. */
public static class Statistics {
private final Map<ChunkKey, ChunkAccess> chunkAccess = new LinkedHashMap<ChunkKey, ChunkAccess>();

ChunkAccess access(ChunkKey chunkKey) {
ChunkAccess ca = chunkAccess.get(chunkKey);
if (ca == null) {
ca = new ChunkAccess(chunkKey);
chunkAccess.put(chunkKey, ca);
}
return ca;
}

/**
* Number of sequential {@link ObjectIndexTable} lookups made by the
* reader. These were made without the support of batch lookups.
*/
public int cntObjectIndex_Load;

/** Cycles detected in delta chains during OBJ_REF_DELTA reads. */
public int deltaChainCycles;

int recentChunks_Hits;

int recentChunks_Miss;

int deltaBaseCache_Hits;

int deltaBaseCache_Miss;

/** @return ratio of recent chunk hits, [0.00,1.00]. */
public double getRecentChunksHitRatio() {
int total = recentChunks_Hits + recentChunks_Miss;
return ((double) recentChunks_Hits) / total;
}

/** @return ratio of delta base cache hits, [0.00,1.00]. */
public double getDeltaBaseCacheHitRatio() {
int total = deltaBaseCache_Hits + deltaBaseCache_Miss;
return ((double) deltaBaseCache_Hits) / total;
}

/**
* @return collection of chunk accesses made by the application code
* against this reader. The collection's iterator has no
* relevant order.
*/
public Collection<ChunkAccess> getChunkAccess() {
return chunkAccess.values();
}

@Override
public String toString() {
StringBuilder b = new StringBuilder();
b.append("DhtReader.Statistics:\n");
b.append(" ");
if (recentChunks_Hits != 0 || recentChunks_Miss != 0)
ratio(b, "recentChunks", getRecentChunksHitRatio());
if (deltaBaseCache_Hits != 0 || deltaBaseCache_Miss != 0)
ratio(b, "deltaBaseCache", getDeltaBaseCacheHitRatio());
appendFields(this, b);
b.append("\n");
for (ChunkAccess ca : getChunkAccess()) {
b.append(" ");
b.append(ca.toString());
b.append("\n");
}
return b.toString();
}

@SuppressWarnings("boxing")
static void ratio(StringBuilder b, String name, double value) {
b.append(String.format(" %s=%.2f%%", name, value * 100.0));
}

static void appendFields(Object obj, StringBuilder b) {
try {
for (Field field : obj.getClass().getDeclaredFields()) {
String n = field.getName();

if (field.getType() == Integer.TYPE
&& (field.getModifiers() & Modifier.PUBLIC) != 0) {
int v = field.getInt(obj);
if (0 < v)
b.append(' ').append(n).append('=').append(v);
}
}
} catch (IllegalArgumentException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}

/** Summary describing how a chunk was accessed. */
public static final class ChunkAccess {
/** Chunk this access block describes. */
public final ChunkKey chunkKey;

/**
* Number of times chunk was loaded sequentially. Incremented when
* the reader had to load the chunk on demand with no cache or
* prefetcher support.
*/
public int cntReader_Load;

Throwable locReader_Load;

/**
* Number of times the prefetcher loaded from the database.
* Incremented each time the prefetcher asked for the chunk from the
* underlying database (which might have its own distributed cache,
* or not).
*/
public int cntPrefetcher_Load;

/**
* Number of times the prefetcher ordering was wrong. Incremented if
* a reader wants a chunk but the prefetcher didn't have it ready at
* the time of request. This indicates a bad prefetching plan as the
* chunk should have been listed earlier in the prefetcher's list.
*/
public int cntPrefetcher_OutOfOrder;

/**
* Number of times the reader had to stall to wait for a chunk that
* is currently being prefetched to finish loading and become ready.
* This indicates the prefetcher may have fetched other chunks first
* (had the wrong order), or does not have a deep enough window to
* hide these loads from the application.
*/
public int cntPrefetcher_WaitedForLoad;

/**
* Number of times the reader asked the prefetcher for the same
* chunk after it was already consumed from the prefetcher. This
* indicates the reader has walked back on itself and revisited a
* chunk again.
*/
public int cntPrefetcher_Revisited;

/**
* Number of times the reader needed this chunk to copy an object
* as-is into a pack stream, but the prefetcher didn't have it
* ready. This correlates with {@link #cntPrefetcher_OutOfOrder} or
* {@link #cntPrefetcher_Revisited}.
*/
public int cntCopyObjectAsIs_PrefetchMiss;

/**
* Number of times the reader tried to copy an object from this
* chunk, but discovered the chunk was corrupt or did not contain
* the object as expected.
*/
public int cntCopyObjectAsIs_InvalidChunk;

ChunkAccess(ChunkKey key) {
chunkKey = key;
}

@Override
public String toString() {
StringBuilder b = new StringBuilder();
b.append(chunkKey).append('[');
appendFields(this, b);
b.append(" ]");
if (locReader_Load != null) {
StringWriter sw = new StringWriter();
locReader_Load.printStackTrace(new PrintWriter(sw));
b.append(sw);
}
return b.toString();
}
}
}
}

+ 0
- 353
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtReaderOptions.java View File

@@ -1,353 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import org.eclipse.jgit.lib.Config;

/** Options controlling how objects are read from a DHT stored repository. */
public class DhtReaderOptions {
/** 1024 (number of bytes in one kibibyte/kilobyte) */
public static final int KiB = 1024;

/** 1024 {@link #KiB} (number of bytes in one mebibyte/megabyte) */
public static final int MiB = 1024 * KiB;

private Timeout timeout;

private boolean prefetchFollowEdgeHints;

private int chunkLimit;

private int openQueuePrefetchRatio;

private int walkCommitsPrefetchRatio;

private int walkTreesPrefetchRatio;

private int writeObjectsPrefetchRatio;

private int objectIndexConcurrentBatches;

private int objectIndexBatchSize;

private int deltaBaseCacheSize;

private int deltaBaseCacheLimit;

private int recentInfoCacheSize;

private boolean trackFirstChunkLoad;

/** Create a default reader configuration. */
public DhtReaderOptions() {
setTimeout(Timeout.seconds(5));
setPrefetchFollowEdgeHints(true);

setChunkLimit(5 * MiB);
setOpenQueuePrefetchRatio(20 /* percent */);
setWalkCommitsPrefetchRatio(20 /* percent */);
setWalkTreesPrefetchRatio(20 /* percent */);
setWriteObjectsPrefetchRatio(90 /* percent */);

setObjectIndexConcurrentBatches(2);
setObjectIndexBatchSize(512);

setDeltaBaseCacheSize(1024);
setDeltaBaseCacheLimit(10 * MiB);

setRecentInfoCacheSize(4096);
}

/** @return default timeout to wait on long operations before aborting. */
public Timeout getTimeout() {
return timeout;
}

/**
* Set the default timeout to wait on long operations.
*
* @param maxWaitTime
* new wait time.
* @return {@code this}
*/
public DhtReaderOptions setTimeout(Timeout maxWaitTime) {
if (maxWaitTime == null || maxWaitTime.getTime() < 0)
throw new IllegalArgumentException();
timeout = maxWaitTime;
return this;
}

/** @return if the prefetcher should follow edge hints (experimental) */
public boolean isPrefetchFollowEdgeHints() {
return prefetchFollowEdgeHints;
}

/**
* Enable (or disable) the experimental edge following feature.
*
* @param follow
* true to follow the edge hints.
* @return {@code this}
*/
public DhtReaderOptions setPrefetchFollowEdgeHints(boolean follow) {
prefetchFollowEdgeHints = follow;
return this;
}

/** @return number of bytes to hold within a DhtReader. */
public int getChunkLimit() {
return chunkLimit;
}

/**
* Set the number of bytes hold within a DhtReader.
*
* @param maxBytes
* @return {@code this}
*/
public DhtReaderOptions setChunkLimit(int maxBytes) {
chunkLimit = Math.max(1024, maxBytes);
return this;
}

/** @return percentage of {@link #getChunkLimit()} used for prefetch, 0..100. */
public int getOpenQueuePrefetchRatio() {
return openQueuePrefetchRatio;
}

/**
* Set the prefetch ratio used by the open object queue.
*
* @param ratio 0..100.
* @return {@code this}
*/
public DhtReaderOptions setOpenQueuePrefetchRatio(int ratio) {
openQueuePrefetchRatio = Math.max(0, Math.min(ratio, 100));
return this;
}

/** @return percentage of {@link #getChunkLimit()} used for prefetch, 0..100. */
public int getWalkCommitsPrefetchRatio() {
return walkCommitsPrefetchRatio;
}

/**
* Set the prefetch ratio used by the open object queue.
*
* @param ratio 0..100.
* @return {@code this}
*/
public DhtReaderOptions setWalkCommitsPrefetchRatio(int ratio) {
walkCommitsPrefetchRatio = Math.max(0, Math.min(ratio, 100));
return this;
}

/** @return percentage of {@link #getChunkLimit()} used for prefetch, 0..100. */
public int getWalkTreesPrefetchRatio() {
return walkTreesPrefetchRatio;
}

/**
* Set the prefetch ratio used by the open object queue.
*
* @param ratio 0..100.
* @return {@code this}
*/
public DhtReaderOptions setWalkTreesPrefetchRatio(int ratio) {
walkTreesPrefetchRatio = Math.max(0, Math.min(ratio, 100));
return this;
}

/** @return percentage of {@link #getChunkLimit()} used for prefetch, 0..100. */
public int getWriteObjectsPrefetchRatio() {
return writeObjectsPrefetchRatio;
}

/**
* Set the prefetch ratio used by the open object queue.
*
* @param ratio 0..100.
* @return {@code this}
*/
public DhtReaderOptions setWriteObjectsPrefetchRatio(int ratio) {
writeObjectsPrefetchRatio = Math.max(0, Math.min(ratio, 100));
return this;
}

/** @return number of concurrent reads against ObjectIndexTable. */
public int getObjectIndexConcurrentBatches() {
return objectIndexConcurrentBatches;
}

/**
* Set the number of concurrent readers on ObjectIndexTable.
*
* @param batches
* number of batches.
* @return {@code this}
*/
public DhtReaderOptions setObjectIndexConcurrentBatches(int batches) {
objectIndexConcurrentBatches = Math.max(1, batches);
return this;
}

/** @return number of objects to lookup in one batch. */
public int getObjectIndexBatchSize() {
return objectIndexBatchSize;
}

/**
* Set the number of objects to lookup at once.
*
* @param objectCnt
* the number of objects in a lookup batch.
* @return {@code this}
*/
public DhtReaderOptions setObjectIndexBatchSize(int objectCnt) {
objectIndexBatchSize = Math.max(1, objectCnt);
return this;
}

/** @return size of the delta base cache hash table, in object entries. */
public int getDeltaBaseCacheSize() {
return deltaBaseCacheSize;
}

/**
* Set the size of the delta base cache hash table.
*
* @param slotCnt
* number of slots in the hash table.
* @return {@code this}
*/
public DhtReaderOptions setDeltaBaseCacheSize(int slotCnt) {
deltaBaseCacheSize = Math.max(1, slotCnt);
return this;
}

/** @return maximum number of bytes to hold in per-reader DeltaBaseCache. */
public int getDeltaBaseCacheLimit() {
return deltaBaseCacheLimit;
}

/**
* Set the maximum number of bytes in the DeltaBaseCache.
*
* @param maxBytes
* the new limit.
* @return {@code this}
*/
public DhtReaderOptions setDeltaBaseCacheLimit(int maxBytes) {
deltaBaseCacheLimit = Math.max(0, maxBytes);
return this;
}

/** @return number of objects to cache information on. */
public int getRecentInfoCacheSize() {
return recentInfoCacheSize;
}

/**
* Set the number of objects to cache information on.
*
* @param objectCnt
* the number of objects to cache.
* @return {@code this}
*/
public DhtReaderOptions setRecentInfoCacheSize(int objectCnt) {
recentInfoCacheSize = Math.max(0, objectCnt);
return this;
}

/**
* @return true if {@link DhtReader.Statistics} includes the stack trace for
* the first time a chunk is loaded. Supports debugging DHT code.
*/
public boolean isTrackFirstChunkLoad() {
return trackFirstChunkLoad;
}

/**
* Set whether or not the initial load of each chunk should be tracked.
*
* @param track
* true to track the stack trace of the first load.
* @return {@code this}.
*/
public DhtReaderOptions setTrackFirstChunkLoad(boolean track) {
trackFirstChunkLoad = track;
return this;
}

/**
* Update properties by setting fields from the configuration.
* <p>
* If a property is not defined in the configuration, then it is left
* unmodified.
*
* @param rc
* configuration to read properties from.
* @return {@code this}
*/
public DhtReaderOptions fromConfig(Config rc) {
setTimeout(Timeout.getTimeout(rc, "core", "dht", "timeout", getTimeout()));
setPrefetchFollowEdgeHints(rc.getBoolean("core", "dht", "prefetchFollowEdgeHints", isPrefetchFollowEdgeHints()));
setChunkLimit(rc.getInt("core", "dht", "chunkLimit", getChunkLimit()));
setOpenQueuePrefetchRatio(rc.getInt("core", "dht", "openQueuePrefetchRatio", getOpenQueuePrefetchRatio()));
setWalkCommitsPrefetchRatio(rc.getInt("core", "dht", "walkCommitsPrefetchRatio", getWalkCommitsPrefetchRatio()));
setWalkTreesPrefetchRatio(rc.getInt("core", "dht", "walkTreesPrefetchRatio", getWalkTreesPrefetchRatio()));
setWriteObjectsPrefetchRatio(rc.getInt("core", "dht", "writeObjectsPrefetchRatio", getWriteObjectsPrefetchRatio()));

setObjectIndexConcurrentBatches(rc.getInt("core", "dht", "objectIndexConcurrentBatches", getObjectIndexConcurrentBatches()));
setObjectIndexBatchSize(rc.getInt("core", "dht", "objectIndexBatchSize", getObjectIndexBatchSize()));

setDeltaBaseCacheSize(rc.getInt("core", "dht", "deltaBaseCacheSize", getDeltaBaseCacheSize()));
setDeltaBaseCacheLimit(rc.getInt("core", "dht", "deltaBaseCacheLimit", getDeltaBaseCacheLimit()));

setRecentInfoCacheSize(rc.getInt("core", "dht", "recentInfoCacheSize", getRecentInfoCacheSize()));

setTrackFirstChunkLoad(rc.getBoolean("core", "dht", "debugTrackFirstChunkLoad", isTrackFirstChunkLoad()));
return this;
}
}

+ 0
- 524
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRefDatabase.java View File

@@ -1,524 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.eclipse.jgit.lib.Ref.Storage.LOOSE;
import static org.eclipse.jgit.lib.Ref.Storage.NEW;
import static org.eclipse.jgit.storage.dht.RefDataUtil.NONE;

import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicReference;

import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.RefData;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectIdSubclassMap;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefDatabase;
import org.eclipse.jgit.lib.RefRename;
import org.eclipse.jgit.lib.SymbolicRef;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.storage.dht.RefDataUtil.IdWithChunk;
import org.eclipse.jgit.storage.dht.spi.Context;
import org.eclipse.jgit.storage.dht.spi.Database;
import org.eclipse.jgit.util.RefList;
import org.eclipse.jgit.util.RefMap;

/** Repository references stored on top of a DHT database. */
public class DhtRefDatabase extends RefDatabase {
private final DhtRepository repository;

private final Database db;

private final AtomicReference<RefCache> cache;

DhtRefDatabase(DhtRepository repository, Database db) {
this.repository = repository;
this.db = db;
this.cache = new AtomicReference<RefCache>();
}

DhtRepository getRepository() {
return repository;
}

ChunkKey findChunk(AnyObjectId id) {
RefCache c = cache.get();
if (c != null) {
IdWithChunk i = c.hints.get(id);
if (i != null)
return i.getChunkKey();
}
return null;
}

@Override
public Ref getRef(String needle) throws IOException {
RefCache curr = readRefs();
for (String prefix : SEARCH_PATH) {
DhtRef ref = curr.ids.get(prefix + needle);
if (ref != null) {
ref = resolve(ref, 0, curr.ids);
return ref;
}
}
return null;
}

private DhtRef getOneRef(String refName) throws IOException {
RefCache curr = readRefs();
DhtRef ref = curr.ids.get(refName);
if (ref != null)
return resolve(ref, 0, curr.ids);
return ref;
}

@Override
public List<Ref> getAdditionalRefs() {
return Collections.emptyList();
}

@Override
public Map<String, Ref> getRefs(String prefix) throws IOException {
RefCache curr = readRefs();
RefList<DhtRef> packed = RefList.emptyList();
RefList<DhtRef> loose = curr.ids;
RefList.Builder<DhtRef> sym = new RefList.Builder<DhtRef>(curr.sym.size());

for (int idx = 0; idx < curr.sym.size(); idx++) {
DhtRef ref = curr.sym.get(idx);
String name = ref.getName();
ref = resolve(ref, 0, loose);
if (ref != null && ref.getObjectId() != null) {
sym.add(ref);
} else {
// A broken symbolic reference, we have to drop it from the
// collections the client is about to receive. Should be a
// rare occurrence so pay a copy penalty.
int toRemove = loose.find(name);
if (0 <= toRemove)
loose = loose.remove(toRemove);
}
}

return new RefMap(prefix, packed, loose, sym.toRefList());
}

private DhtRef resolve(DhtRef ref, int depth, RefList<DhtRef> loose)
throws IOException {
if (!ref.isSymbolic())
return ref;

DhtRef dst = (DhtRef) ref.getTarget();

if (MAX_SYMBOLIC_REF_DEPTH <= depth)
return null; // claim it doesn't exist

dst = loose.get(dst.getName());
if (dst == null)
return ref;

dst = resolve(dst, depth + 1, loose);
if (dst == null)
return null;

return new DhtSymbolicRef(
ref.getName(),
dst,
((DhtSymbolicRef) ref).getRefData());
}

@Override
public Ref peel(Ref ref) throws IOException {
final Ref oldLeaf = ref.getLeaf();
if (oldLeaf.isPeeled() || oldLeaf.getObjectId() == null)
return ref;

DhtRef newLeaf = doPeel(oldLeaf);

RefCache cur = readRefs();
int idx = cur.ids.find(oldLeaf.getName());
if (0 <= idx && cur.ids.get(idx) == oldLeaf) {
RefList<DhtRef> newList = cur.ids.set(idx, newLeaf);
if (cache.compareAndSet(cur, new RefCache(newList, cur)))
cachePeeledState(oldLeaf, newLeaf);
}

return recreate(ref, newLeaf);
}

private void cachePeeledState(Ref oldLeaf, Ref newLeaf) {
// TODO(spearce) Use an ExecutorService here
try {
RepositoryKey repo = repository.getRepositoryKey();
RefKey key = RefKey.create(repo, newLeaf.getName());
RefData oldData = ((DhtRef) oldLeaf).getRefData();
RefData newData = ((DhtRef) newLeaf).getRefData();
db.ref().compareAndPut(key, oldData, newData);
} catch (TimeoutException e) {
// Ignore a timeout here, we were only trying to update
// a cached value to save peeling costs in the future.

} catch (DhtException e) {
// Ignore a database error, this was only an attempt to
// fix a value that could be cached to save time later.
}
}

private DhtRef doPeel(final Ref leaf) throws MissingObjectException,
IOException {
RevWalk rw = new RevWalk(getRepository());
try {
DhtReader ctx = (DhtReader) rw.getObjectReader();
RevObject obj = rw.parseAny(leaf.getObjectId());
RefData.Builder d = RefData.newBuilder(((DhtRef) leaf).getRefData());

ChunkKey oKey = ctx.findChunk(leaf.getObjectId());
if (oKey != null)
d.getTargetBuilder().setChunkKey(oKey.asString());
else
d.getTargetBuilder().clearChunkKey();

if (obj instanceof RevTag) {
ObjectId pId = rw.peel(obj);
d.getPeeledBuilder().setObjectName(pId.name());

ChunkKey pKey = ctx.findChunk(pId);
if (pKey != null)
d.getPeeledBuilder().setChunkKey(pKey.asString());
else
d.getPeeledBuilder().clearChunkKey();
} else {
d.clearPeeled();
}

d.setIsPeeled(true);
d.setSequence(d.getSequence() + 1);
return new DhtObjectIdRef(leaf.getName(), d.build());
} finally {
rw.release();
}
}

private static Ref recreate(final Ref old, final Ref leaf) {
if (old.isSymbolic()) {
Ref dst = recreate(old.getTarget(), leaf);
return new SymbolicRef(old.getName(), dst);
}
return leaf;
}

@Override
public DhtRefUpdate newUpdate(String refName, boolean detach)
throws IOException {
boolean detachingSymbolicRef = false;
DhtRef ref = getOneRef(refName);
if (ref == null)
ref = new DhtObjectIdRef(refName, NONE);
else
detachingSymbolicRef = detach && ref.isSymbolic();

if (detachingSymbolicRef) {
RefData src = ((DhtRef) ref.getLeaf()).getRefData();
RefData.Builder b = RefData.newBuilder(ref.getRefData());
b.clearSymref();
b.setTarget(src.getTarget());
ref = new DhtObjectIdRef(refName, b.build());
}

RepositoryKey repo = repository.getRepositoryKey();
DhtRefUpdate update = new DhtRefUpdate(this, repo, db, ref);
if (detachingSymbolicRef)
update.setDetachingSymbolicRef();
return update;
}

@Override
public RefRename newRename(String fromName, String toName)
throws IOException {
DhtRefUpdate src = newUpdate(fromName, true);
DhtRefUpdate dst = newUpdate(toName, true);
return new DhtRefRename(src, dst);
}

@Override
public boolean isNameConflicting(String refName) throws IOException {
RefList<DhtRef> all = readRefs().ids;

// Cannot be nested within an existing reference.
int lastSlash = refName.lastIndexOf('/');
while (0 < lastSlash) {
String needle = refName.substring(0, lastSlash);
if (all.contains(needle))
return true;
lastSlash = refName.lastIndexOf('/', lastSlash - 1);
}

// Cannot be the container of an existing reference.
String prefix = refName + '/';
int idx = -(all.find(prefix) + 1);
if (idx < all.size() && all.get(idx).getName().startsWith(prefix))
return true;
return false;
}

@Override
public void create() {
// Nothing to do.
}

@Override
public void close() {
clearCache();
}

void clearCache() {
cache.set(null);
}

void stored(String refName, RefData newData) {
DhtRef ref = fromData(refName, newData);
RefCache oldCache, newCache;
do {
oldCache = cache.get();
if (oldCache == null)
return;

RefList<DhtRef> ids = oldCache.ids.put(ref);
RefList<DhtRef> sym = oldCache.sym;

if (ref.isSymbolic()) {
sym = sym.put(ref);
} else {
int p = sym.find(refName);
if (0 <= p)
sym = sym.remove(p);
}

newCache = new RefCache(ids, sym, oldCache.hints);
} while (!cache.compareAndSet(oldCache, newCache));
}

void removed(String refName) {
RefCache oldCache, newCache;
do {
oldCache = cache.get();
if (oldCache == null)
return;

int p;

RefList<DhtRef> ids = oldCache.ids;
p = ids.find(refName);
if (0 <= p)
ids = ids.remove(p);

RefList<DhtRef> sym = oldCache.sym;
p = sym.find(refName);
if (0 <= p)
sym = sym.remove(p);

newCache = new RefCache(ids, sym, oldCache.hints);
} while (!cache.compareAndSet(oldCache, newCache));
}

private RefCache readRefs() throws DhtException {
RefCache c = cache.get();
if (c == null) {
try {
c = read();
} catch (TimeoutException e) {
throw new DhtTimeoutException(e);
}
cache.set(c);
}
return c;
}

private RefCache read() throws DhtException, TimeoutException {
RefList.Builder<DhtRef> id = new RefList.Builder<DhtRef>();
RefList.Builder<DhtRef> sym = new RefList.Builder<DhtRef>();
ObjectIdSubclassMap<IdWithChunk> hints = new ObjectIdSubclassMap<IdWithChunk>();

for (Map.Entry<RefKey, RefData> e : scan()) {
DhtRef ref = fromData(e.getKey().getName(), e.getValue());

if (ref.isSymbolic())
sym.add(ref);
id.add(ref);

if (ref.getObjectId() instanceof IdWithChunk
&& !hints.contains(ref.getObjectId()))
hints.add((IdWithChunk) ref.getObjectId());
if (ref.getPeeledObjectId() instanceof IdWithChunk
&& !hints.contains(ref.getPeeledObjectId()))
hints.add((IdWithChunk) ref.getPeeledObjectId());
}

id.sort();
sym.sort();

return new RefCache(id.toRefList(), sym.toRefList(), hints);
}

static DhtRef fromData(String name, RefData data) {
if (data.hasSymref())
return new DhtSymbolicRef(name, data);
else
return new DhtObjectIdRef(name, data);
}

private static ObjectId idFrom(RefData.Id src) {
ObjectId id = ObjectId.fromString(src.getObjectName());
if (!src.hasChunkKey())
return id;
return new IdWithChunk(id, ChunkKey.fromString(src.getChunkKey()));
}

private Set<Map.Entry<RefKey, RefData>> scan() throws DhtException,
TimeoutException {
// TODO(spearce) Do we need to perform READ_REPAIR here?
RepositoryKey repo = repository.getRepositoryKey();
return db.ref().getAll(Context.LOCAL, repo).entrySet();
}

private static class RefCache {
final RefList<DhtRef> ids;

final RefList<DhtRef> sym;

final ObjectIdSubclassMap<IdWithChunk> hints;

RefCache(RefList<DhtRef> ids, RefList<DhtRef> sym,
ObjectIdSubclassMap<IdWithChunk> hints) {
this.ids = ids;
this.sym = sym;
this.hints = hints;
}

RefCache(RefList<DhtRef> ids, RefCache old) {
this(ids, old.sym, old.hints);
}
}

static interface DhtRef extends Ref {
RefData getRefData();
}

private static class DhtSymbolicRef extends SymbolicRef implements DhtRef {
private final RefData data;

DhtSymbolicRef(String refName,RefData data) {
super(refName, new DhtObjectIdRef(data.getSymref(), NONE));
this.data = data;
}

DhtSymbolicRef(String refName, Ref target, RefData data) {
super(refName, target);
this.data = data;
}

public RefData getRefData() {
return data;
}
}

private static class DhtObjectIdRef implements DhtRef {
private final String name;
private final RefData data;
private final ObjectId objectId;
private final ObjectId peeledId;

DhtObjectIdRef(String name, RefData data) {
this.name = name;
this.data = data;
this.objectId = data.hasTarget() ? idFrom(data.getTarget()) : null;
this.peeledId = data.hasPeeled() ? idFrom(data.getPeeled()) : null;
}

public String getName() {
return name;
}

public boolean isSymbolic() {
return false;
}

public Ref getLeaf() {
return this;
}

public Ref getTarget() {
return this;
}

public ObjectId getObjectId() {
return objectId;
}

public Ref.Storage getStorage() {
return data.hasTarget() ? LOOSE : NEW;
}

public boolean isPeeled() {
return data.getIsPeeled();
}

public ObjectId getPeeledObjectId() {
return peeledId;
}

public RefData getRefData() {
return data;
}
}
}

+ 0
- 72
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRefRename.java View File

@@ -1,72 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.IOException;

import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.RefRename;
import org.eclipse.jgit.lib.RefUpdate.Result;

class DhtRefRename extends RefRename {
DhtRefRename(DhtRefUpdate src, DhtRefUpdate dst) {
super(src, dst);
}

@Override
protected Result doRename() throws IOException {
// TODO(spearce) Correctly handle renameing foo/bar to foo.

destination.setExpectedOldObjectId(ObjectId.zeroId());
destination.setNewObjectId(source.getRef().getObjectId());
switch (destination.update()) {
case NEW:
source.delete();
return Result.RENAMED;

default:
return destination.getResult();
}
}
}

+ 0
- 224
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRefUpdate.java View File

@@ -1,224 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.RefData;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.storage.dht.DhtRefDatabase.DhtRef;
import org.eclipse.jgit.storage.dht.spi.Database;

class DhtRefUpdate extends RefUpdate {
private final DhtRefDatabase refdb;

private final RepositoryKey repo;

private final Database db;

private RefKey refKey;

private RefData oldData;

private RefData newData;

private Ref dstRef;

private RevWalk rw;

DhtRefUpdate(DhtRefDatabase refdb, RepositoryKey repo, Database db, Ref ref) {
super(ref);
this.refdb = refdb;
this.repo = repo;
this.db = db;
}

@Override
protected DhtRefDatabase getRefDatabase() {
return refdb;
}

@Override
protected DhtRepository getRepository() {
return refdb.getRepository();
}

@Override
public Result update(RevWalk walk) throws IOException {
try {
rw = walk;
return super.update(walk);
} finally {
rw = null;
}
}

@Override
protected boolean tryLock(boolean deref) throws IOException {
dstRef = getRef();
if (deref)
dstRef = dstRef.getLeaf();

refKey = RefKey.create(repo, dstRef.getName());
oldData = ((DhtRef) dstRef).getRefData();

if (dstRef.isSymbolic())
setOldObjectId(null);
else
setOldObjectId(dstRef.getObjectId());

return true;
}

@Override
protected void unlock() {
// No state is held while "locked".
}

@Override
protected Result doUpdate(Result desiredResult) throws IOException {
try {
newData = newData();
boolean r = db.ref().compareAndPut(refKey, oldData, newData);
if (r) {
getRefDatabase().stored(dstRef.getName(), newData);
return desiredResult;
} else {
getRefDatabase().clearCache();
return Result.LOCK_FAILURE;
}
} catch (TimeoutException e) {
return Result.IO_FAILURE;
}
}

@Override
protected Result doDelete(Result desiredResult) throws IOException {
try {
boolean r = db.ref().compareAndRemove(refKey, oldData);
if (r) {
getRefDatabase().removed(dstRef.getName());
return desiredResult;
} else {
getRefDatabase().clearCache();
return Result.LOCK_FAILURE;
}
} catch (TimeoutException e) {
return Result.IO_FAILURE;
}
}

@Override
protected Result doLink(String target) throws IOException {
try {
RefData.Builder d = RefData.newBuilder(oldData);
clearRefData(d);
updateSequence(d);
d.setSymref(target);
newData = d.build();
boolean r = db.ref().compareAndPut(refKey, oldData, newData);
if (r) {
getRefDatabase().stored(dstRef.getName(), newData);
if (getRef().getStorage() == Ref.Storage.NEW)
return Result.NEW;
return Result.FORCED;
} else {
getRefDatabase().clearCache();
return Result.LOCK_FAILURE;
}
} catch (TimeoutException e) {
return Result.IO_FAILURE;
}
}

private RefData newData() throws IOException {
RefData.Builder d = RefData.newBuilder(oldData);
clearRefData(d);
updateSequence(d);

ObjectId newId = getNewObjectId();
d.getTargetBuilder().setObjectName(newId.name());
try {
DhtReader ctx = (DhtReader) rw.getObjectReader();
RevObject obj = rw.parseAny(newId);

ChunkKey oKey = ctx.findChunk(newId);
if (oKey != null)
d.getTargetBuilder().setChunkKey(oKey.asString());

if (obj instanceof RevTag) {
ObjectId pId = rw.peel(obj);
ChunkKey pKey = ctx.findChunk(pId);
if (pKey != null)
d.getPeeledBuilder().setChunkKey(pKey.asString());
d.getPeeledBuilder().setObjectName(pId.name());
}
} catch (MissingObjectException e) {
// Automatic peeling failed. Ignore the problem and deal with it
// during reading later, this is the classical Git behavior on disk.
}
return d.build();
}

private static void clearRefData(RefData.Builder d) {
// Clear fields individually rather than discarding the RefData.
// This way implementation specific extensions are carried
// through from the old version to the new version.
d.clearSymref();
d.clearTarget();
d.clearPeeled();
d.clearIsPeeled();
}

private static void updateSequence(RefData.Builder d) {
d.setSequence(d.getSequence() + 1);
}
}

+ 0
- 171
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRepository.java View File

@@ -1,171 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.IOException;
import java.text.MessageFormat;
import java.util.concurrent.TimeoutException;

import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.storage.dht.spi.Database;
import org.eclipse.jgit.storage.file.ReflogReader;

/**
* A Git repository storing its objects and references in a DHT.
* <p>
* With the exception of repository creation, this class is thread-safe, but
* readers created from it are not. When creating a new repository using the
* {@link #create(boolean)} method, the newly constructed repository object does
* not ensure the assigned {@link #getRepositoryKey()} will be visible to all
* threads. Applications are encouraged to use their own synchronization when
* sharing a Repository instance that was used to create a new repository.
*/
public class DhtRepository extends Repository {
private final RepositoryName name;

private final Database db;

private final DhtRefDatabase refdb;

private final DhtObjDatabase objdb;

private final DhtConfig config;

private RepositoryKey key;

/**
* Initialize an in-memory representation of a DHT backed repository.
*
* @param builder
* description of the repository and its data storage.
*/
public DhtRepository(DhtRepositoryBuilder builder) {
super(builder);
this.name = RepositoryName.create(builder.getRepositoryName());
this.key = builder.getRepositoryKey();
this.db = builder.getDatabase();

this.refdb = new DhtRefDatabase(this, db);
this.objdb = new DhtObjDatabase(this, builder);
this.config = new DhtConfig();
}

/** @return database cluster that houses this repository (among others). */
public Database getDatabase() {
return db;
}

/** @return human readable name used to open this repository. */
public RepositoryName getRepositoryName() {
return name;
}

/** @return unique identity of the repository in the {@link #getDatabase()}. */
public RepositoryKey getRepositoryKey() {
return key;
}

@Override
public StoredConfig getConfig() {
return config;
}

@Override
public DhtRefDatabase getRefDatabase() {
return refdb;
}

@Override
public DhtObjDatabase getObjectDatabase() {
return objdb;
}

@Override
public void create(boolean bare) throws IOException {
if (!bare)
throw new IllegalArgumentException(
DhtText.get().repositoryMustBeBare);

if (getObjectDatabase().exists())
throw new DhtException(MessageFormat.format(
DhtText.get().repositoryAlreadyExists, name.asString()));

try {
key = db.repository().nextKey();
db.repositoryIndex().putUnique(name, key);
} catch (TimeoutException err) {
throw new DhtTimeoutException(MessageFormat.format(
DhtText.get().timeoutLocatingRepository, name), err);
}

String master = Constants.R_HEADS + Constants.MASTER;
RefUpdate.Result result = updateRef(Constants.HEAD, true).link(master);
if (result != RefUpdate.Result.NEW)
throw new IOException(result.name());
}

@Override
public void scanForRepoChanges() {
refdb.clearCache();
}

@Override
public void notifyIndexChanged() {
// we do not support non-bare repositories yet
}

@Override
public String toString() {
return "DhtRepostitory[" + key + " / " + name + "]";
}

// TODO This method should be removed from the JGit API.
@Override
public ReflogReader getReflogReader(String refName) {
throw new UnsupportedOperationException();
}
}

+ 0
- 236
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtRepositoryBuilder.java View File

@@ -1,236 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.File;
import java.text.MessageFormat;
import java.util.concurrent.TimeoutException;

import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.BaseRepositoryBuilder;
import org.eclipse.jgit.storage.dht.spi.Database;

/**
* Constructs a {@link DhtRepository}.
*
* @param <B>
* type of builder used by the DHT system.
* @param <R>
* type of repository used by the DHT system.
* @param <D>
* type of database used by the DHT system.
*/
public class DhtRepositoryBuilder<B extends DhtRepositoryBuilder, R extends DhtRepository, D extends Database>
extends BaseRepositoryBuilder<B, R> {
private D database;

private DhtReaderOptions readerOptions;

private DhtInserterOptions inserterOptions;

private String name;

private RepositoryKey key;

/** Initializes an empty builder with no values set. */
public DhtRepositoryBuilder() {
setBare();
setMustExist(true);
}

/** @return the database that stores the repositories. */
public D getDatabase() {
return database;
}

/**
* Set the cluster used to store the repositories.
*
* @param database
* the database supplier.
* @return {@code this}
*/
public B setDatabase(D database) {
this.database = database;
return self();
}

/** @return options used by readers accessing the repository. */
public DhtReaderOptions getReaderOptions() {
return readerOptions;
}

/**
* Set the reader options.
*
* @param opt
* new reader options object.
* @return {@code this}
*/
public B setReaderOptions(DhtReaderOptions opt) {
readerOptions = opt;
return self();
}

/** @return options used by writers accessing the repository. */
public DhtInserterOptions getInserterOptions() {
return inserterOptions;
}

/**
* Set the inserter options.
*
* @param opt
* new inserter options object.
* @return {@code this}
*/
public B setInserterOptions(DhtInserterOptions opt) {
inserterOptions = opt;
return self();
}

/** @return name of the repository in the DHT. */
public String getRepositoryName() {
return name;
}

/**
* Set the name of the repository to open.
*
* @param name
* the name.
* @return {@code this}.
*/
public B setRepositoryName(String name) {
this.name = name;
return self();
}

/** @return the repository's key. */
public RepositoryKey getRepositoryKey() {
return key;
}

/**
* @param key
* @return {@code this}
*/
public B setRepositoryKey(RepositoryKey key) {
this.key = key;
return self();
}

@Override
public B setup() throws IllegalArgumentException, DhtException,
RepositoryNotFoundException {
if (getDatabase() == null)
throw new IllegalArgumentException(DhtText.get().databaseRequired);

if (getReaderOptions() == null)
setReaderOptions(new DhtReaderOptions());
if (getInserterOptions() == null)
setInserterOptions(new DhtInserterOptions());

if (getRepositoryKey() == null) {
if (getRepositoryName() == null)
throw new IllegalArgumentException(DhtText.get().nameRequired);

RepositoryKey r;
try {
r = getDatabase().repositoryIndex().get(
RepositoryName.create(name));
} catch (TimeoutException e) {
throw new DhtTimeoutException(MessageFormat.format(
DhtText.get().timeoutLocatingRepository, name), e);
}
if (isMustExist() && r == null)
throw new RepositoryNotFoundException(getRepositoryName());
if (r != null)
setRepositoryKey(r);
}
return self();
}

@Override
@SuppressWarnings("unchecked")
public R build() throws IllegalArgumentException, DhtException,
RepositoryNotFoundException {
return (R) new DhtRepository(setup());
}

// We don't support local file IO and thus shouldn't permit these to set.

@Override
public B setGitDir(File gitDir) {
if (gitDir != null)
throw new IllegalArgumentException();
return self();
}

@Override
public B setObjectDirectory(File objectDirectory) {
if (objectDirectory != null)
throw new IllegalArgumentException();
return self();
}

@Override
public B addAlternateObjectDirectory(File other) {
throw new UnsupportedOperationException("Alternates not supported");
}

@Override
public B setWorkTree(File workTree) {
if (workTree != null)
throw new IllegalArgumentException();
return self();
}

@Override
public B setIndexFile(File indexFile) {
if (indexFile != null)
throw new IllegalArgumentException();
return self();
}
}

+ 0
- 88
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtText.java View File

@@ -1,88 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import org.eclipse.jgit.nls.NLS;
import org.eclipse.jgit.nls.TranslationBundle;

/** Translation bundle for the DHT storage provider. */
public class DhtText extends TranslationBundle {
/** @return an instance of this translation bundle. */
public static DhtText get() {
return NLS.getBundleFor(DhtText.class);
}

/***/ public String cannotInsertObject;
/***/ public String corruptChunk;
/***/ public String corruptCompressedObject;
/***/ public String cycleInDeltaChain;
/***/ public String databaseRequired;
/***/ public String expectedObjectSizeDuringCopyAsIs;
/***/ public String invalidCachedPackInfo;
/***/ public String invalidChunkKey;
/***/ public String invalidChunkMeta;
/***/ public String invalidObjectIndexKey;
/***/ public String invalidObjectInfo;
/***/ public String invalidRefData;
/***/ public String missingChunk;
/***/ public String missingLongOffsetBase;
/***/ public String nameRequired;
/***/ public String noSavedTypeForBase;
/***/ public String notTimeUnit;
/***/ public String objectListSelectingName;
/***/ public String objectListCountingFrom;
/***/ public String objectTypeUnknown;
/***/ public String packParserInvalidPointer;
/***/ public String packParserRollbackFailed;
/***/ public String recordingObjects;
/***/ public String repositoryAlreadyExists;
/***/ public String repositoryMustBeBare;
/***/ public String shortCompressedObject;
/***/ public String timeoutChunkMeta;
/***/ public String timeoutLocatingRepository;
/***/ public String tooManyObjectsInPack;
/***/ public String unsupportedChunkIndex;
/***/ public String unsupportedObjectTypeInChunk;
/***/ public String wrongChunkPositionInCachedPack;
}

+ 0
- 85
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/DhtTimeoutException.java View File

@@ -1,85 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.util.concurrent.TimeoutException;

import org.eclipse.jgit.storage.dht.spi.Database;

/** Any error caused by a {@link Database} operation. */
public class DhtTimeoutException extends DhtException {
private static final long serialVersionUID = 1L;

/**
* @param message
*/
public DhtTimeoutException(String message) {
super(message);
}

/**
* @param message
* @param cause
*/
public DhtTimeoutException(String message, TimeoutException cause) {
super(message);
initCause(cause);
}

/**
* @param cause
*/
public DhtTimeoutException(TimeoutException cause) {
super(cause.getMessage());
initCause(cause);
}

/**
* @param cause
*/
public DhtTimeoutException(InterruptedException cause) {
super(cause.getMessage());
initCause(cause);
}
}

+ 0
- 83
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/KeyUtils.java View File

@@ -1,83 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import org.eclipse.jgit.util.RawParseUtils;

final class KeyUtils {
static short parse16(byte[] src, int pos) {
return (short) RawParseUtils.parseHexInt16(src, pos);
}

static int parse32(byte[] src, int pos) {
return RawParseUtils.parseHexInt32(src, pos);
}

static void format16(byte[] dst, int p, short w) {
int o = p + 3;
while (o >= p && w != 0) {
dst[o--] = hexbyte[w & 0xf];
w >>>= 4;
}
while (o >= p)
dst[o--] = '0';
}

static void format32(byte[] dst, int p, int w) {
int o = p + 7;
while (o >= p && w != 0) {
dst[o--] = hexbyte[w & 0xf];
w >>>= 4;
}
while (o >= p)
dst[o--] = '0';
}

private static final byte[] hexbyte = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

private KeyUtils() {
// Do not create instances of this class.
}
}

+ 0
- 160
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/LargeNonDeltaObject.java View File

@@ -1,160 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.InflaterInputStream;

import org.eclipse.jgit.errors.LargeObjectException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.ObjectStream;

/** Loader for a large non-delta object. */
class LargeNonDeltaObject extends ObjectLoader {
private final int type;

private final long sz;

private final int pos;

private final DhtReader ctx;

private final ChunkMeta meta;

private PackChunk firstChunk;

LargeNonDeltaObject(int type, long sz, PackChunk pc, int pos, DhtReader ctx) {
this.type = type;
this.sz = sz;
this.pos = pos;
this.ctx = ctx;
this.meta = pc.getMeta();
firstChunk = pc;
}

@Override
public boolean isLarge() {
return true;
}

@Override
public byte[] getCachedBytes() throws LargeObjectException {
throw new LargeObjectException.ExceedsByteArrayLimit();
}

@Override
public int getType() {
return type;
}

@Override
public long getSize() {
return sz;
}

@Override
public ObjectStream openStream() throws MissingObjectException, IOException {
PackChunk pc = firstChunk;
if (pc != null)
firstChunk = null;
else
pc = ctx.getChunk(ChunkKey.fromString(meta.getFragment(0)));

InputStream in = new ChunkInputStream(meta, ctx, pos, pc);
in = new BufferedInputStream(new InflaterInputStream(in), 8192);
return new ObjectStream.Filter(type, sz, in);
}

private static class ChunkInputStream extends InputStream {
private final ChunkMeta meta;

private final DhtReader ctx;

private int ptr;

private PackChunk pc;

private int fragment;

ChunkInputStream(ChunkMeta meta, DhtReader ctx, int pos, PackChunk pc) {
this.ctx = ctx;
this.meta = meta;
this.ptr = pos;
this.pc = pc;
}

@Override
public int read(byte[] dstbuf, int dstptr, int dstlen)
throws IOException {
if (0 == dstlen)
return 0;

int n = pc.read(ptr, dstbuf, dstptr, dstlen);
if (n == 0) {
if (fragment == meta.getFragmentCount())
return -1;

pc = ctx.getChunk(ChunkKey.fromString(
meta.getFragment(++fragment)));
ptr = 0;
n = pc.read(ptr, dstbuf, dstptr, dstlen);
if (n == 0)
return -1;
}
ptr += n;
return n;
}

@Override
public int read() throws IOException {
byte[] tmp = new byte[1];
int n = read(tmp, 0, 1);
return n == 1 ? tmp[0] & 0xff : -1;
}
}
}

+ 0
- 123
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ObjectIndexKey.java View File

@@ -1,123 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.eclipse.jgit.storage.dht.KeyUtils.format32;
import static org.eclipse.jgit.storage.dht.KeyUtils.parse32;
import static org.eclipse.jgit.util.RawParseUtils.decode;

import java.text.MessageFormat;

import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;

/** Identifies an ObjectId in the DHT. */
public final class ObjectIndexKey extends ObjectId implements RowKey {
private static final int KEYLEN = 49;

/**
* @param repo
* @param objId
* @return the key
*/
public static ObjectIndexKey create(RepositoryKey repo, AnyObjectId objId) {
return new ObjectIndexKey(repo.asInt(), objId);
}

/**
* @param key
* @return the key
*/
public static ObjectIndexKey fromBytes(byte[] key) {
if (key.length != KEYLEN)
throw new IllegalArgumentException(MessageFormat.format(
DhtText.get().invalidChunkKey, decode(key)));

int repo = parse32(key, 0);
ObjectId id = ObjectId.fromString(key, 9);
return new ObjectIndexKey(repo, id);
}

/**
* @param key
* @return the key
*/
public static ObjectIndexKey fromString(String key) {
return fromBytes(Constants.encodeASCII(key));
}

private final int repo;

ObjectIndexKey(int repo, AnyObjectId objId) {
super(objId);
this.repo = repo;
}

/** @return the repository that contains the object. */
public RepositoryKey getRepositoryKey() {
return RepositoryKey.fromInt(repo);
}

int getRepositoryId() {
return repo;
}

public byte[] asBytes() {
byte[] r = new byte[KEYLEN];
format32(r, 0, repo);
r[8] = '.';
copyTo(r, 9);
return r;
}

public String asString() {
return decode(asBytes());
}

@Override
public String toString() {
return "object-index:" + asString();
}
}

+ 0
- 169
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ObjectInfo.java View File

@@ -1,169 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import org.eclipse.jgit.generated.storage.dht.proto.GitStore;
import org.eclipse.jgit.lib.ObjectId;

/** Connects an object to the chunk it is stored in. */
public class ObjectInfo {
/** Orders ObjectInfo by their time member, oldest first. */
public static final Comparator<ObjectInfo> BY_TIME = new Comparator<ObjectInfo>() {
public int compare(ObjectInfo a, ObjectInfo b) {
return Long.signum(a.getTime() - b.getTime());
}
};

/**
* Sort the info list according to time, oldest member first.
*
* @param toSort
* list to sort.
*/
public static void sort(List<ObjectInfo> toSort) {
Collections.sort(toSort, BY_TIME);
}

private final ChunkKey chunk;

private final long time;

private final GitStore.ObjectInfo data;

/**
* Wrap an ObjectInfo from the storage system.
*
* @param chunkKey
* the chunk the object points to.
* @param data
* the data of the ObjectInfo.
*/
public ObjectInfo(ChunkKey chunkKey, GitStore.ObjectInfo data) {
this.chunk = chunkKey;
this.time = 0;
this.data = data;
}

/**
* Wrap an ObjectInfo from the storage system.
*
* @param chunkKey
* the chunk the object points to.
* @param time
* timestamp of the ObjectInfo.
* @param data
* the data of the ObjectInfo.
*/
public ObjectInfo(ChunkKey chunkKey, long time, GitStore.ObjectInfo data) {
this.chunk = chunkKey;
this.time = time < 0 ? 0 : time;
this.data = data;
}

/** @return the chunk this link points to. */
public ChunkKey getChunkKey() {
return chunk;
}

/** @return approximate time the object was created, in milliseconds. */
public long getTime() {
return time;
}

/** @return GitStore.ObjectInfo to embed in the database. */
public GitStore.ObjectInfo getData() {
return data;
}

/** @return type of the object, in OBJ_* constants. */
public int getType() {
return data.getObjectType().getNumber();
}

/** @return size of the object when fully inflated. */
public long getSize() {
return data.getInflatedSize();
}

/** @return true if the object storage uses delta compression. */
public boolean isDelta() {
return data.hasDeltaBase();
}

/** @return true if the object has been fragmented across chunks. */
public boolean isFragmented() {
return data.getIsFragmented();
}

int getOffset() {
return data.getOffset();
}

long getPackedSize() {
return data.getPackedSize();
}

ObjectId getDeltaBase() {
if (data.hasDeltaBase())
return ObjectId.fromRaw(data.getDeltaBase().toByteArray(), 0);
return null;
}

@Override
public String toString() {
StringBuilder b = new StringBuilder();
b.append("ObjectInfo:");
b.append(chunk);
if (0 < time)
b.append(" @ ").append(new Date(time));
b.append("\n");
b.append(data.toString());
return b.toString();
}
}

+ 0
- 255
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/ObjectWriter.java View File

@@ -1,255 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicReference;

import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta;
import org.eclipse.jgit.storage.dht.spi.Context;
import org.eclipse.jgit.util.BlockList;

/**
* Re-orders objects destined for a pack stream by chunk locality.
* <p>
* By re-ordering objects according to chunk locality, and then the original
* order the PackWriter intended to use, objects can be copied quickly from
* chunks, and each chunk is visited at most once. A {@link Prefetcher} for the
* {@link DhtReader} is used to fetch chunks in the order they will be used,
* improving throughput by reducing the number of round-trips required to the
* storage system.
*/
final class ObjectWriter {
private final DhtReader ctx;

private final Prefetcher prefetch;

private final int batchSize;

private final Semaphore metaBatches;

private final AtomicReference<DhtException> metaError;

private final LinkedHashMap<ChunkKey, Integer> allVisits;

private final Map<ChunkKey, ChunkMeta> allMeta;

private final Set<ChunkKey> metaMissing;

private Set<ChunkKey> metaToRead;

private int curVisit;

ObjectWriter(DhtReader ctx, Prefetcher prefetch) {
this.ctx = ctx;
this.prefetch = prefetch;

batchSize = ctx.getOptions().getObjectIndexBatchSize();
metaBatches = new Semaphore(batchSize);
metaError = new AtomicReference<DhtException>();

allVisits = new LinkedHashMap<ChunkKey, Integer>();
allMeta = new HashMap<ChunkKey, ChunkMeta>();
metaMissing = new HashSet<ChunkKey>();
metaToRead = new HashSet<ChunkKey>();
curVisit = 1;
}

void plan(List<DhtObjectToPack> list) throws DhtException {
try {
for (DhtObjectToPack obj : list)
visit(obj);

if (!metaToRead.isEmpty())
startBatch(Context.FAST_MISSING_OK);
awaitPendingBatches();

synchronized (metaMissing) {
if (!metaMissing.isEmpty()) {
metaBatches.release(batchSize);
resolveMissing();
awaitPendingBatches();
}
}
} catch (InterruptedException err) {
throw new DhtTimeoutException(err);
}

Iterable<ChunkKey> order;
synchronized (allMeta) {
if (allMeta.isEmpty()) {
order = allVisits.keySet();
} else {
BlockList<ChunkKey> keys = new BlockList<ChunkKey>();
for (ChunkKey key : allVisits.keySet()) {
keys.add(key);

ChunkMeta meta = allMeta.remove(key);
if (meta != null) {
for (int i = 1; i < meta.getFragmentCount(); i++)
keys.add(ChunkKey.fromString(meta.getFragment(i)));
}
}
order = keys;
}
}
prefetch.push(order);

Collections.sort(list, new Comparator<DhtObjectToPack>() {
public int compare(DhtObjectToPack a, DhtObjectToPack b) {
return a.visitOrder - b.visitOrder;
}
});
}

private void visit(DhtObjectToPack obj) throws InterruptedException,
DhtTimeoutException {
// Plan the visit to the delta base before the object. This
// ensures the base is in the stream first, and OFS_DELTA can
// be used for the delta.
//
DhtObjectToPack base = (DhtObjectToPack) obj.getDeltaBase();
if (base != null && base.visitOrder == 0) {
// Use the current visit, even if its wrong. This will
// prevent infinite recursion when there is a cycle in the
// delta chain. Cycles are broken during writing, not in
// the earlier planning phases.
//
obj.visitOrder = curVisit;
visit(base);
}

ChunkKey key = obj.chunk;
if (key != null) {
Integer i = allVisits.get(key);
if (i == null) {
i = Integer.valueOf(1 + allVisits.size());
allVisits.put(key, i);
}
curVisit = i.intValue();
}

if (obj.isFragmented()) {
metaToRead.add(key);
if (metaToRead.size() == batchSize)
startBatch(Context.FAST_MISSING_OK);
}
obj.visitOrder = curVisit;
}

private void resolveMissing() throws DhtTimeoutException,
InterruptedException {
metaToRead = new HashSet<ChunkKey>();
for (ChunkKey key : metaMissing) {
metaToRead.add(key);
if (metaToRead.size() == batchSize)
startBatch(Context.LOCAL);
}
if (!metaToRead.isEmpty())
startBatch(Context.LOCAL);
}

private void startBatch(Context context) throws InterruptedException,
DhtTimeoutException {
Timeout to = ctx.getOptions().getTimeout();
if (!metaBatches.tryAcquire(1, to.getTime(), to.getUnit()))
throw new DhtTimeoutException(DhtText.get().timeoutChunkMeta);

Set<ChunkKey> keys = metaToRead;
ctx.getDatabase().chunk().getMeta(
context,
keys,
new MetaLoader(context, keys));
metaToRead = new HashSet<ChunkKey>();
}

private void awaitPendingBatches() throws InterruptedException,
DhtTimeoutException, DhtException {
Timeout to = ctx.getOptions().getTimeout();
if (!metaBatches.tryAcquire(batchSize, to.getTime(), to.getUnit()))
throw new DhtTimeoutException(DhtText.get().timeoutChunkMeta);
if (metaError.get() != null)
throw metaError.get();
}

private class MetaLoader implements AsyncCallback<Map<ChunkKey, ChunkMeta>> {
private final Context context;

private final Set<ChunkKey> keys;

MetaLoader(Context context, Set<ChunkKey> keys) {
this.context = context;
this.keys = keys;
}

public void onSuccess(Map<ChunkKey, ChunkMeta> result) {
try {
synchronized (allMeta) {
allMeta.putAll(result);
keys.removeAll(result.keySet());
}
if (context == Context.FAST_MISSING_OK && !keys.isEmpty()) {
synchronized (metaMissing) {
metaMissing.addAll(keys);
}
}
} finally {
metaBatches.release(1);
}
}

public void onFailure(DhtException error) {
metaError.compareAndSet(null, error);
metaBatches.release(1);
}
}
}

+ 0
- 191
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/OpenQueue.java View File

@@ -1,191 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.eclipse.jgit.storage.dht;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.AsyncObjectLoaderQueue;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.ObjectReader;

/**
* Locates objects in large batches, then opens them clustered by chunk.
* <p>
* To simplify the implementation this method performs lookups for the
* {@link ObjectInfo} in large batches, clusters those by ChunkKey, and loads
* the chunks with a {@link Prefetcher}.
* <p>
* The lookup queue is completely spun out during the first invocation of
* {@link #next()}, ensuring all chunks are known before any single chunk is
* accessed. This is necessary to improve access locality and prevent thrashing
* of the local ChunkCache. It also causes {@link MissingObjectException} to be
* thrown at the start of traversal, until the lookup queue is exhausted.
*
* @param <T>
* type of object to associate with the loader.
*/
final class OpenQueue<T extends ObjectId> extends QueueObjectLookup<T>
implements AsyncObjectLoaderQueue<T> {
private Map<ChunkKey, Collection<ObjectWithInfo<T>>> byChunk;

private Iterator<Collection<ObjectWithInfo<T>>> chunkItr;

private Iterator<ObjectWithInfo<T>> objectItr;

private Prefetcher prefetcher;

private ObjectWithInfo<T> current;

private PackChunk currChunk;

OpenQueue(DhtReader reader, Iterable<T> objectIds, boolean reportMissing) {
super(reader, reportMissing);
setCacheLoadedInfo(true);
setNeedChunkOnly(true);
init(objectIds);

byChunk = new LinkedHashMap<ChunkKey, Collection<ObjectWithInfo<T>>>();
objectItr = Collections.<ObjectWithInfo<T>> emptyList().iterator();
}

public boolean next() throws MissingObjectException, IOException {
if (chunkItr == null)
init();

if (!objectItr.hasNext()) {
currChunk = null;
if (!chunkItr.hasNext()) {
release();
return false;
}
objectItr = chunkItr.next().iterator();
}

current = objectItr.next();
return true;
}

public T getCurrent() {
return current.object;
}

public ObjectId getObjectId() {
return getCurrent();
}

public ObjectLoader open() throws IOException {
ChunkKey chunkKey = current.chunkKey;

// Objects returned by the queue are clustered by chunk. This object
// is either in the current chunk, or are the next chunk ready on the
// prefetcher. Anything else is a programming error.
//
PackChunk chunk;
if (currChunk != null && chunkKey.equals(currChunk.getChunkKey()))
chunk = currChunk;
else {
chunk = prefetcher.get(chunkKey);
if (chunk == null)
throw new DhtMissingChunkException(chunkKey);
currChunk = chunk;
reader.recentChunk(chunk);
}

if (current.info != null) {
int ptr = current.info.getOffset();
int type = current.info.getType();
return PackChunk.read(chunk, ptr, reader, type);
} else {
int ptr = chunk.findOffset(repo, current.object);
if (ptr < 0)
throw DhtReader.missing(current.object, ObjectReader.OBJ_ANY);
return PackChunk.read(chunk, ptr, reader, ObjectReader.OBJ_ANY);
}
}

@Override
public boolean cancel(boolean mayInterruptIfRunning) {
release();
return true;
}

@Override
public void release() {
reader.getRecentChunks().setMaxBytes(reader.getOptions().getChunkLimit());
prefetcher = null;
currChunk = null;
}

private void init() throws IOException {
ObjectWithInfo<T> c;

while ((c = nextObjectWithInfo()) != null) {
ChunkKey chunkKey = c.chunkKey;
Collection<ObjectWithInfo<T>> list = byChunk.get(chunkKey);
if (list == null) {
list = new ArrayList<ObjectWithInfo<T>>();
byChunk.put(chunkKey, list);

if (prefetcher == null) {
int limit = reader.getOptions().getChunkLimit();
int ratio = reader.getOptions().getOpenQueuePrefetchRatio();
int prefetchLimit = (int) (limit * (ratio / 100.0));
reader.getRecentChunks().setMaxBytes(limit - prefetchLimit);
prefetcher = new Prefetcher(reader, 0, prefetchLimit);
}
prefetcher.push(chunkKey);
}
list.add(c);
}

chunkItr = byChunk.values().iterator();
}
}

+ 0
- 795
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/PackChunk.java View File

@@ -1,795 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.eclipse.jgit.lib.Constants.OBJ_BAD;
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT;
import static org.eclipse.jgit.lib.Constants.OBJ_OFS_DELTA;
import static org.eclipse.jgit.lib.Constants.OBJ_REF_DELTA;
import static org.eclipse.jgit.lib.Constants.OBJ_TAG;
import static org.eclipse.jgit.lib.Constants.OBJ_TREE;
import static org.eclipse.jgit.lib.Constants.newMessageDigest;
import static org.eclipse.jgit.storage.dht.ChunkFormatter.TRAILER_SIZE;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.text.MessageFormat;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;

import org.eclipse.jgit.errors.CorruptObjectException;
import org.eclipse.jgit.errors.LargeObjectException;
import org.eclipse.jgit.errors.StoredObjectRepresentationNotAvailableException;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.storage.pack.BinaryDelta;
import org.eclipse.jgit.storage.pack.PackOutputStream;
import org.eclipse.jgit.transport.PackParser;

/**
* Chunk of object data, stored under a {@link ChunkKey}.
* <p>
* A chunk typically contains thousands of objects, compressed in the Git native
* pack file format. Its associated {@link ChunkIndex} provides offsets for each
* object's header and compressed data.
* <p>
* Chunks (and their indexes) are opaque binary blobs meant only to be read by
* the Git implementation.
*/
public final class PackChunk {
/** Constructs a {@link PackChunk} while reading from the DHT. */
public static class Members {
private ChunkKey chunkKey;

private byte[] dataBuf;

private int dataPtr;

private int dataLen;

private byte[] indexBuf;

private int indexPtr;

private int indexLen;

private ChunkMeta meta;

/** @return the chunk key. Never null. */
public ChunkKey getChunkKey() {
return chunkKey;
}

/**
* @param key
* @return {@code this}
*/
public Members setChunkKey(ChunkKey key) {
this.chunkKey = key;
return this;
}

/** @return true if there is chunk data present. */
public boolean hasChunkData() {
return dataBuf != null;
}

/** @return the chunk data, or null if not available. */
public byte[] getChunkData() {
return asArray(dataBuf, dataPtr, dataLen);
}

/** @return the chunk data, or null if not available. */
public ByteBuffer getChunkDataAsByteBuffer() {
return asByteBuffer(dataBuf, dataPtr, dataLen);
}

private static byte[] asArray(byte[] buf, int ptr, int len) {
if (buf == null)
return null;
if (ptr == 0 && buf.length == len)
return buf;
byte[] r = new byte[len];
System.arraycopy(buf, ptr, r, 0, len);
return r;
}

private static ByteBuffer asByteBuffer(byte[] buf, int ptr, int len) {
return buf != null ? ByteBuffer.wrap(buf, ptr, len) : null;
}

/**
* @param chunkData
* @return {@code this}
*/
public Members setChunkData(byte[] chunkData) {
return setChunkData(chunkData, 0, chunkData.length);
}

/**
* @param chunkData
* @param ptr
* @param len
* @return {@code this}
*/
public Members setChunkData(byte[] chunkData, int ptr, int len) {
this.dataBuf = chunkData;
this.dataPtr = ptr;
this.dataLen = len;
return this;
}

/** @return true if there is a chunk index present. */
public boolean hasChunkIndex() {
return indexBuf != null;
}

/** @return the chunk index, or null if not available. */
public byte[] getChunkIndex() {
return asArray(indexBuf, indexPtr, indexLen);
}

/** @return the chunk index, or null if not available. */
public ByteBuffer getChunkIndexAsByteBuffer() {
return asByteBuffer(indexBuf, indexPtr, indexLen);
}

/**
* @param chunkIndex
* @return {@code this}
*/
public Members setChunkIndex(byte[] chunkIndex) {
return setChunkIndex(chunkIndex, 0, chunkIndex.length);
}

/**
* @param chunkIndex
* @param ptr
* @param len
* @return {@code this}
*/
public Members setChunkIndex(byte[] chunkIndex, int ptr, int len) {
this.indexBuf = chunkIndex;
this.indexPtr = ptr;
this.indexLen = len;
return this;
}

/** @return true if there is meta information present. */
public boolean hasMeta() {
return meta != null;
}

/** @return the inline meta data, or null if not available. */
public ChunkMeta getMeta() {
return meta;
}

/**
* @param meta
* @return {@code this}
*/
public Members setMeta(ChunkMeta meta) {
this.meta = meta;
return this;
}

/**
* @return the PackChunk instance.
* @throws DhtException
* if early validation indicates the chunk data is corrupt
* or not recognized by this version of the library.
*/
public PackChunk build() throws DhtException {
ChunkIndex i;
if (indexBuf != null)
i = ChunkIndex.fromBytes(chunkKey, indexBuf, indexPtr, indexLen);
else
i = null;

return new PackChunk(chunkKey, dataBuf, dataPtr, dataLen, i, meta);
}
}

private static final int INFLATE_STRIDE = 512;

private final ChunkKey key;

private final byte[] dataBuf;

private final int dataPtr;

private final int dataLen;

private final ChunkIndex index;

private final ChunkMeta meta;

private volatile Boolean valid;

PackChunk(ChunkKey key, byte[] dataBuf, int dataPtr, int dataLen,
ChunkIndex index, ChunkMeta meta) {
this.key = key;
this.dataBuf = dataBuf;
this.dataPtr = dataPtr;
this.dataLen = dataLen;
this.index = index;
this.meta = meta;
}

/** @return unique name of this chunk in the database. */
public ChunkKey getChunkKey() {
return key;
}

/** @return index describing the objects stored within this chunk. */
public ChunkIndex getIndex() {
return index;
}

/** @return inline meta information, or null if no data was necessary. */
public ChunkMeta getMeta() {
return meta;
}

@Override
public String toString() {
return "PackChunk[" + getChunkKey() + "]";
}

boolean hasIndex() {
return index != null;
}

boolean isFragment() {
return meta != null && 0 < meta.getFragmentCount();
}

int findOffset(RepositoryKey repo, AnyObjectId objId) {
if (key.getRepositoryId() == repo.asInt() && index != null)
return index.findOffset(objId);
return -1;
}

boolean contains(RepositoryKey repo, AnyObjectId objId) {
return 0 <= findOffset(repo, objId);
}

static ObjectLoader read(PackChunk pc, int pos, final DhtReader ctx,
final int typeHint) throws IOException {
try {
return read1(pc, pos, ctx, typeHint, true /* use recentChunks */);
} catch (DeltaChainCycleException cycleFound) {
// A cycle can occur if recentChunks cache was used by the reader
// to satisfy an OBJ_REF_DELTA, but the chunk that was chosen has
// a reverse delta back onto an object already being read during
// this invocation. Its not as uncommon as it sounds, as the Git
// wire protocol can sometimes copy an object the repository already
// has when dealing with reverts or cherry-picks.
//
// Work around the cycle by disabling the recentChunks cache for
// this resolution only. This will force the DhtReader to re-read
// OBJECT_INDEX and consider only the oldest chunk for any given
// object. There cannot be a cycle if the method only walks along
// the oldest chunks.
try {
ctx.getStatistics().deltaChainCycles++;
return read1(pc, pos, ctx, typeHint, false /* no recentChunks */);
} catch (DeltaChainCycleException cannotRecover) {
throw new DhtException(MessageFormat.format(
DhtText.get().cycleInDeltaChain, pc.getChunkKey(),
Integer.valueOf(pos)));
}
}
}

@SuppressWarnings("null")
private static ObjectLoader read1(PackChunk pc, int pos,
final DhtReader ctx, final int typeHint, final boolean recent)
throws IOException, DeltaChainCycleException {
try {
Delta delta = null;
byte[] data = null;
int type = OBJ_BAD;
boolean cached = false;

SEARCH: for (;;) {
final byte[] dataBuf = pc.dataBuf;
final int dataPtr = pc.dataPtr;
final int posPtr = dataPtr + pos;
int c = dataBuf[posPtr] & 0xff;
int typeCode = (c >> 4) & 7;
long sz = c & 15;
int shift = 4;
int p = 1;
while ((c & 0x80) != 0) {
c = dataBuf[posPtr + p++] & 0xff;
sz += ((long) (c & 0x7f)) << shift;
shift += 7;
}

switch (typeCode) {
case OBJ_COMMIT:
case OBJ_TREE:
case OBJ_BLOB:
case OBJ_TAG: {
if (delta != null) {
data = inflate(sz, pc, pos + p, ctx);
type = typeCode;
break SEARCH;
}

if (sz < Integer.MAX_VALUE && !pc.isFragment()) {
try {
data = pc.inflateOne(sz, pos + p, ctx);
return new ObjectLoader.SmallObject(typeCode, data);
} catch (LargeObjectException tooBig) {
// Fall through and stream.
}
}

return new LargeNonDeltaObject(typeCode, sz, pc, pos + p, ctx);
}

case OBJ_OFS_DELTA: {
c = dataBuf[posPtr + p++] & 0xff;
long base = c & 127;
while ((c & 128) != 0) {
base += 1;
c = dataBuf[posPtr + p++] & 0xff;
base <<= 7;
base += (c & 127);
}

ChunkKey baseChunkKey;
int basePosInChunk;

if (base <= pos) {
// Base occurs in the same chunk, just earlier.
baseChunkKey = pc.getChunkKey();
basePosInChunk = pos - (int) base;
} else {
// Long offset delta, base occurs in another chunk.
// Adjust distance to be from our chunk start.
base = base - pos;

ChunkMeta.BaseChunk baseChunk;
baseChunk = ChunkMetaUtil.getBaseChunk(
pc.key,
pc.meta,
base);
baseChunkKey = ChunkKey.fromString(baseChunk.getChunkKey());
basePosInChunk = (int) (baseChunk.getRelativeStart() - base);
}

delta = new Delta(delta, //
pc.key, pos, (int) sz, p, //
baseChunkKey, basePosInChunk);
if (sz != delta.deltaSize)
break SEARCH;

DeltaBaseCache.Entry e = delta.getBase(ctx);
if (e != null) {
type = e.type;
data = e.data;
cached = true;
break SEARCH;
}
if (baseChunkKey != pc.getChunkKey())
pc = ctx.getChunk(baseChunkKey);
pos = basePosInChunk;
continue SEARCH;
}

case OBJ_REF_DELTA: {
ObjectId id = ObjectId.fromRaw(dataBuf, posPtr + p);
PackChunk nc = pc;
int base = pc.index.findOffset(id);
if (base < 0) {
DhtReader.ChunkAndOffset n;
n = ctx.getChunk(id, typeHint, recent);
nc = n.chunk;
base = n.offset;
}
checkCycle(delta, pc.key, pos);
delta = new Delta(delta, //
pc.key, pos, (int) sz, p + 20, //
nc.getChunkKey(), base);
if (sz != delta.deltaSize)
break SEARCH;

DeltaBaseCache.Entry e = delta.getBase(ctx);
if (e != null) {
type = e.type;
data = e.data;
cached = true;
break SEARCH;
}
pc = nc;
pos = base;
continue SEARCH;
}

default:
throw new DhtException(MessageFormat.format(
DhtText.get().unsupportedObjectTypeInChunk, //
Integer.valueOf(typeCode), //
pc.getChunkKey(), //
Integer.valueOf(pos)));
}
}

// At this point there is at least one delta to apply to data.
// (Whole objects with no deltas to apply return early above.)

do {
if (!delta.deltaChunk.equals(pc.getChunkKey()))
pc = ctx.getChunk(delta.deltaChunk);
pos = delta.deltaPos;

// Cache only the base immediately before desired object.
if (cached)
cached = false;
else if (delta.next == null)
delta.putBase(ctx, type, data);

final byte[] cmds = delta.decompress(pc, ctx);
final long sz = BinaryDelta.getResultSize(cmds);
final byte[] result = newResult(sz);
BinaryDelta.apply(data, cmds, result);
data = result;
delta = delta.next;
} while (delta != null);

return new ObjectLoader.SmallObject(type, data);

} catch (DataFormatException dfe) {
CorruptObjectException coe = new CorruptObjectException(
MessageFormat.format(DhtText.get().corruptCompressedObject,
pc.getChunkKey(), Integer.valueOf(pos)));
coe.initCause(dfe);
throw coe;
}
}

private static byte[] inflate(long sz, PackChunk pc, int pos,
DhtReader reader) throws DataFormatException, DhtException {
if (pc.isFragment())
return inflateFragment(sz, pc, pos, reader);
return pc.inflateOne(sz, pos, reader);
}

private byte[] inflateOne(long sz, int pos, DhtReader reader)
throws DataFormatException {
// Because the chunk ends in a 4 byte CRC, there is always
// more data available for input than the inflater needs.
// This also helps with an optimization in libz where it
// wants at least 1 extra byte of input beyond the end.

final byte[] dstbuf = newResult(sz);
final Inflater inf = reader.inflater();
final int offset = pos;
int dstoff = 0;

int bs = Math.min(dataLen - pos, INFLATE_STRIDE);
inf.setInput(dataBuf, dataPtr + pos, bs);
pos += bs;

while (dstoff < dstbuf.length) {
int n = inf.inflate(dstbuf, dstoff, dstbuf.length - dstoff);
if (n == 0) {
if (inf.needsInput()) {
bs = Math.min(dataLen - pos, INFLATE_STRIDE);
inf.setInput(dataBuf, dataPtr + pos, bs);
pos += bs;
continue;
}
break;
}
dstoff += n;
}

if (dstoff != sz) {
throw new DataFormatException(MessageFormat.format(
DhtText.get().shortCompressedObject,
getChunkKey(),
Integer.valueOf(offset)));
}
return dstbuf;
}

private static byte[] inflateFragment(long sz, PackChunk pc, final int pos,
DhtReader reader) throws DataFormatException, DhtException {
byte[] dstbuf = newResult(sz);
int dstoff = 0;

final Inflater inf = reader.inflater();
final ChunkMeta meta = pc.meta;
int nextChunk = 1;

int bs = pc.dataLen - pos - TRAILER_SIZE;
inf.setInput(pc.dataBuf, pc.dataPtr + pos, bs);

while (dstoff < dstbuf.length) {
int n = inf.inflate(dstbuf, dstoff, dstbuf.length - dstoff);
if (n == 0) {
if (inf.needsInput()) {
if (meta.getFragmentCount() <= nextChunk)
break;
pc = reader.getChunk(ChunkKey.fromString(
meta.getFragment(nextChunk++)));
if (meta.getFragmentCount() == nextChunk)
bs = pc.dataLen; // Include trailer on last chunk.
else
bs = pc.dataLen - TRAILER_SIZE;
inf.setInput(pc.dataBuf, pc.dataPtr, bs);
continue;
}
break;
}
dstoff += n;
}

if (dstoff != sz) {
throw new DataFormatException(MessageFormat.format(
DhtText.get().shortCompressedObject,
ChunkKey.fromString(meta.getFragment(0)),
Integer.valueOf(pos)));
}
return dstbuf;
}

private static byte[] newResult(long sz) {
if (Integer.MAX_VALUE < sz)
throw new LargeObjectException.ExceedsByteArrayLimit();
try {
return new byte[(int) sz];
} catch (OutOfMemoryError noMemory) {
throw new LargeObjectException.OutOfMemory(noMemory);
}
}

int readObjectTypeAndSize(int ptr, PackParser.ObjectTypeAndSize info) {
ptr += dataPtr;

int c = dataBuf[ptr++] & 0xff;
int typeCode = (c >> 4) & 7;
long sz = c & 15;
int shift = 4;
while ((c & 0x80) != 0) {
c = dataBuf[ptr++] & 0xff;
sz += ((long) (c & 0x7f)) << shift;
shift += 7;
}

switch (typeCode) {
case OBJ_OFS_DELTA:
c = dataBuf[ptr++] & 0xff;
while ((c & 128) != 0)
c = dataBuf[ptr++] & 0xff;
break;

case OBJ_REF_DELTA:
ptr += 20;
break;
}

info.type = typeCode;
info.size = sz;
return ptr - dataPtr;
}

int read(int ptr, byte[] dst, int dstPos, int cnt) {
// Do not allow readers to read the CRC-32 from the tail.
int n = Math.min(cnt, (dataLen - TRAILER_SIZE) - ptr);
System.arraycopy(dataBuf, dataPtr + ptr, dst, dstPos, n);
return n;
}

void copyObjectAsIs(PackOutputStream out, DhtObjectToPack obj,
boolean validate, DhtReader ctx) throws IOException,
StoredObjectRepresentationNotAvailableException {
if (validate && !isValid()) {
StoredObjectRepresentationNotAvailableException gone;

gone = new StoredObjectRepresentationNotAvailableException(obj);
gone.initCause(new DhtException(MessageFormat.format(
DhtText.get().corruptChunk, getChunkKey())));
throw gone;
}

int ptr = dataPtr + obj.offset;
int c = dataBuf[ptr++] & 0xff;
int typeCode = (c >> 4) & 7;
long inflatedSize = c & 15;
int shift = 4;
while ((c & 0x80) != 0) {
c = dataBuf[ptr++] & 0xff;
inflatedSize += ((long) (c & 0x7f)) << shift;
shift += 7;
}

switch (typeCode) {
case OBJ_OFS_DELTA:
do {
c = dataBuf[ptr++] & 0xff;
} while ((c & 128) != 0);
break;

case OBJ_REF_DELTA:
ptr += 20;
break;
}

// If the size is positive, its accurate. If its -1, this is a
// fragmented object that will need more handling below,
// so copy all of the chunk, minus the trailer.

final int maxAvail = (dataLen - TRAILER_SIZE) - (ptr - dataPtr);
final int copyLen;
if (0 < obj.size)
copyLen = Math.min(obj.size, maxAvail);
else if (-1 == obj.size)
copyLen = maxAvail;
else
throw new DhtException(MessageFormat.format(
DhtText.get().expectedObjectSizeDuringCopyAsIs, obj));
out.writeHeader(obj, inflatedSize);
out.write(dataBuf, ptr, copyLen);

// If the object was fragmented, send all of the other fragments.
if (isFragment()) {
int cnt = meta.getFragmentCount();
for (int fragId = 1; fragId < cnt; fragId++) {
PackChunk pc = ctx.getChunk(ChunkKey.fromString(
meta.getFragment(fragId)));
pc.copyEntireChunkAsIs(out, obj, validate);
}
}
}

void copyEntireChunkAsIs(PackOutputStream out, DhtObjectToPack obj,
boolean validate) throws IOException {
if (validate && !isValid()) {
if (obj != null)
throw new CorruptObjectException(obj, MessageFormat.format(
DhtText.get().corruptChunk, getChunkKey()));
else
throw new DhtException(MessageFormat.format(
DhtText.get().corruptChunk, getChunkKey()));
}

// Do not copy the trailer onto the output stream.
out.write(dataBuf, dataPtr, dataLen - TRAILER_SIZE);
}

@SuppressWarnings("boxing")
private boolean isValid() {
Boolean v = valid;
if (v == null) {
MessageDigest m = newMessageDigest();
m.update(dataBuf, dataPtr, dataLen);
v = key.getChunkHash().compareTo(m.digest(), 0) == 0;
valid = v;
}
return v.booleanValue();
}

/** @return the complete size of this chunk, in memory. */
int getTotalSize() {
// Assume the index is part of the buffer, and report its total size..
if (dataPtr != 0 || dataLen != dataBuf.length)
return dataBuf.length;

int sz = dataLen;
if (index != null)
sz += index.getIndexSize();
return sz;
}

private static class Delta {
/** Child that applies onto this object. */
final Delta next;

/** The chunk the delta is stored in. */
final ChunkKey deltaChunk;

/** Offset of the delta object. */
final int deltaPos;

/** Size of the inflated delta stream. */
final int deltaSize;

/** Total size of the delta's pack entry header (including base). */
final int hdrLen;

/** The chunk the base is stored in. */
final ChunkKey baseChunk;

/** Offset of the base object. */
final int basePos;

Delta(Delta next, ChunkKey dc, int ofs, int sz, int hdrLen,
ChunkKey bc, int bp) {
this.next = next;
this.deltaChunk = dc;
this.deltaPos = ofs;
this.deltaSize = sz;
this.hdrLen = hdrLen;
this.baseChunk = bc;
this.basePos = bp;
}

byte[] decompress(PackChunk chunk, DhtReader reader)
throws DataFormatException, DhtException {
return inflate(deltaSize, chunk, deltaPos + hdrLen, reader);
}

DeltaBaseCache.Entry getBase(DhtReader ctx) {
return ctx.getDeltaBaseCache().get(baseChunk, basePos);
}

void putBase(DhtReader ctx, int type, byte[] data) {
ctx.getDeltaBaseCache().put(baseChunk, basePos, type, data);
}
}

private static void checkCycle(Delta delta, ChunkKey key, int ofs)
throws DeltaChainCycleException {
for (; delta != null; delta = delta.next) {
if (delta.deltaPos == ofs && delta.deltaChunk.equals(key))
throw DeltaChainCycleException.INSTANCE;
}
}

private static class DeltaChainCycleException extends Exception {
private static final long serialVersionUID = 1L;

static final DeltaChainCycleException INSTANCE = new DeltaChainCycleException();
}
}

+ 0
- 423
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/Prefetcher.java View File

@@ -1,423 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT;
import static org.eclipse.jgit.lib.Constants.OBJ_TREE;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeoutException;

import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.generated.storage.dht.proto.GitStore.ChunkMeta;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.storage.dht.DhtReader.ChunkAndOffset;
import org.eclipse.jgit.storage.dht.spi.Context;
import org.eclipse.jgit.storage.dht.spi.Database;

class Prefetcher implements StreamingCallback<Collection<PackChunk.Members>> {
private static enum Status {
ON_QUEUE, LOADING, WAITING, READY, DONE;
}

private final Database db;

private final DhtReader.Statistics stats;

private final int objectType;

private final HashMap<ChunkKey, PackChunk> ready;

private final HashMap<ChunkKey, Status> status;

private final LinkedList<ChunkKey> queue;

private final boolean followEdgeHints;

private final int averageChunkSize;

private final int highWaterMark;

private final int lowWaterMark;

private boolean first = true;

private boolean automaticallyPushHints = true;

private ChunkKey stopAt;

private int bytesReady;

private int bytesLoading;

private DhtException error;

Prefetcher(DhtReader reader, int objectType, int prefetchLimitInBytes) {
this.db = reader.getDatabase();
this.stats = reader.getStatistics();
this.objectType = objectType;
this.ready = new HashMap<ChunkKey, PackChunk>();
this.status = new HashMap<ChunkKey, Status>();
this.queue = new LinkedList<ChunkKey>();
this.followEdgeHints = reader.getOptions().isPrefetchFollowEdgeHints();
this.averageChunkSize = reader.getInserterOptions().getChunkSize();
this.highWaterMark = prefetchLimitInBytes;

int lwm = (highWaterMark / averageChunkSize) - 4;
if (lwm <= 0)
lwm = (highWaterMark / averageChunkSize) / 2;
lowWaterMark = lwm * averageChunkSize;
}

boolean isType(int type) {
return objectType == type;
}

void push(DhtReader ctx, Collection<RevCommit> roots) {
// Approximate walk by using hints from the most recent commit.
// Since the commits were recently parsed by the reader, we can
// ask the reader for their chunk locations and most likely get
// cache hits.

int time = -1;
PackChunk chunk = null;

for (RevCommit cmit : roots) {
if (time < cmit.getCommitTime()) {
ChunkAndOffset p = ctx.getChunkGently(cmit);
if (p != null && p.chunk.getMeta() != null) {
time = cmit.getCommitTime();
chunk = p.chunk;
}
}
}

if (chunk != null) {
synchronized (this) {
status.put(chunk.getChunkKey(), Status.DONE);
push(chunk.getMeta());
}
}
}

void push(DhtReader ctx, RevTree start, RevTree end) throws DhtException,
MissingObjectException {
// Unlike commits, trees aren't likely to be loaded when they
// are pushed into the prefetcher. Find the tree and load it
// as necessary to get the prefetch meta established.
//
Sync<Map<ObjectIndexKey, Collection<ObjectInfo>>> sync = Sync.create();
Set<ObjectIndexKey> toFind = new HashSet<ObjectIndexKey>();
toFind.add(ObjectIndexKey.create(ctx.getRepositoryKey(), start));
toFind.add(ObjectIndexKey.create(ctx.getRepositoryKey(), end));
db.objectIndex().get(Context.READ_REPAIR, toFind, sync);

Map<ObjectIndexKey, Collection<ObjectInfo>> trees;
try {
trees = sync.get(ctx.getOptions().getTimeout());
} catch (InterruptedException e) {
throw new DhtTimeoutException(e);
} catch (TimeoutException e) {
throw new DhtTimeoutException(e);
}

ChunkKey startKey = chunk(trees.get(start));
if (startKey == null)
throw DhtReader.missing(start, OBJ_TREE);

ChunkKey endKey = chunk(trees.get(end));
if (endKey == null)
throw DhtReader.missing(end, OBJ_TREE);

synchronized (this) {
stopAt = endKey;
push(startKey);
maybeStartGet();
}
}

private static ChunkKey chunk(Collection<ObjectInfo> info) {
if (info == null || info.isEmpty())
return null;

List<ObjectInfo> infoList = new ArrayList<ObjectInfo>(info);
ObjectInfo.sort(infoList);
return infoList.get(0).getChunkKey();
}

void push(ChunkKey key) {
push(Collections.singleton(key));
}

void push(ChunkMeta meta) {
if (meta == null)
return;

ChunkMeta.PrefetchHint hint;
switch (objectType) {
case OBJ_COMMIT:
hint = meta.getCommitPrefetch();
break;
case OBJ_TREE:
hint = meta.getTreePrefetch();
break;
default:
return;
}

if (hint != null) {
synchronized (this) {
if (followEdgeHints && 0 < hint.getEdgeCount())
push(hint.getEdgeList());
else
push(hint.getSequentialList());
}
}
}

private void push(List<String> list) {
List<ChunkKey> keys = new ArrayList<ChunkKey>(list.size());
for (String keyString : list)
keys.add(ChunkKey.fromString(keyString));
push(keys);
}

void push(Iterable<ChunkKey> list) {
synchronized (this) {
for (ChunkKey key : list) {
if (status.containsKey(key))
continue;

status.put(key, Status.ON_QUEUE);
queue.add(key);

if (key.equals(stopAt)) {
automaticallyPushHints = false;
break;
}
}

if (!first)
maybeStartGet();
}
}

synchronized ChunkAndOffset find(RepositoryKey repo, AnyObjectId objId) {
for (PackChunk c : ready.values()) {
int p = c.findOffset(repo, objId);
if (0 <= p)
return new ChunkAndOffset(useReadyChunk(c.getChunkKey()), p);
}
return null;
}

synchronized PackChunk get(ChunkKey key) throws DhtException {
GET: for (;;) {
if (error != null)
throw error;

Status chunkStatus = status.get(key);
if (chunkStatus == null)
return null;

switch (chunkStatus) {
case ON_QUEUE:
if (queue.isEmpty()) {
// Should never happen, but let the caller load.
status.put(key, Status.DONE);
return null;

} else if (bytesReady + bytesLoading < highWaterMark) {
// Make sure its first in the queue, start, and wait.
if (!queue.getFirst().equals(key)) {
int idx = queue.indexOf(key);
if (first && objectType == OBJ_COMMIT) {
// If the prefetcher has not started yet, skip all
// chunks up to this first request. Assume this
// initial out-of-order get occurred because the
// RevWalk has already parsed all of the commits
// up to this point and does not need them again.
//
for (; 0 < idx; idx--)
status.put(queue.removeFirst(), Status.DONE);
forceStartGet();
continue GET;
}

stats.access(key).cntPrefetcher_OutOfOrder++;
queue.remove(idx);
queue.addFirst(key);
}
forceStartGet();
continue GET;

} else {
// It cannot be moved up to the front of the queue
// without violating the prefetch size. Let the
// caller load the chunk out of order.
stats.access(key).cntPrefetcher_OutOfOrder++;
status.put(key, Status.DONE);
return null;
}

case LOADING: // Wait for a prefetch that is already started.
status.put(key, Status.WAITING);
//$FALL-THROUGH$
case WAITING:
stats.access(key).cntPrefetcher_WaitedForLoad++;
try {
wait();
} catch (InterruptedException e) {
throw new DhtTimeoutException(e);
}
continue GET;

case READY:
return useReadyChunk(key);

case DONE:
stats.access(key).cntPrefetcher_Revisited++;
return null;

default:
throw new IllegalStateException(key + " " + chunkStatus);
}
}
}

private PackChunk useReadyChunk(ChunkKey key) {
PackChunk chunk = ready.remove(key);

status.put(chunk.getChunkKey(), Status.DONE);
bytesReady -= chunk.getTotalSize();

if (automaticallyPushHints) {
push(chunk.getMeta());
maybeStartGet();
}

return chunk;
}

private void maybeStartGet() {
if (!queue.isEmpty() && bytesReady + bytesLoading <= lowWaterMark)
forceStartGet();
}

private void forceStartGet() {
// Use a LinkedHashSet so insertion order is iteration order.
// This may help a provider that loads sequentially in the
// set's iterator order to load in the order we want data.
//
LinkedHashSet<ChunkKey> toLoad = new LinkedHashSet<ChunkKey>();

while (bytesReady + bytesLoading < highWaterMark && !queue.isEmpty()) {
ChunkKey key = queue.removeFirst();

stats.access(key).cntPrefetcher_Load++;
toLoad.add(key);
status.put(key, Status.LOADING);
bytesLoading += averageChunkSize;

// For the first chunk, start immediately to reduce the
// startup latency associated with additional chunks.
if (first)
break;
}

if (!toLoad.isEmpty() && error == null)
db.chunk().get(Context.LOCAL, toLoad, this);

if (first) {
first = false;
maybeStartGet();
}
}

public synchronized void onPartialResult(Collection<PackChunk.Members> res) {
try {
bytesLoading -= averageChunkSize * res.size();
for (PackChunk.Members builder : res)
chunkIsReady(builder.build());
} catch (DhtException loadError) {
onError(loadError);
}
}

private void chunkIsReady(PackChunk chunk) {
ChunkKey key = chunk.getChunkKey();
ready.put(key, chunk);
bytesReady += chunk.getTotalSize();

if (status.put(key, Status.READY) == Status.WAITING)
notifyAll();
}

public synchronized void onSuccess(Collection<PackChunk.Members> result) {
if (result != null && !result.isEmpty())
onPartialResult(result);
}

public synchronized void onFailure(DhtException asyncError) {
onError(asyncError);
}

private void onError(DhtException asyncError) {
if (error == null) {
error = asyncError;
notifyAll();
}
}
}

+ 0
- 295
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/QueueObjectLookup.java View File

@@ -1,295 +0,0 @@
/*
* Copyright (C) 2011, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.storage.dht;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.AsyncOperation;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.storage.dht.spi.Context;
import org.eclipse.jgit.storage.dht.spi.Database;

class QueueObjectLookup<T extends ObjectId> implements AsyncOperation {
protected final RepositoryKey repo;

protected final Database db;

protected final DhtReader reader;

private final DhtReaderOptions options;

private final boolean reportMissing;

private final ArrayList<ObjectInfo> tmp;

private final int concurrentBatches;

private int runningBatches;

private Context context;

private Iterator<T> toFind;

private List<T> toRetry;

private ObjectWithInfo<T> nextResult;

private DhtException error;

private boolean needChunkOnly;

private boolean cacheLoadedInfo;

QueueObjectLookup(DhtReader reader, boolean reportMissing) {
this.repo = reader.getRepositoryKey();
this.db = reader.getDatabase();
this.reader = reader;
this.options = reader.getOptions();
this.reportMissing = reportMissing;
this.tmp = new ArrayList<ObjectInfo>(4);
this.context = Context.FAST_MISSING_OK;
this.toRetry = new ArrayList<T>();

this.concurrentBatches = options.getObjectIndexConcurrentBatches();
}

void setCacheLoadedInfo(boolean on) {
cacheLoadedInfo = on;
}

void setNeedChunkOnly(boolean on) {
needChunkOnly = on;
}

void init(Iterable<T> objectIds) {
toFind = lookInCache(objectIds).iterator();
}

private Iterable<T> lookInCache(Iterable<T> objects) {
RecentInfoCache infoCache = reader.getRecentInfoCache();
List<T> missing = null;
for (T obj : objects) {
if (needChunkOnly && obj instanceof RefDataUtil.IdWithChunk) {
push(obj, ((RefDataUtil.IdWithChunk) obj).getChunkKey());
continue;
}

List<ObjectInfo> info = infoCache.get(obj);
if (info != null && !info.isEmpty()) {
push(obj, info.get(0));
} else {
if (missing == null) {
if (objects instanceof List<?>)
missing = new ArrayList<T>(((List<?>) objects).size());
else
missing = new ArrayList<T>();
}
missing.add(obj);
}
}
if (missing != null)
return missing;
return Collections.emptyList();
}

synchronized ObjectWithInfo<T> nextObjectWithInfo()
throws MissingObjectException, IOException {
for (;;) {
if (error != null)
throw error;

// Consider starting another batch before popping a result.
// This ensures lookup is running while results are being
// consumed by the calling application.
//
while (runningBatches < concurrentBatches) {
if (!toFind.hasNext() // reached end of original input
&& runningBatches == 0 // all batches finished
&& toRetry != null // haven't yet retried
&& !toRetry.isEmpty()) {
toFind = toRetry.iterator();
toRetry = null;
context = Context.READ_REPAIR;
}

if (toFind.hasNext())
startBatch(context);
else
break;
}

ObjectWithInfo<T> c = pop();
if (c != null) {
if (c.chunkKey != null)
return c;
else
throw missing(c.object);

} else if (!toFind.hasNext() && runningBatches == 0)
return null;

try {
wait();
} catch (InterruptedException e) {
throw new DhtTimeoutException(e);
}
}
}

private synchronized void startBatch(final Context ctx) {
final int batchSize = options.getObjectIndexBatchSize();
final Map<ObjectIndexKey, T> batch = new HashMap<ObjectIndexKey, T>();
while (toFind.hasNext() && batch.size() < batchSize) {
T obj = toFind.next();
batch.put(ObjectIndexKey.create(repo, obj), obj);
}

final AsyncCallback<Map<ObjectIndexKey, Collection<ObjectInfo>>> cb;

cb = new AsyncCallback<Map<ObjectIndexKey, Collection<ObjectInfo>>>() {
public void onSuccess(Map<ObjectIndexKey, Collection<ObjectInfo>> r) {
processResults(ctx, batch, r);
}

public void onFailure(DhtException e) {
processFailure(e);
}
};
db.objectIndex().get(ctx, batch.keySet(), cb);
runningBatches++;
}

private synchronized void processResults(Context ctx,
Map<ObjectIndexKey, T> batch,
Map<ObjectIndexKey, Collection<ObjectInfo>> objects) {
for (T obj : batch.values()) {
Collection<ObjectInfo> matches = objects.get(obj);

if (matches == null || matches.isEmpty()) {
if (ctx == Context.FAST_MISSING_OK)
toRetry.add(obj);
else if (reportMissing)
push(obj, (ChunkKey) null);
continue;
}

tmp.clear();
tmp.addAll(matches);
ObjectInfo.sort(tmp);
if (cacheLoadedInfo)
reader.getRecentInfoCache().put(obj, tmp);

push(obj, tmp.get(0));
}

runningBatches--;
notify();
}

private synchronized void processFailure(DhtException e) {
runningBatches--;
error = e;
notify();
}

private void push(T obj, ChunkKey chunkKey) {
nextResult = new ObjectWithInfo<T>(obj, chunkKey, nextResult);
}

private void push(T obj, ObjectInfo info) {
nextResult = new ObjectWithInfo<T>(obj, info, nextResult);
}

private ObjectWithInfo<T> pop() {
ObjectWithInfo<T> r = nextResult;
if (r == null)
return null;
nextResult = r.next;
return r;
}

public boolean cancel(boolean mayInterruptIfRunning) {
return true;
}

public void release() {
// Do nothing, there is nothing to abort or discard.
}

private static <T extends ObjectId> MissingObjectException missing(T id) {
return new MissingObjectException(id, DhtText.get().objectTypeUnknown);
}

static class ObjectWithInfo<T extends ObjectId> {
final T object;

final ObjectInfo info;

final ChunkKey chunkKey;

final ObjectWithInfo<T> next;

ObjectWithInfo(T object, ObjectInfo info, ObjectWithInfo<T> next) {
this.object = object;
this.info = info;
this.chunkKey = info.getChunkKey();
this.next = next;
}

ObjectWithInfo(T object, ChunkKey chunkKey, ObjectWithInfo<T> next) {
this.object = object;
this.info = null;
this.chunkKey = chunkKey;
this.next = next;
}
}
}

+ 0
- 0
org.eclipse.jgit.storage.dht/src/org/eclipse/jgit/storage/dht/RecentChunks.java View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save