dizzyd avatar dizzyd committed 70a3f27

More work on getting everything to startup properly; not quite there yet

Comments (0)

Files changed (4)

apps/riak/ebin/riak.app

              riak_reduce_phase_fsm,
              riak_ring,
              riak_ring_manager,
-             riak_startup,
              riak_stat,
              riak_sup,
              riak_test_util,

apps/riak/src/riak_app.erl

             set_bucket_params(DefaultBucketProps);
         true ->
             error_logger:error_msg("default_bucket_props is not a list: ~p\n", [DefaultBucketProps]),
-            {error, invalid_default_bucket_props}
+            throw({error, invalid_default_bucket_props})
     end,
     
     %% Check the storage backend
             ok
     end,
 
-    riak_sup:start_link().
+    %% Validate that the ring state directory exists
+    RingStateDir = riak:get_app_env(ring_state_dir),
+    case filelib:is_directory(RingStateDir) of
+        true ->
+            ok;
+        false ->
+            error_lgoger:error_msg("Ring state directory ~p does not exist.\n", [RingStateDir]),
+            throw({error, invalid_ring_state_dir})
+    end,
+
+    %% Make sure required modules are available
+    %% TODO: Is this really necessary?!
+    check_deps(),
+
+    %% Spin up supervisor
+    io:format("Plain args: ~p\n", [init:get_plain_arguments()]),
+    case riak_sup:start_link() of
+        {ok, Pid} ->
+            %% App is basically running. Now we need to either initialize a new
+            %% ring (noop), join a new ring or rejoin existing ring (default)
+            case ring_args(init:get_plain_arguments()) of
+                new_ring ->
+                    error_logger:info_msg("Starting new ring\n"),
+                    ok;
+                {join_ring, Node} ->
+                    error_logger:info_msg("Attempting to join ring at ~p\n", [Node]),
+                    riak_connect:send_ring(Node, node());
+                rejoin ->
+                    riak_ring_manager:prune_ringfiles(),
+                    riak_ring_manager:set_my_ring(
+                      riak_ring_manager:read_ringfile(
+                        riak_ring_manager:find_latest_ringfile()))
+            end,
+            {ok, Pid};
+        {error, Reason} ->
+            {error, Reason}
+    end.
+            
+            
 
 %% @spec stop(State :: term()) -> ok
 %% @doc The application:stop callback for riak.
       lists:ukeymerge(1,
                       lists:keysort(1, lists:keydelete(name, 1, In)),
                       lists:keysort(1, riak_bucket:defaults()))).
+
+
+%%
+%% Scan init:get_plain_arguments/0 looking for what to do with
+%% ring initialization
+%%
+ring_args([]) ->
+    rejoin;
+ring_args(["join", Node | _Rest]) ->
+    {join, list_to_atom(Node)};
+ring_args(["bootstrap" | _Rest]) ->
+    new_ring;
+ring_args([_ | Rest]) ->
+    ring_args(Rest).
+
+
+check_deps() ->
+    % explicit list of external modules we should fail-fast on missing
+    Deps = [vclock, chash, merkerl],
+    Fails = [Fail || {Fail, {error,_}} <-
+             [{Dep, code:ensure_loaded(Dep)} || Dep <- Deps]],
+    case Fails of
+        [] ->
+            ok;
+        _ ->
+            throw({error, {missing_modules, Fails}})
+    end.

apps/riak/src/riak_startup.erl

-%% This file is provided 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.    
-
--module(riak_startup).
--export([initiate_cluster/0,join_cluster/1,rejoin/0,no_config/0]).
-
-join_cluster([Node]) when is_list(Node) -> join_cluster(list_to_atom(Node));
-join_cluster(Node) ->
-    case check_deps() of
-        ok ->
-            riak_connect:send_ring(Node, node());
-        X ->
-            X
-    end.
-
-rejoin() ->
-    case check_deps() of
-        ok ->
-            riak_ring_manager:prune_ringfiles(),
-            riak_ring_manager:set_my_ring(
-              riak_ring_manager:read_ringfile(
-                riak_ring_manager:find_latest_ringfile()));
-        X ->
-            X
-    end.
-
-initiate_cluster() -> check_deps().
-
-check_deps() ->
-    % explicit list of external modules we should fail-fast on missing
-    Deps = [vclock, chash, merkerl],
-    Fails = [Fail || {Fail, {error,_}} <-
-             [{Dep, code:ensure_loaded(Dep)} || Dep <- Deps]],
-    case Fails of
-        [] -> ok;
-        _ ->
-            application:stop(riak),
-            {error, {failed, Fails}}
-    end.
-             
-no_config() -> application:set_env(riak, no_config, true).
-

rel/overlay/bin/riak

         BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin
         EMU=beam
         PROGNAME=`echo $0 | sed 's/.*\///'`
-        CMD="$BINDIR/erlexec -boot $RUNNER_BASE_DIR/releases/$APP_VSN/$SCRIPT -embedded -config $RUNNER_ETC_DIR/app.config -args_file $RUNNER_ETC_DIR/vm.args"
+        CMD="$BINDIR/erlexec -boot $RUNNER_BASE_DIR/releases/$APP_VSN/$SCRIPT -embedded -config $RUNNER_ETC_DIR/app.config -args_file $RUNNER_ETC_DIR/vm.args -- ${1+"$@"}"
         export EMU
         export ROOTDIR
         export BINDIR
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.