You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@giraph.apache.org by ik...@apache.org on 2015/06/11 04:50:44 UTC
[5/5] git commit: updated refs/heads/trunk to 819d6d3
[GIRAPH-1013] Add core of Blocks Framework
Summary:
Add all classes in the core of the Framework.
This is the full execution engine of the framework.
New module giraph-block-app is created for it, and all framework
classes are going into org.apache.giraph.block_app.framework,
and all non-framework-internal classes are going to go into
subpackages of org.apache.giraph.block_app (i.e. utilities for
writing applications, etc)
Test Plan: mvn clean install
Reviewers: maja.kabiljo, dionysis.logothetis, sergey.edunov
Reviewed By: sergey.edunov
Differential Revision: https://reviews.facebook.net/D39639
Project: http://git-wip-us.apache.org/repos/asf/giraph/repo
Commit: http://git-wip-us.apache.org/repos/asf/giraph/commit/819d6d38
Tree: http://git-wip-us.apache.org/repos/asf/giraph/tree/819d6d38
Diff: http://git-wip-us.apache.org/repos/asf/giraph/diff/819d6d38
Branch: refs/heads/trunk
Commit: 819d6d38d6cb7073786f4b7ed11763fff5200ded
Parents: 06a1084
Author: Igor Kabiljo <ik...@fb.com>
Authored: Fri Jun 5 00:19:41 2015 -0700
Committer: Igor Kabiljo <ik...@fb.com>
Committed: Wed Jun 10 19:50:06 2015 -0700
----------------------------------------------------------------------
checkstyle-relaxed.xml | 272 +++++++++++
giraph-block-app/pom.xml | 124 +++++
giraph-block-app/src/main/assembly/compile.xml | 39 ++
.../framework/AbstractBlockFactory.java | 203 ++++++++
.../block_app/framework/BlockFactory.java | 83 ++++
.../giraph/block_app/framework/BlockUtils.java | 206 +++++++++
.../block_app/framework/BulkConfigurator.java | 32 ++
.../block_app/framework/api/BlockApi.java | 47 ++
.../block_app/framework/api/BlockConfApi.java | 32 ++
.../block_app/framework/api/BlockMasterApi.java | 58 +++
.../block_app/framework/api/BlockOutputApi.java | 31 ++
.../api/BlockOutputHandleAccessor.java | 33 ++
.../block_app/framework/api/BlockWorkerApi.java | 35 ++
.../framework/api/BlockWorkerContextApi.java | 45 ++
.../api/BlockWorkerContextReceiveApi.java | 29 ++
.../api/BlockWorkerContextSendApi.java | 39 ++
.../framework/api/BlockWorkerReceiveApi.java | 33 ++
.../framework/api/BlockWorkerSendApi.java | 116 +++++
.../framework/api/BlockWorkerValueAccessor.java | 36 ++
.../giraph/block_app/framework/api/Counter.java | 33 ++
.../framework/api/CreateReducersApi.java | 83 ++++
.../block_app/framework/api/StatusReporter.java | 31 ++
.../framework/api/giraph/BlockComputation.java | 54 +++
.../api/giraph/BlockMasterApiWrapper.java | 170 +++++++
.../api/giraph/BlockMasterCompute.java | 72 +++
.../api/giraph/BlockWorkerApiWrapper.java | 180 +++++++
.../api/giraph/BlockWorkerContext.java | 102 ++++
.../giraph/BlockWorkerContextApiWrapper.java | 84 ++++
.../framework/api/giraph/package-info.java | 22 +
.../block_app/framework/api/package-info.java | 36 ++
.../giraph/block_app/framework/block/Block.java | 59 +++
.../block_app/framework/block/EmptyBlock.java | 39 ++
.../framework/block/FilteringBlock.java | 113 +++++
.../block_app/framework/block/IfBlock.java | 70 +++
.../block_app/framework/block/RepeatBlock.java | 87 ++++
.../framework/block/RepeatUntilBlock.java | 83 ++++
.../framework/block/SequenceBlock.java | 60 +++
.../block_app/framework/block/package-info.java | 22 +
.../framework/internal/BlockCounters.java | 79 ++++
.../framework/internal/BlockMasterLogic.java | 173 +++++++
.../internal/BlockWorkerContextLogic.java | 91 ++++
.../framework/internal/BlockWorkerLogic.java | 68 +++
.../framework/internal/BlockWorkerPieces.java | 180 +++++++
.../framework/internal/PairedPieceAndStage.java | 111 +++++
.../framework/internal/package-info.java | 22 +
.../framework/output/BlockOutputDesc.java | 50 ++
.../framework/output/BlockOutputFormat.java | 107 +++++
.../framework/output/BlockOutputHandle.java | 119 +++++
.../framework/output/BlockOutputOption.java | 52 +++
.../framework/output/BlockOutputWriter.java | 26 ++
.../framework/output/package-info.java | 21 +
.../block_app/framework/package-info.java | 25 +
.../framework/piece/AbstractPiece.java | 287 ++++++++++++
.../framework/piece/DefaultParentPiece.java | 311 +++++++++++++
.../giraph/block_app/framework/piece/Piece.java | 59 +++
.../framework/piece/PieceWithWorkerContext.java | 54 +++
.../framework/piece/delegate/DelegatePiece.java | 277 +++++++++++
.../piece/delegate/FilteringPiece.java | 157 +++++++
.../framework/piece/delegate/package-info.java | 21 +
.../piece/global_comm/BroadcastHandle.java | 30 ++
.../piece/global_comm/ReduceUtilsObject.java | 62 +++
.../ReducerAndBroadcastWrapperHandle.java | 61 +++
.../piece/global_comm/ReducerHandle.java | 41 ++
.../piece/global_comm/array/ArrayHandle.java | 36 ++
.../global_comm/array/BroadcastArrayHandle.java | 35 ++
.../global_comm/array/ReducerArrayHandle.java | 43 ++
.../piece/global_comm/array/package-info.java | 21 +
.../internal/CreateReducersApiWrapper.java | 73 +++
.../internal/ReducersForPieceHandler.java | 250 ++++++++++
.../internal/VertexSenderObserver.java | 28 ++
.../global_comm/internal/package-info.java | 22 +
.../global_comm/map/BroadcastMapHandle.java | 36 ++
.../piece/global_comm/map/MapHandle.java | 31 ++
.../piece/global_comm/map/ReducerMapHandle.java | 43 ++
.../piece/global_comm/map/package-info.java | 21 +
.../piece/global_comm/package-info.java | 22 +
.../piece/interfaces/VertexPostprocessor.java | 34 ++
.../piece/interfaces/VertexReceiver.java | 54 +++
.../piece/interfaces/VertexSender.java | 45 ++
.../piece/interfaces/package-info.java | 21 +
.../piece/messages/ObjectMessageClasses.java | 119 +++++
.../piece/messages/SupplierFromConf.java | 71 +++
.../framework/piece/messages/package-info.java | 21 +
.../block_app/framework/piece/package-info.java | 24 +
.../org/apache/giraph/function/Consumer.java | 34 ++
.../org/apache/giraph/function/Function.java | 38 ++
.../apache/giraph/function/PairConsumer.java | 34 ++
.../apache/giraph/function/PairFunction.java | 40 ++
.../org/apache/giraph/function/Supplier.java | 37 ++
.../apache/giraph/function/package-info.java | 26 ++
.../giraph/function/primitive/IntSupplier.java | 27 ++
.../giraph/function/primitive/package-info.java | 22 +
.../function/vertex/ConsumerWithVertex.java | 48 ++
.../function/vertex/FunctionWithVertex.java | 52 +++
.../function/vertex/SupplierFromVertex.java | 49 ++
.../giraph/function/vertex/package-info.java | 22 +
.../framework/block/BlockTestingUtils.java | 158 +++++++
.../block_app/framework/block/TestIfBlock.java | 88 ++++
.../framework/block/TestRepeatBlock.java | 80 ++++
.../framework/block/TestRepeatUntilBlock.java | 103 +++++
.../giraph/edge/LongDiffNullArrayEdges.java | 463 +++++++++++++++++++
.../giraph/utils/ConfigurationObjectUtils.java | 118 +++++
.../giraph/utils/DefaultOutputCommitter.java | 72 +++
.../org/apache/giraph/utils/WritableUtils.java | 187 ++++++++
.../giraph/edge/LongDiffNullArrayEdgesTest.java | 260 +++++++++++
pom.xml | 12 +-
106 files changed, 8395 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/checkstyle-relaxed.xml
----------------------------------------------------------------------
diff --git a/checkstyle-relaxed.xml b/checkstyle-relaxed.xml
new file mode 100644
index 0000000..11bcfe0
--- /dev/null
+++ b/checkstyle-relaxed.xml
@@ -0,0 +1,272 @@
+<?xml version="1.0"?>
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ This version of checkstyle is based on the Hadoop and common-math
+ checkstyle configurations. It is a best effort attempt to try to match
+ the CODE_CONVENTIONS and Oracle "Code Conventions for the Java
+ Programming Language". See the following link:
+
+ http://www.oracle.com/technetwork/java/codeconvtoc-136057.html
+
+ The documentation for checkstyle is available at
+
+ http://checkstyle.sourceforge.net
+-->
+
+<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.1//EN" "http://www.puppycrawl.com/dtds/configuration_1_1.dtd">
+
+<!-- Apache giraph customization of default Checkstyle behavior -->
+<module name="Checker">
+ <property name="localeLanguage" value="en"/>
+
+ <!-- Checks for headers -->
+ <!-- See http://checkstyle.sf.net/config_header.html -->
+ <!-- Verify that EVERY source file has the appropriate license -->
+ <module name="Header">
+ <property name="headerFile" value="${checkstyle.header.file}"/>
+ <property name="fileExtensions" value="java"/>
+ </module>
+
+ <!-- Checks for Javadoc comments (checker). -->
+ <!-- See http://checkstyle.sf.net/config_javadoc.html -->
+ <!-- Require package javadoc -->
+ <module name="JavadocPackage"/>
+
+ <!-- Miscellaneous other checks (checker). -->
+ <!-- See http://checkstyle.sf.net/config_misc.html -->
+ <!-- Require files to end with newline characters -->
+ <module name="NewlineAtEndOfFile"/>
+
+ <!-- Checks for whitespace (tree walker) -->
+ <!-- See http://checkstyle.sf.net/config_whitespace.html -->
+ <!-- No tabs allowed! -->
+ <module name="FileTabCharacter"/>
+
+ <module name="TreeWalker">
+ <property name="cacheFile" value="target/checkstyle-cachefile"/>
+
+ <!-- Checks for blocks. You know, those {}'s -->
+ <!-- See http://checkstyle.sf.net/config_blocks.html -->
+ <!-- No empty blocks (i.e. catch) -->
+ <module name="EmptyBlock"/>
+ <module name="AvoidNestedBlocks"/>
+ <!-- No if/else/do/for/while without braces -->
+ <module name="NeedBraces"/>
+ <module name="LeftCurly"/>
+ <module name="RightCurly"/>
+
+ <!-- Checks for class design -->
+ <!-- See http://checkstyle.sf.net/config_design.html -->
+ <!-- Utility class should not be instantiated, they must have a
+ private constructor -->
+ <module name="HideUtilityClassConstructor"/>
+ <!-- Interfaces must be types (not just constants) -->
+ <module name="InterfaceIsType"/>
+ <!-- No public fields -->
+ <module name="VisibilityModifier">
+ <property name="protectedAllowed" value="true"/>
+ <property name="publicMemberPattern" value="^$"/>
+ </module>
+
+ <!-- Checks for common coding problems -->
+ <!-- See http://checkstyle.sf.net/config_coding.html -->
+ <module name="EmptyStatement"/>
+ <!-- Require hash code override when equals is -->
+ <module name="EqualsHashCode"/>
+ <!-- Method parameters and local variables should not hide
+ fields, except in constructors and setters -->
+ <module name="HiddenField">
+ <property name="ignoreConstructorParameter" value="true" />
+ <property name="ignoreSetter" value="true" />
+ <property name="tokens" value="VARIABLE_DEF"/>
+ </module>
+ <!-- Disallow unnecessary instantiation of Boolean, String -->
+ <module name="IllegalInstantiation">
+ <property name="classes" value="java.lang.Boolean, java.lang.String"/>
+ </module>
+ <module name="InnerAssignment"/>
+ <!-- Switch statements should be complete and with independent cases -->
+ <module name="FallThrough" />
+ <module name="MissingSwitchDefault" />
+ <module name="SimplifyBooleanExpression"/>
+ <module name="SimplifyBooleanReturn"/>
+ <!-- Only one statment per line allowed -->
+ <module name="OneStatementPerLine"/>
+ <!-- Use a consistent way to put declarations -->
+ <module name="DeclarationOrder" />
+ <!-- Don't add up parentheses when they are not required -->
+ <module name="UnnecessaryParentheses" />
+ <!-- Don't use too widespread catch (Exception, Throwable,
+ RuntimeException) -->
+ <module name="IllegalCatch" />
+ <!-- Don't use = or != for string comparisons -->
+ <module name="StringLiteralEquality" />
+ <!-- Don't declare multiple variables in the same statement -->
+ <module name="MultipleVariableDeclarations" />
+ <!-- String literals more than one character long should not be
+ repeated several times -->
+ <!-- the "unchecked" string is also accepted to allow
+ @SuppressWarnings("unchecked") -->
+ <!-- Disabling for now until we have a better ignoreStringsRegexp -->
+ <!--
+ <module name="MultipleStringLiterals" >
+ <property name="ignoreStringsRegexp" value='^(("")|(".")|("unchecked"))$'/>
+ </module>
+ -->
+
+ <!-- Checks for imports -->
+ <!-- See http://checkstyle.sf.net/config_import.html -->
+ <module name="RedundantImport"/>
+ <!-- Import should be explicit, really needed and only from pure
+ java packages -->
+ <module name="AvoidStarImport" />
+ <module name="UnusedImports" />
+ <module name="IllegalImport" />
+
+ <!-- Checks for Javadoc comments (tree walker). -->
+ <!-- See http://checkstyle.sf.net/config_javadoc.html -->
+ <!-- Javadoc must be formatted correctly -->
+ <module name="JavadocStyle">
+ <property name="checkFirstSentence" value="false"/>
+ </module>
+ <!-- Must have class / interface header comments -->
+ <module name="JavadocType"/>
+ <!-- Require method javadocs, allow undeclared RTE, allow missing
+ javadoc on getters and setters -->
+ <module name="JavadocMethod">
+ <property name="allowMissingJavadoc" value="true"/>
+ <property name="allowUndeclaredRTE" value="true"/>
+ <property name="allowMissingThrowsTags" value="true"/>
+ <property name="allowMissingPropertyJavadoc" value="true"/>
+ <property name="allowMissingParamTags" value="true"/>
+ <property name="allowMissingReturnTag" value="true"/>
+ </module>
+
+ <!-- Miscellaneous other checks (tree walker). -->
+ <!-- See http://checkstyle.sf.net/config_misc.html -->
+ <!-- Java style arrays -->
+ <module name="ArrayTypeStyle"/>
+ <!-- Indentation -->
+ <module name="Indentation">
+ <property name="basicOffset" value="2"/>
+ <property name="braceAdjustment" value="0"/>
+ <property name="caseIndent" value="0"/>
+ <property name="throwsIndent" value="2"/>
+ <property name="lineWrappingIndentation" value="0"/>
+ <property name="arrayInitIndent" value="2"/>
+ </module>
+ <!-- Turn this on to see what needs to be done
+ <module name="TodoComment"/>
+ -->
+ <module name="UpperEll"/>
+
+ <!-- Modifier Checks -->
+ <!-- See http://checkstyle.sf.net/config_modifiers.html -->
+ <!-- Use a consistent way to put modifiers -->
+ <module name="ModifierOrder"/>
+ <module name="RedundantModifier"/>
+
+ <!-- Checks for Naming Conventions. -->
+ <!-- See http://checkstyle.sf.net/config_naming.html -->
+ <!-- Constant names should obey the traditional all uppercase
+ naming convention -->
+ <module name="ConstantName"/>
+ <module name="LocalFinalVariableName"/>
+ <module name="LocalVariableName"/>
+ <module name="MemberName"/>
+ <module name="MethodName"/>
+ <module name="PackageName"/>
+ <module name="ParameterName"/>
+ <module name="StaticVariableName">
+ <property name="format" value="^[A-Z0-9_]*$"/>
+ </module>
+ <module name="TypeName"/>
+
+ <!-- Checks for regexp expressions. -->
+ <!-- See http://checkstyle.sf.net/config_regexp.html -->
+ <!-- No trailing whitespace -->
+ <module name="Regexp">
+ <property name="format" value="[ \t]+$"/>
+ <property name="illegalPattern" value="true"/>
+ <property name="message" value="Trailing whitespace"/>
+ </module>
+ <!-- No System.out.println() statements -->
+ <module name="Regexp">
+ <!-- No sysouts -->
+ <property name="format" value="System\.out\.println"/>
+ <property name="illegalPattern" value="true"/>
+ </module>
+ <!-- Authors should be in pom.xml file -->
+ <module name="Regexp">
+ <property name="format" value="@author"/>
+ <property name="illegalPattern" value="true"/>
+ <property name="message" value="developers names should be in pom file"/>
+ </module>
+
+ <!-- Checks for Size Violations. -->
+ <!-- See http://checkstyle.sf.net/config_sizes.html -->
+ <!-- Lines cannot exceed 80 chars -->
+ <module name="LineLength">
+ <property name="max" value="80"/>
+ <property name="ignorePattern" value="^import"/>
+ </module>
+ <!-- Over time, we will revised this down -->
+ <module name="MethodLength">
+ <property name="max" value="200"/>
+ </module>
+ <module name="ParameterNumber">
+ <property name="max" value="8"/>
+ </module>
+
+ <!-- Checks for whitespace (tree walker) -->
+ <!-- See http://checkstyle.sf.net/config_whitespace.html -->
+ <module name="EmptyForIteratorPad"/>
+ <!-- Spacing around methods -->
+ <module name="MethodParamPad">
+ <property name="option" value="nospace"/>
+ <property name="allowLineBreaks" value="true"/>
+ </module>
+ <!-- No whitespace before a token -->
+ <module name="NoWhitespaceBefore"/>
+ <!-- Whitespace after tokens is required -->
+ <module name="WhitespaceAfter"/>
+ <!-- Whitespace around tokens is required -->
+ <module name="WhitespaceAround"/>
+ <module name="ParenPad"/>
+ <module name="TypecastParenPad"/>
+ <!-- No extra whitespace around types -->
+ <module name="GenericWhitespace"/>
+ <!-- Operator must be at end of wrapped line -->
+ <module name="OperatorWrap">
+ <property name="option" value="eol"/>
+ </module>
+
+ <!-- Required for SuppressionCommentFilter below -->
+ <module name="FileContentsHolder"/>
+ </module>
+
+ <!-- Setup special comments to suppress specific checks from source files -->
+ <module name="SuppressionCommentFilter">
+ <property name="offCommentFormat" value="CHECKSTYLE\: stop ([\w\|]+)"/>
+ <property name="onCommentFormat" value="CHECKSTYLE\: resume ([\w\|]+)"/>
+ <property name="checkFormat" value="$1"/>
+ </module>
+</module>
+
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/pom.xml
----------------------------------------------------------------------
diff --git a/giraph-block-app/pom.xml b/giraph-block-app/pom.xml
new file mode 100644
index 0000000..1f653bb
--- /dev/null
+++ b/giraph-block-app/pom.xml
@@ -0,0 +1,124 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<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.apache.giraph</groupId>
+ <artifactId>giraph-parent</artifactId>
+ <version>1.2.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>giraph-block-app</artifactId>
+ <packaging>jar</packaging>
+
+ <name>Apache Giraph Blocks Framework</name>
+ <url>http://giraph.apache.org/giraph-block-app/</url>
+ <description>Giraph Blocks Framework and utilities for writing applications</description>
+
+ <properties>
+ <top.dir>${project.basedir}/..</top.dir>
+ <checkstyle.config.path>${top.dir}/checkstyle-relaxed.xml</checkstyle.config.path>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-site-plugin</artifactId>
+ <configuration>
+ <siteDirectory>${project.basedir}/src/site</siteDirectory>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <skip>${surefire.skip}</skip>
+ <systemProperties>
+ <property>
+ <name>prop.jarLocation</name>
+ <value>${top.dir}/giraph-core/target/giraph-${project.version}-${forHadoop}-jar-with-dependencies.jar</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <!-- compile dependencies. sorted lexicographically. -->
+ <dependency>
+ <groupId>it.unimi.dsi</groupId>
+ <artifactId>fastutil</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.giraph</groupId>
+ <artifactId>giraph-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.python</groupId>
+ <artifactId>jython</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </dependency>
+
+ <!-- runtime dependency -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
+ <!-- test dependencies. sorted lexicographically. -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/assembly/compile.xml
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/assembly/compile.xml b/giraph-block-app/src/main/assembly/compile.xml
new file mode 100644
index 0000000..fcaffa6
--- /dev/null
+++ b/giraph-block-app/src/main/assembly/compile.xml
@@ -0,0 +1,39 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+ <id>jar-with-dependencies</id>
+ <formats>
+ <format>jar</format>
+ </formats>
+ <includeBaseDirectory>false</includeBaseDirectory>
+
+ <dependencySets>
+ <dependencySet>
+ <useProjectArtifact>true</useProjectArtifact>
+ <outputDirectory>/</outputDirectory>
+ <unpackOptions>
+ <excludes>
+ <exclude>META-INF/LICENSE</exclude>
+ </excludes>
+ </unpackOptions>
+ <unpack>true</unpack>
+ <scope>runtime</scope>
+ </dependencySet>
+ </dependencySets>
+</assembly>
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/AbstractBlockFactory.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/AbstractBlockFactory.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/AbstractBlockFactory.java
new file mode 100644
index 0000000..66ad775
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/AbstractBlockFactory.java
@@ -0,0 +1,203 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework;
+
+import java.util.List;
+
+import org.apache.giraph.comm.messages.MessageEncodeAndStoreType;
+import org.apache.giraph.conf.GiraphConfiguration;
+import org.apache.giraph.conf.GiraphConstants;
+import org.apache.giraph.conf.StrConfOption;
+import org.apache.giraph.edge.IdAndNullArrayEdges;
+import org.apache.giraph.edge.IdAndValueArrayEdges;
+import org.apache.giraph.edge.LongDiffNullArrayEdges;
+import org.apache.giraph.types.ops.PrimitiveIdTypeOps;
+import org.apache.giraph.types.ops.TypeOps;
+import org.apache.giraph.types.ops.TypeOpsUtils;
+import org.apache.giraph.utils.ReflectionUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.NullWritable;
+import org.apache.hadoop.io.Writable;
+import org.apache.hadoop.io.WritableComparable;
+
+/**
+ * Default block factory abstract class, providing default methods that need
+ * to be/can be overridden for specifying required/most common parameters,
+ * to simplify setting properties.
+ *
+ * @param <S> Execution stage type
+ */
+public abstract class AbstractBlockFactory<S> implements BlockFactory<S> {
+ /**
+ * Comma separated list of BulkConfigurators, that are going to be called
+ * to simplify specifying of large number of properties.
+ */
+ public static final StrConfOption CONFIGURATORS = new StrConfOption(
+ "digraph.block_factory_configurators", null, "");
+
+ @Override
+ public List<String> getGcJavaOpts(Configuration conf) {
+ return null;
+ }
+
+ @Override
+ public final void initConfig(GiraphConfiguration conf) {
+ initConfigurators(conf);
+ GiraphConstants.VERTEX_ID_CLASS.setIfUnset(conf, getVertexIDClass(conf));
+ GiraphConstants.VERTEX_VALUE_CLASS.setIfUnset(
+ conf, getVertexValueClass(conf));
+ GiraphConstants.EDGE_VALUE_CLASS.setIfUnset(conf, getEdgeValueClass(conf));
+ GiraphConstants.RESOLVER_CREATE_VERTEX_ON_MSGS.setIfUnset(
+ conf, shouldCreateVertexOnMsgs(conf));
+ if (shouldSendOneMessageToAll(conf)) {
+ GiraphConstants.MESSAGE_ENCODE_AND_STORE_TYPE.setIfUnset(
+ conf, MessageEncodeAndStoreType.EXTRACT_BYTEARRAY_PER_PARTITION);
+ }
+
+ BlockUtils.BLOCK_WORKER_CONTEXT_VALUE_CLASS.setIfUnset(
+ conf, getWorkerContextValueClass(conf));
+
+ // optimize edge structure, if available and not set already
+ if (!GiraphConstants.VERTEX_EDGES_CLASS.contains(conf)) {
+ @SuppressWarnings("rawtypes")
+ Class<? extends WritableComparable> vertexIDClass =
+ GiraphConstants.VERTEX_ID_CLASS.get(conf);
+ Class<? extends Writable> edgeValueClass =
+ GiraphConstants.EDGE_VALUE_CLASS.get(conf);
+
+
+ @SuppressWarnings("rawtypes")
+ PrimitiveIdTypeOps<? extends WritableComparable> idTypeOps =
+ TypeOpsUtils.getPrimitiveIdTypeOpsOrNull(vertexIDClass);
+ if (edgeValueClass.equals(NullWritable.class)) {
+ if (vertexIDClass.equals(LongWritable.class)) {
+ GiraphConstants.VERTEX_EDGES_CLASS.set(
+ conf, LongDiffNullArrayEdges.class);
+ } else if (idTypeOps != null) {
+ GiraphConstants.VERTEX_EDGES_CLASS.set(
+ conf, IdAndNullArrayEdges.class);
+ }
+ } else {
+ TypeOps<?> edgeValueTypeOps =
+ TypeOpsUtils.getTypeOpsOrNull(edgeValueClass);
+ if (edgeValueTypeOps != null) {
+ GiraphConstants.VERTEX_EDGES_CLASS.set(
+ conf, IdAndValueArrayEdges.class);
+ }
+ }
+ }
+
+ additionalInitConfig(conf);
+ }
+
+ @Override
+ public void registerOutputs(GiraphConfiguration conf) {
+ }
+
+ private void initConfigurators(GiraphConfiguration conf) {
+ String configurators = CONFIGURATORS.get(conf);
+ if (configurators != null) {
+ String[] split = configurators.split(",");
+ for (String configurator : split) {
+ runConfigurator(conf, configurator);
+ }
+ }
+ }
+
+ private void runConfigurator(GiraphConfiguration conf, String configurator) {
+ String[] packages = getConvenienceConfiguratorPackages();
+ String[] prefixes = new String[packages.length + 1];
+ prefixes[0] = "";
+ for (int i = 0; i < packages.length; i++) {
+ prefixes[i + 1] = packages[i] + ".";
+ }
+
+ for (String prefix : prefixes) {
+ try {
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ Class<BulkConfigurator> confClass =
+ (Class) Class.forName(prefix + configurator);
+ BulkConfigurator c = ReflectionUtils.newInstance(confClass);
+ c.configure(conf);
+ return;
+ // CHECKSTYLE: stop EmptyBlock
+ // ignore ClassNotFoundException, and continue the loop
+ } catch (ClassNotFoundException e) {
+ }
+ // CHECKSTYLE: resume EmptyBlock
+ }
+ throw new IllegalStateException(
+ "Configurator " + configurator + " not found");
+ }
+
+ /**
+ * Additional configuration initialization, other then overriding
+ * class specification.
+ */
+ protected void additionalInitConfig(GiraphConfiguration conf) {
+ }
+
+ /**
+ * Concrete vertex id class application will use.
+ */
+ @SuppressWarnings("rawtypes")
+ protected abstract Class<? extends WritableComparable> getVertexIDClass(
+ GiraphConfiguration conf);
+
+ /**
+ * Concrete vertex value class application will use.
+ */
+ protected abstract Class<? extends Writable> getVertexValueClass(
+ GiraphConfiguration conf);
+
+ /**
+ * Concrete edge value class application will use.
+ */
+ protected abstract Class<? extends Writable> getEdgeValueClass(
+ GiraphConfiguration conf);
+
+ /**
+ * Concrete worker context value class application will use, if overridden.
+ */
+ protected Class<?> getWorkerContextValueClass(GiraphConfiguration conf) {
+ return Object.class;
+ }
+
+ /**
+ * Override if vertices shouldn't be created by default, if message is sent
+ * to a vertex that doesn't exist.
+ */
+ protected boolean shouldCreateVertexOnMsgs(GiraphConfiguration conf) {
+ return true;
+ }
+
+ // TODO - see if it should be deprecated
+ protected boolean shouldSendOneMessageToAll(GiraphConfiguration conf) {
+ return false;
+ }
+
+ /**
+ * Provide list of strings representing packages where configurators will
+ * be searched for, allowing that full path is not required for
+ * CONFIGURATORS option.
+ */
+ protected String[] getConvenienceConfiguratorPackages() {
+ return new String[] { };
+ }
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BlockFactory.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BlockFactory.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BlockFactory.java
new file mode 100644
index 0000000..652eb5e
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BlockFactory.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework;
+
+import java.util.List;
+
+import org.apache.giraph.block_app.framework.block.Block;
+import org.apache.giraph.conf.GiraphConfiguration;
+import org.apache.hadoop.conf.Configuration;
+
+/**
+ * Class describing a particular application.
+ * Everything except input and output should be fully encapsulated within
+ * this class. For any application, it should be enough to only specify
+ * particular BlockFactory.
+ *
+ * Given configuration, it creates a block that represents a full Giraph job.
+ *
+ * Recommended is to extend AbstractBlockFactory directly for most cases.
+ *
+ * @param <S> Execution stage type
+ */
+public interface BlockFactory<S> {
+ /**
+ * Based on provided configuration, updates it, such that all necessary
+ * properties are initialized.
+ */
+ void initConfig(GiraphConfiguration conf);
+
+ /**
+ * Create a block (representing a full Giraph job), based on the given
+ * configuration. Configuration should be treated as immutable at this point.
+ *
+ * If there are issues in configuration, it is very cheap to throw
+ * from this method - as Giraph job will not even start.
+ * This function will be called two times - once before starting
+ * of the Giraph job, to fail early if anything is incorrectly configured.
+ * Second time will be on Master, which will return Block instance
+ * on which createIterator will be called once, which should return
+ * current application run.
+ * initConfig will be called only once, before starting Giraph job itself.
+ * Master will contain configuration already modified by initConfig.
+ */
+ Block createBlock(GiraphConfiguration conf);
+
+ /**
+ * Create an empty instance of execution stage object.
+ *
+ * Can be used by application to be aware of what was executed before.
+ * Most common example is counting iterations, or for having a boolean whether
+ * some important event happened.
+ *
+ * Execution stage should be immutable object, with creating a new
+ * object when different value is needed.
+ */
+ S createExecutionStage(GiraphConfiguration conf);
+
+ /**
+ * Get special GC Java options. If returns null, default options are used.
+ */
+ List<String> getGcJavaOpts(Configuration conf);
+
+ /**
+ * Register outputs to use during the application (vs output at the end of
+ * the application), based on provided configuration.
+ */
+ void registerOutputs(GiraphConfiguration conf);
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BlockUtils.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BlockUtils.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BlockUtils.java
new file mode 100644
index 0000000..df260f5
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BlockUtils.java
@@ -0,0 +1,206 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework;
+
+import static org.apache.giraph.utils.ReflectionUtils.getTypeArguments;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+import org.apache.giraph.block_app.framework.api.giraph.BlockComputation;
+import org.apache.giraph.block_app.framework.api.giraph.BlockMasterCompute;
+import org.apache.giraph.block_app.framework.api.giraph.BlockWorkerContext;
+import org.apache.giraph.block_app.framework.block.Block;
+import org.apache.giraph.block_app.framework.piece.AbstractPiece;
+import org.apache.giraph.block_app.framework.piece.Piece;
+import org.apache.giraph.conf.ClassConfOption;
+import org.apache.giraph.conf.GiraphConfiguration;
+import org.apache.giraph.conf.GiraphConstants;
+import org.apache.giraph.conf.ImmutableClassesGiraphConfiguration;
+import org.apache.giraph.conf.MessageClasses;
+import org.apache.giraph.function.Consumer;
+import org.apache.giraph.types.NoMessage;
+import org.apache.giraph.utils.ReflectionUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.log4j.Logger;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * Utility functions for block applications
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public class BlockUtils {
+ /** Property describing BlockFactory to use for current application run */
+ public static final ClassConfOption<BlockFactory> BLOCK_FACTORY_CLASS =
+ ClassConfOption.create("digraph.block_factory", null, BlockFactory.class,
+ "block factory describing giraph job");
+
+ /** Property describing BlockFactory to use for current application run */
+ public static final ClassConfOption<Object> BLOCK_WORKER_CONTEXT_VALUE_CLASS =
+ ClassConfOption.create(
+ "digraph.block_worker_context_value_class", null, Object.class,
+ "block worker context value class");
+
+ private static final Logger LOG = Logger.getLogger(BlockUtils.class);
+
+ /** Dissallow constructor */
+ private BlockUtils() { }
+
+ /**
+ * Create new BlockFactory that is specified in the configuration.
+ */
+ public static <S> BlockFactory<S> createBlockFactory(Configuration conf) {
+ return ReflectionUtils.newInstance(BLOCK_FACTORY_CLASS.get(conf));
+ }
+
+ /**
+ * Set which BlockFactory class to be used for the application.
+ * (generally useful within tests only)
+ */
+ public static void setBlockFactoryClass(Configuration conf,
+ Class<? extends BlockFactory<?>> clazz) {
+ BLOCK_FACTORY_CLASS.set(conf, clazz);
+ }
+
+ /**
+ * Set block factory, and initialize configs with it.
+ * Should be used only if there are no configuration options set after
+ * this method call.
+ */
+ public static void setAndInitBlockFactoryClass(GiraphConfiguration conf,
+ Class<? extends BlockFactory<?>> clazz) {
+ BLOCK_FACTORY_CLASS.set(conf, clazz);
+ initAndCheckConfig(conf);
+ }
+
+ /**
+ * Initializes configuration, such that running it executes block application.
+ *
+ * Additionally, checks types of all pieces with a block application.
+ */
+ public static void initAndCheckConfig(GiraphConfiguration conf) {
+ conf.setMasterComputeClass(BlockMasterCompute.class);
+ conf.setComputationClass(BlockComputation.class);
+ conf.setWorkerContextClass(BlockWorkerContext.class);
+
+ Preconditions.checkState(
+ GiraphConstants.OUTGOING_MESSAGE_VALUE_CLASS.get(conf) == null,
+ "Message types should only be specified in Pieces, " +
+ "but outgoing was specified globally");
+ Preconditions.checkState(
+ GiraphConstants.OUTGOING_MESSAGE_VALUE_FACTORY_CLASS
+ .isDefaultValue(conf),
+ "Message types should only be specified in Pieces, " +
+ "but factory was specified globally");
+ Preconditions.checkState(
+ GiraphConstants.MESSAGE_COMBINER_CLASS.get(conf) == null,
+ "Message combiner should only be specified in Pieces, " +
+ "but was specified globally");
+
+ BlockFactory<?> blockFactory = createBlockFactory(conf);
+ blockFactory.initConfig(conf);
+
+ Preconditions.checkState(
+ GiraphConstants.OUTGOING_MESSAGE_VALUE_CLASS.get(conf) == null,
+ "Outgoing message type was specified in blockFactory.initConfig");
+ Preconditions.checkState(
+ GiraphConstants.OUTGOING_MESSAGE_VALUE_FACTORY_CLASS
+ .isDefaultValue(conf),
+ "Outgoing message factory type was specified in " +
+ "blockFactory.initConfig");
+ Preconditions.checkState(
+ GiraphConstants.MESSAGE_COMBINER_CLASS.get(conf) == null,
+ "Message combiner type was specified in blockFactory.initConfig");
+
+ GiraphConstants.OUTGOING_MESSAGE_VALUE_CLASS.set(conf, NoMessage.class);
+
+ final ImmutableClassesGiraphConfiguration immConf =
+ new ImmutableClassesGiraphConfiguration<>(conf);
+
+ // Create blocks to detect issues before creating a Giraph job
+ // They will not be used here
+ Block executionBlock = blockFactory.createBlock(immConf);
+ LOG.info("Executing application - " + executionBlock);
+
+ final Class<?> vertexIdClass = GiraphConstants.VERTEX_ID_CLASS.get(conf);
+ final Class<?> vertexValueClass =
+ GiraphConstants.VERTEX_VALUE_CLASS.get(conf);
+ final Class<?> edgeValueClass =
+ GiraphConstants.EDGE_VALUE_CLASS.get(conf);
+ final Class<?> workerContextValueClass =
+ BlockUtils.BLOCK_WORKER_CONTEXT_VALUE_CLASS.get(conf);
+ final Class<?> executionStageClass =
+ blockFactory.createExecutionStage(conf).getClass();
+
+ // Check for type inconsistencies
+ executionBlock.forAllPossiblePieces(new Consumer<AbstractPiece>() {
+ @Override
+ public void apply(AbstractPiece piece) {
+ if (!piece.getClass().equals(Piece.class)) {
+ Class<?>[] classList = getTypeArguments(
+ AbstractPiece.class, piece.getClass());
+ Preconditions.checkArgument(classList.length == 7);
+
+ ReflectionUtils.verifyTypes(
+ vertexIdClass, classList[0], "vertexId", piece.getClass());
+ ReflectionUtils.verifyTypes(
+ vertexValueClass, classList[1], "vertexValue", piece.getClass());
+ ReflectionUtils.verifyTypes(
+ edgeValueClass, classList[2], "edgeValue", piece.getClass());
+
+ MessageClasses classes = piece.getMessageClasses(immConf);
+ Class<?> messageType = classes.getMessageClass();
+ if (messageType == null) {
+ messageType = NoMessage.class;
+ }
+ ReflectionUtils.verifyTypes(
+ messageType, classList[3], "message", piece.getClass());
+
+ ReflectionUtils.verifyTypes(
+ workerContextValueClass, classList[4],
+ "workerContextValue", piece.getClass());
+ // No need to check worker context message class at all
+
+ ReflectionUtils.verifyTypes(
+ executionStageClass, classList[6],
+ "executionStage", piece.getClass());
+ }
+ }
+ });
+
+ // check for non 'static final' fields in BlockFactories
+ Class<?> bfClass = blockFactory.getClass();
+ while (!bfClass.equals(Object.class)) {
+ for (Field field : bfClass.getDeclaredFields()) {
+ if (!Modifier.isStatic(field.getModifiers()) ||
+ !Modifier.isFinal(field.getModifiers())) {
+ throw new IllegalStateException("BlockFactory (" + bfClass +
+ ") cannot have any mutable (non 'static final') fields as a " +
+ "safety measure, as createBlock function is called from a " +
+ "different context then all other functions, use conf argument " +
+ "instead, or make it 'static final'. Field present: " + field);
+ }
+ }
+ bfClass = bfClass.getSuperclass();
+ }
+
+ // Register outputs
+ blockFactory.registerOutputs(conf);
+ }
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BulkConfigurator.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BulkConfigurator.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BulkConfigurator.java
new file mode 100644
index 0000000..348c907
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/BulkConfigurator.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework;
+
+import org.apache.giraph.conf.GiraphConfiguration;
+
+/**
+ * Function that modifies configuration.
+ *
+ * Allows for multi-option configuration to be specified in a common classes.
+ */
+public interface BulkConfigurator {
+ /**
+ * Modify given configuration.
+ */
+ void configure(GiraphConfiguration conf);
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockApi.java
new file mode 100644
index 0000000..a0c92ad
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockApi.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+
+/**
+ * Basic block computation API for accessing items
+ * present on both workers and master.
+ */
+public interface BlockApi extends BlockConfApi {
+ /**
+ * Get the total (all workers) number of vertices that
+ * existed at the start of the current piece.
+ *
+ * Recommended to avoid it, as it introduces global dependencies,
+ * code will not be able to work on top of a subgraphs any more.
+ * This number should be easily computable via reducer or aggregator.
+ */
+ @Deprecated
+ long getTotalNumVertices();
+
+ /**
+ * Get the total (all workers) number of edges that
+ * existed at the start of the current piece.
+ *
+ * Recommended to avoid it, as it introduces global dependencies,
+ * code will not be able to work on top of a subgraphs any more.
+ * This number should be easily computable via reducer or aggregator.
+ */
+ @Deprecated
+ long getTotalNumEdges();
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockConfApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockConfApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockConfApi.java
new file mode 100644
index 0000000..98e51f8
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockConfApi.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.conf.ImmutableClassesGiraphConfiguration;
+
+/**
+ * Block computation API for accessing configuration.
+ */
+public interface BlockConfApi {
+ /**
+ * Return the configuration used by this object.
+ *
+ * @return Set configuration
+ */
+ ImmutableClassesGiraphConfiguration<?, ?, ?> getConf();
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockMasterApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockMasterApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockMasterApi.java
new file mode 100644
index 0000000..3d04584
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockMasterApi.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.aggregators.Aggregator;
+import org.apache.giraph.block_app.framework.piece.global_comm.BroadcastHandle;
+import org.apache.giraph.master.MasterAggregatorUsage;
+import org.apache.giraph.master.MasterGlobalCommUsage;
+import org.apache.hadoop.io.Writable;
+
+/**
+ * Block computation API available for the master methods.
+ *
+ * Interface to the MasterCompute methods.
+ */
+public interface BlockMasterApi extends MasterAggregatorUsage,
+ MasterGlobalCommUsage, StatusReporter, BlockApi, BlockOutputApi {
+ /**
+ * No need to use it, and introduces global dependencies.
+ *
+ * Store data locally within the piece, or use ObjectHolder.
+ */
+ @Deprecated
+ @Override
+ <A extends Writable>
+ boolean registerPersistentAggregator(
+ String name, Class<? extends Aggregator<A>> aggregatorClass
+ ) throws InstantiationException, IllegalAccessException;
+
+ /**
+ * Broadcast given value to all workers for next computation.
+ * @param value Value to broadcast
+ */
+ <T extends Writable> BroadcastHandle<T> broadcast(T value);
+
+ /**
+ * Call this to log a line to command line of the job. Use in moderation -
+ * it's a synchronous call to Job client
+ *
+ * @param line Line to print
+ */
+ void logToCommandLine(String line);
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockOutputApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockOutputApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockOutputApi.java
new file mode 100644
index 0000000..8c33623
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockOutputApi.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.block_app.framework.output.BlockOutputDesc;
+import org.apache.giraph.block_app.framework.output.BlockOutputWriter;
+
+/**
+ * Block worker output api
+ */
+public interface BlockOutputApi {
+ <OW extends BlockOutputWriter, OD extends BlockOutputDesc<OW>>
+ OD getOutputDesc(String confOption);
+
+ <OW extends BlockOutputWriter> OW getWriter(String confOption);
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockOutputHandleAccessor.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockOutputHandleAccessor.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockOutputHandleAccessor.java
new file mode 100644
index 0000000..074637d
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockOutputHandleAccessor.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.block_app.framework.output.BlockOutputHandle;
+
+/**
+ * Function for accessing BlockOutputHandle.
+ *
+ * Intentionally hidden from APIs, to allow usage only
+ * within DefaultParentPiece.
+ */
+public interface BlockOutputHandleAccessor {
+ /**
+ * Get global block output handle.
+ */
+ BlockOutputHandle getBlockOutputHandle();
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerApi.java
new file mode 100644
index 0000000..727bf08
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerApi.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.aggregators.AggregatorUsage;
+import org.apache.giraph.conf.ImmutableClassesGiraphConfiguration;
+import org.apache.hadoop.io.WritableComparable;
+
+/**
+ * Block computation API available for worker methods.
+ *
+ * Interface to the Computation methods.
+ * @param <I> vertex Id type.
+ */
+@SuppressWarnings("rawtypes")
+public interface BlockWorkerApi<I extends WritableComparable>
+ extends AggregatorUsage, BlockApi {
+ @Override
+ ImmutableClassesGiraphConfiguration<I, ?, ?> getConf();
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextApi.java
new file mode 100644
index 0000000..d5918b5
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextApi.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.aggregators.AggregatorUsage;
+import org.apache.giraph.conf.ImmutableClassesGiraphConfiguration;
+
+/**
+ * Block computation API available for worker context methods.
+ *
+ * Interface to the WorkerContext methods.
+ */
+public interface BlockWorkerContextApi extends AggregatorUsage, BlockApi {
+ @Override
+ ImmutableClassesGiraphConfiguration<?, ?, ?> getConf();
+
+ /**
+ * Get number of workers
+ *
+ * @return Number of workers
+ */
+ int getWorkerCount();
+
+ /**
+ * Get index for this worker
+ *
+ * @return Index of this worker
+ */
+ int getMyWorkerIndex();
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextReceiveApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextReceiveApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextReceiveApi.java
new file mode 100644
index 0000000..a8242b2
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextReceiveApi.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.worker.WorkerBroadcastUsage;
+
+/**
+ * Block computation API available for worker context receive methods.
+ *
+ * Interface to the WorkerContext methods.
+ */
+public interface BlockWorkerContextReceiveApi
+ extends BlockWorkerContextApi, WorkerBroadcastUsage {
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextSendApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextSendApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextSendApi.java
new file mode 100644
index 0000000..769562d
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerContextSendApi.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.worker.WorkerAggregatorUsage;
+import org.apache.hadoop.io.Writable;
+
+/**
+ * Block computation API available for worker send methods.
+ *
+ * Interface to the WorkerContext methods.
+ *
+ * @param <WM> Worker message type
+ */
+public interface BlockWorkerContextSendApi<WM extends Writable>
+ extends BlockWorkerContextApi, WorkerAggregatorUsage {
+ /**
+ * Send message to another worker
+ *
+ * @param message Message to send
+ * @param workerIndex Index of the worker to send the message to
+ */
+ void sendMessageToWorker(WM message, int workerIndex);
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerReceiveApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerReceiveApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerReceiveApi.java
new file mode 100644
index 0000000..6db51bd
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerReceiveApi.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.worker.WorkerBroadcastUsage;
+import org.apache.hadoop.io.WritableComparable;
+
+/**
+ * Block computation API available for worker receive methods.
+ *
+ * Interface to the Computation methods.
+ *
+ * @param <I> vertex Id type.
+ */
+@SuppressWarnings("rawtypes")
+public interface BlockWorkerReceiveApi<I extends WritableComparable>
+ extends BlockWorkerApi<I>, WorkerBroadcastUsage, BlockOutputApi {
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerSendApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerSendApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerSendApi.java
new file mode 100644
index 0000000..a72150f
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerSendApi.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import java.util.Iterator;
+
+import org.apache.giraph.conf.ImmutableClassesGiraphConfiguration;
+import org.apache.giraph.edge.Edge;
+import org.apache.giraph.edge.OutEdges;
+import org.apache.giraph.graph.Vertex;
+import org.apache.giraph.worker.WorkerAggregatorUsage;
+import org.apache.giraph.worker.WorkerReduceUsage;
+import org.apache.hadoop.io.Writable;
+import org.apache.hadoop.io.WritableComparable;
+
+/**
+ * Block computation API available for worker send methods.
+ *
+ * Interface to the Computation methods.
+ *
+ * @param <I> Vertex id type
+ * @param <V> Vertex value type
+ * @param <E> Edge value type
+ * @param <M> Message type
+ */
+@SuppressWarnings("rawtypes")
+public interface BlockWorkerSendApi<I extends WritableComparable,
+ V extends Writable, E extends Writable, M extends Writable>
+ extends BlockWorkerApi<I>, WorkerAggregatorUsage, WorkerReduceUsage {
+ @Override
+ ImmutableClassesGiraphConfiguration<I, V, E> getConf();
+
+ /**
+ * Send a message to a vertex id.
+ *
+ * @param id Vertex id to send the message to
+ * @param message Message data to send
+ */
+ void sendMessage(I id, M message);
+
+ /**
+ * Send a message to all edges.
+ *
+ * @param vertex Vertex whose edges to send the message to.
+ * @param message Message sent to all edges.
+ */
+ void sendMessageToAllEdges(Vertex<I, V, E> vertex, M message);
+
+ /**
+ * Send a message to multiple target vertex ids in the iterator.
+ *
+ * @param vertexIdIterator An iterator to multiple target vertex ids.
+ * @param message Message sent to all targets in the iterator.
+ */
+ void sendMessageToMultipleEdges(Iterator<I> vertexIdIterator, M message);
+
+ /**
+ * Sends a request to create a vertex that will be available
+ * in the receive phase.
+ *
+ * @param id Vertex id
+ * @param value Vertex value
+ * @param edges Initial edges
+ */
+ void addVertexRequest(I id, V value, OutEdges<I, E> edges);
+
+ /**
+ * Sends a request to create a vertex that will be available
+ * in the receive phase.
+ *
+ * @param id Vertex id
+ * @param value Vertex value
+ */
+ void addVertexRequest(I id, V value);
+
+ /**
+ * Request to remove a vertex from the graph
+ * (applied just prior to the next receive phase).
+ *
+ * @param vertexId Id of the vertex to be removed.
+ */
+ void removeVertexRequest(I vertexId);
+
+ /**
+ * Request to add an edge of a vertex in the graph
+ * (processed just prior to the next receive phase)
+ *
+ * @param sourceVertexId Source vertex id of edge
+ * @param edge Edge to add
+ */
+ void addEdgeRequest(I sourceVertexId, Edge<I, E> edge);
+
+ /**
+ * Request to remove all edges from a given source vertex to a given target
+ * vertex (processed just prior to the next receive phase).
+ *
+ * @param sourceVertexId Source vertex id
+ * @param targetVertexId Target vertex id
+ */
+ void removeEdgesRequest(I sourceVertexId, I targetVertexId);
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerValueAccessor.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerValueAccessor.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerValueAccessor.java
new file mode 100644
index 0000000..f7cddf3
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/BlockWorkerValueAccessor.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+/**
+ * Function for accessing WorkerValue.
+ *
+ * Intentionally hidden from APIs, to allow usage only
+ * within PieceWithWorkerContext.
+ */
+public interface BlockWorkerValueAccessor {
+ /**
+ * Get global worker value.
+ * Value returned can be accessed from may threads, and so all
+ * accesses to it should be done in a thread-safe manner!
+ *
+ * This is the only place in Blocks Framework where you need
+ * to take care of concurrency.
+ */
+ Object getWorkerValue();
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/Counter.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/Counter.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/Counter.java
new file mode 100644
index 0000000..730b0ab
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/Counter.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+/** Interface wrapping around org.appache.hadoop.mapreduce.Counter */
+public interface Counter {
+ /**
+ * Set this counter by the given value
+ * @param value the value to set
+ */
+ void setValue(long value);
+
+ /**
+ * Increment this counter by the given value
+ * @param incr the value to increase this counter by
+ */
+ void increment(long incr);
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/CreateReducersApi.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/CreateReducersApi.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/CreateReducersApi.java
new file mode 100644
index 0000000..77b3b1e
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/CreateReducersApi.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+import org.apache.giraph.block_app.framework.piece.global_comm.ReducerHandle;
+import org.apache.giraph.reducers.ReduceOperation;
+import org.apache.hadoop.io.Writable;
+
+/**
+ * Api for creating reducer handles.
+ */
+public interface CreateReducersApi extends BlockConfApi {
+
+ /**
+ * Create local reducer, returning a handle to it.
+ *
+ * Local reducer means that each worker thread has it's own local partially
+ * reduced value, which are at the end reduced all together.
+ * Preferable, unless it cannot be used, because all copies of the object
+ * do not fit the memory.
+ */
+ <S, R extends Writable> ReducerHandle<S, R> createLocalReducer(
+ ReduceOperation<S, R> reduceOp);
+
+ /**
+ * Create local reducer, returning a handle to it.
+ *
+ * Local reducer means that each worker thread has it's own local partially
+ * reduced value, which are at the end reduced all together.
+ * Preferable, unless it cannot be used, because all copies of the object
+ * do not fit the memory.
+ */
+ <S, R extends Writable> ReducerHandle<S, R> createLocalReducer(
+ ReduceOperation<S, R> reduceOp, R globalInitialValue);
+
+ /**
+ * Create global reducer, returning a handle to it.
+ *
+ * Global reducer means that there is only one value for each worker,
+ * and each call to reduce will have to obtain a global lock, and incur
+ * synchronization costs.
+ * Use only when objects are so large, that having many copies cannot
+ * fit into memory.
+ */
+ <S, R extends Writable> ReducerHandle<S, R> createGlobalReducer(
+ ReduceOperation<S, R> reduceOp);
+
+ /**
+ * Create global reducer, returning a handle to it.
+ *
+ * Global reducer means that there is only one value for each worker,
+ * and each call to reduce will have to obtain a global lock, and incur
+ * synchronization costs.
+ * Use only when objects are so large, that having many copies cannot
+ * fit into memory.
+ */
+ <S, R extends Writable> ReducerHandle<S, R> createGlobalReducer(
+ ReduceOperation<S, R> reduceOp, R globalInitialValue);
+
+ /**
+ * Function that creates a reducer - abstracting away whether it is
+ * local or global reducer
+ */
+ public interface CreateReducerFunctionApi {
+ <S, R extends Writable> ReducerHandle<S, R> createReducer(
+ ReduceOperation<S, R> reduceOp);
+ }
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/StatusReporter.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/StatusReporter.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/StatusReporter.java
new file mode 100644
index 0000000..3ce1862
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/StatusReporter.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api;
+
+/**
+ * Interface wrapping around functions from
+ * org.appache.hadoop.mapreduce.StatusReporter
+ */
+public interface StatusReporter {
+ /** Get specified counter handler */
+ Counter getCounter(String group, String name);
+ /** Report progress to the Hadoop framework. */
+ void progress();
+ /** Set the current status of the task to the given string. */
+ void setStatus(String status);
+}
http://git-wip-us.apache.org/repos/asf/giraph/blob/819d6d38/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/giraph/BlockComputation.java
----------------------------------------------------------------------
diff --git a/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/giraph/BlockComputation.java b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/giraph/BlockComputation.java
new file mode 100644
index 0000000..930b62b
--- /dev/null
+++ b/giraph-block-app/src/main/java/org/apache/giraph/block_app/framework/api/giraph/BlockComputation.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.giraph.block_app.framework.api.giraph;
+
+import java.io.IOException;
+
+import org.apache.giraph.block_app.framework.internal.BlockWorkerLogic;
+import org.apache.giraph.block_app.framework.internal.BlockWorkerPieces;
+import org.apache.giraph.graph.AbstractComputation;
+import org.apache.giraph.graph.Vertex;
+
+
+/**
+ * Computation that executes receiver and sender blocks passed
+ * into BlockWorkerPieces.
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public final class BlockComputation extends AbstractComputation {
+ private BlockWorkerLogic workerLogic;
+
+ @Override
+ public void preSuperstep() {
+ BlockWorkerPieces workerPieces =
+ BlockWorkerPieces.getNextWorkerPieces(this);
+ workerLogic = new BlockWorkerLogic(workerPieces);
+ BlockWorkerApiWrapper workerApi = new BlockWorkerApiWrapper<>(this);
+ workerLogic.preSuperstep(workerApi, workerApi);
+ }
+
+ @Override
+ public void compute(Vertex vertex, Iterable messages) throws IOException {
+ workerLogic.compute(vertex, messages);
+ }
+
+ @Override
+ public void postSuperstep() {
+ workerLogic.postSuperstep();
+ }
+}