Browse Source

replication bug for aggr counters

Ulf Wiger 11 years ago
parent
commit
2e1cd9130c
1 changed files with 15 additions and 9 deletions
  1. 15 9
      src/gproc_dist.erl

+ 15 - 9
src/gproc_dist.erl

@@ -471,13 +471,13 @@ handle_leader_call({unreg, {T,g,Name} = K, Pid}, _From, S, _E) ->
                     case ets:lookup(?TAB, {{a,g,Name},a}) of
                         [Aggr] ->
                             %% updated by remove_reg/3
-                            {reply, true, [{delete,[Key, {Pid,K}], unreg},
+                            {reply, true, [{delete,[Key, {Pid,K}]},
                                            {insert, [Aggr]}], S};
                         [] ->
-                            {reply, true, [{delete, [Key, {Pid,K}], unreg}], S}
+                            {reply, true, [{delete, [Key, {Pid,K}]}], S}
                     end;
                true ->
-                    {reply, true, [{delete, [Key, {Pid,K}], unreg}], S}
+                    {reply, true, [{delete, [Key, {Pid,K}]}], S}
             end;
         false ->
             {reply, badarg, S}
@@ -487,19 +487,25 @@ handle_leader_call({give_away, {T,g,_} = K, To, Pid}, _From, S, _E)
     Key = {K, T},
     case ets:lookup(?TAB, Key) of
         [{_, Pid, Value}] ->
+            Opts = get_opts(Pid, K),
             case pid_to_give_away_to(To) of
                 Pid ->
                     {reply, Pid, S};
                 ToPid when is_pid(ToPid) ->
                     ets:insert(?TAB, [{Key, ToPid, Value},
-                                      {{ToPid,K}, []}]),
+                                      {{ToPid,K}, Opts}]),
                     _ = gproc_lib:ensure_monitor(ToPid, g),
-                    {reply, ToPid, [{delete, [Key, {Pid,K}], {migrated,ToPid}},
+                    Rev = {Pid, K},
+                    ets:delete(?TAB, Rev),
+                    gproc_lib:notify({migrated, ToPid}, K, Opts),
+                    {reply, ToPid, [{delete, [Key, Rev]},
 				    {insert, [{Key, ToPid, Value}]}], S};
                 undefined ->
                     ets:delete(?TAB, Key),
-		    Rev = gproc_lib:remove_reverse_mapping(unreg, Pid, K),
-                    {reply, undefined, [{delete, [Key, Rev], unreg}], S}
+                    Rev = {Pid, K},
+                    ets:delete(?TAB, Rev),
+                    gproc_lib:notify(unreg, K, Opts),
+                    {reply, undefined, [{delete, [Key, Rev]}], S}
             end;
         _ ->
             {reply, badarg, S}
@@ -519,7 +525,7 @@ handle_leader_call({munreg, T, g, L, Pid}, _From, S, _E) ->
         [] ->
             {reply, true, S};
         Objs ->
-            {reply, true, [{delete, Objs, unreg}], S}
+            {reply, true, [{delete, Objs}], S}
     catch
         error:_ -> {reply, badarg, S}
     end;
@@ -738,7 +744,7 @@ insert_globals(Globals) ->
 	      ets:insert_new(?TAB, {{Pid,Key}, []}),
 	      gproc_lib:ensure_monitor(Pid,g),
 	      A;
-	 ({{{_,_,_} = Key, n}, Pid, _} = Obj, A) ->
+	 ({{{_,_,_} = Key, _}, Pid, _} = Obj, A) ->
               ets:insert(?TAB, Obj),
               ets:insert_new(?TAB, {{Pid,Key}, []}),
 	      gproc_lib:ensure_monitor(Pid,g),