L = fun (Msg) -> 
  ns_log:log(ns_log, node(), os:timestamp(), crit, "~s", [Msg]) 
end, 
HistorySize = 10, 
Config = ns_config:get(), 
Buckets = ns_bucket:get_buckets(Config), 
case ns_config:search(Config, vbucket_map_history) of 
    {value, V} when V =/= [] -> 
        L("VBucket map history is already prepared for 1.8.1 swap rebalance"), 
        ok; 
    _Else -> 
        L("Applying 1.8.1 swap rebalance hot fix. Cycling mb_master on all nodes first"), 
        RV = rpc:multicall([node() | nodes()], eshell, eval, ["ok = supervisor:terminate_child(ns_server_sup, mb_master), supervisor:restart_child(ns_server_sup, mb_master).", []]), 
        L(iolist_to_binary([<<"RV: ">> | io_lib:format("~p", [RV])])), 

        History = lists:flatmap( 
                    fun ({_Bucket, BucketConfig}) -> 
                            case proplists:get_value(map, BucketConfig, []) of 
                                [] -> []; 
                                Map -> 
                                    case ns_rebalancer:unbalanced(Map, proplists:get_value(servers, BucketConfig, [])) of 
                                        true -> 
                                            []; 
                                        false -> 
                                            MapOptions = [{max_slaves, proplists:get_value(max_slaves, BucketConfig, 10)}], 
                                            [{Map, MapOptions}] 
                                    end 
                            end 
                    end, Buckets), 
        UniqueHistory = lists:usort(History), 
        FinalHistory = lists:sublist(UniqueHistory, HistorySize), 
        ns_config:set(vbucket_map_history, FinalHistory), 
        L("Applied config fixup. 1.8.1 should become master in 10-15 seconds. Swap rebalance is now enabled.") 
end.
