GEODE-3153 Client receives duplicate events during rolling upgrade The previous fix worked fine for 1.0.0 and 1.1.0 clients but there are old GemFire 8.2 clients still in use that the fix did not work for. This patch changes the serialization to always send UUID bytes to pre Version.GFE_90 (1.0.0-incubating) clients.
Added unit for it Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/b4ebcbac Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/b4ebcbac Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/b4ebcbac Branch: refs/heads/feature/GEODE-3109 Commit: b4ebcbac1d4940c73d5f10b29a21a2b384c14373 Parents: bc13d70 Author: Hitesh Khamesra <hkhame...@pivotal.io> Authored: Fri Jul 7 09:35:33 2017 -0700 Committer: Hitesh Khamesra <hkhame...@pivotal.io> Committed: Fri Jul 7 16:20:59 2017 -0700 ---------------------------------------------------------------------- .../membership/InternalDistributedMember.java | 4 ++- .../apache/geode/internal/cache/EventID.java | 12 +++---- .../cache/ha/EventIdOptimizationJUnitTest.java | 36 +++++++++++++++++++- .../sanctionedDataSerializables.txt | 30 ++++++++-------- 4 files changed, 59 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/b4ebcbac/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java index 85c2bea..e152756 100755 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java @@ -1145,7 +1145,9 @@ public class InternalDistributedMember implements DistributedMember, Externaliza // write name last to fix bug 45160 DataSerializer.writeString(netMbr.getName(), out); - if (InternalDataSerializer.getVersionForDataStream(out).compareTo(Version.GFE_90) == 0) { + Version outputVersion = InternalDataSerializer.getVersionForDataStream(out); + if (0 <= outputVersion.compareTo(Version.GFE_90) + && outputVersion.compareTo(Version.GEODE_110) < 0) { netMbr.writeAdditionalData(out); } } http://git-wip-us.apache.org/repos/asf/geode/blob/b4ebcbac/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java b/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java index 8621649..4833ea1 100755 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java @@ -298,13 +298,13 @@ public class EventID implements DataSerializableFixedID, Serializable, Externali /** * deserialize the memberID bytes using the given version. The correct thing to do would be to * have EventID carry the version ordinal of the serialized memberID, or to have it be part of the - * memberID bytes and use that version to deserialize the bytes + * memberID bytes and use that version to deserialize the bytes. Clients prior to 1.1.0 need to + * have UUID bytes in the memberID. Newer clients don't require this. */ - private InternalDistributedMember getDistributedMember(Version targetVersion) { + public InternalDistributedMember getDistributedMember(Version targetVersion) { ByteArrayInputStream bais = new ByteArrayInputStream(this.membershipID); DataInputStream dis = new DataInputStream(bais); - if (0 <= targetVersion.compareTo(Version.GFE_90) - && targetVersion.compareTo(Version.GEODE_110) < 0) { + if (targetVersion.compareTo(Version.GEODE_110) < 0) { // GEODE-3153: clients expect to receive UUID bytes, which are only // read if the stream's version is 1.0.0-incubating dis = new VersionedDataInputStream(dis, Version.GFE_90); @@ -345,10 +345,10 @@ public class EventID implements DataSerializableFixedID, Serializable, Externali // of the identifier // See GEODE-3072 if (version.compareTo(Version.GEODE_110) < 0) { - InternalDistributedMember member = getDistributedMember(version); + InternalDistributedMember member = getDistributedMember(Version.GFE_90); // reserialize with the client's version so that we write the UUID // bytes - HeapDataOutputStream hdos = new HeapDataOutputStream(version); + HeapDataOutputStream hdos = new HeapDataOutputStream(Version.GFE_90); member.writeEssentialData(hdos); DataSerializer.writeByteArray(hdos.toByteArray(), dop); } else { http://git-wip-us.apache.org/repos/asf/geode/blob/b4ebcbac/geode-core/src/test/java/org/apache/geode/internal/cache/ha/EventIdOptimizationJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/ha/EventIdOptimizationJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/ha/EventIdOptimizationJUnitTest.java index 09c4a4d..451dc20 100755 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/ha/EventIdOptimizationJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/ha/EventIdOptimizationJUnitTest.java @@ -16,12 +16,19 @@ package org.apache.geode.internal.cache.ha; import static org.junit.Assert.*; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; import java.nio.ByteBuffer; import org.apache.geode.test.junit.categories.ClientServerTest; import org.junit.Test; import org.junit.experimental.categories.Category; - +import org.apache.geode.distributed.internal.membership.InternalDistributedMember; +import org.apache.geode.internal.HeapDataOutputStream; +import org.apache.geode.internal.Version; +import org.apache.geode.internal.VersionedDataInputStream; +import org.apache.geode.internal.VersionedDataOutputStream; import org.apache.geode.internal.cache.EventID; import org.apache.geode.test.junit.categories.UnitTest; @@ -164,6 +171,33 @@ public class EventIdOptimizationJUnitTest { writeReadAndVerifyOptimizedByteArray(ID_VALUE_LONG, ID_VALUE_INT, expectedLength); } + @Test + public void testEventIDForGEODE100Member() throws IOException, ClassNotFoundException { + InternalDistributedMember distributedMember = new InternalDistributedMember("localhost", 10999); + HeapDataOutputStream hdos = new HeapDataOutputStream(256, Version.CURRENT); + distributedMember.writeEssentialData(hdos); + byte[] memberBytes = hdos.toByteArray(); + EventID eventID = new EventID(memberBytes, 1, 1); + + + HeapDataOutputStream hdos90 = new HeapDataOutputStream(256, Version.GFE_90); + VersionedDataOutputStream dop = new VersionedDataOutputStream(hdos90, Version.GFE_90); + + eventID.toData(dop); + + ByteArrayInputStream bais = new ByteArrayInputStream(hdos90.toByteArray()); + + + VersionedDataInputStream dataInputStream = new VersionedDataInputStream(bais, Version.GFE_90); + + EventID eventID2 = new EventID(); + eventID2.fromData(dataInputStream); + + assertEquals(distributedMember, eventID2.getDistributedMember(Version.GFE_90)); + + assertEquals(memberBytes.length + 17, eventID2.getMembershipID().length); + } + /** * Creates the optimized byte array using <code>EventID#getOptimizedByteArrayForEventID</code> api * with the given threadId and sequenceId and verifies that the length of that byte-array is as http://git-wip-us.apache.org/repos/asf/geode/blob/b4ebcbac/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt ---------------------------------------------------------------------- diff --git a/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt b/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt index 433e641..b84ac39 100644 --- a/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt +++ b/geode-core/src/test/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt @@ -285,28 +285,28 @@ fromData,16,2a2bb700172a2bb900180100b50008b1 toData,16,2a2bb700192b2ab40008b9001a0200b1 org/apache/geode/distributed/internal/membership/InternalDistributedMember,6 -fromData,38,2a2bb6009f2ab6009ab900190100b20095b60078a100112ab400012bb900960200a700044db1 -fromDataPre_GFE_7_1_0_0,282,2bb800a04d2bb900a101003e2a2bb8008fb500072ab2000499000e2c2ab40007b800a2a700072cb60008b500072bb900a3010036041504047e99000704a700040336051504057e99000704a700040336062a1504077e99000704a7000403b5003a2bb900a1010036072bb900a1010036082bb900a3010036092bb800913a0a02360b2bb8008f3a0c1509100da0000e2a2bb8008fb50014a700152bb8008f3a0d190dc6000a190db800a4360b2bb8008f3a0d2bb80092b60093360e190db600779e0011bb004f59190d150eb70050a70004013a0f2a15042bb700943610bb003159150715081509150b190c190a190fb700323a112a2c1d1505150615101911b80018b500012ab40001b9003e01009e000704a7000403b80047b1 -fromDataPre_GFE_9_0_0_0,282,2bb800a04d2bb900a101003e2a2bb8008fb500072ab2000499000e2c2ab40007b800a2a700072cb60008b500072bb900a3010036041504047e99000704a700040336051504057e99000704a700040336062a1504077e99000704a7000403b5003a2bb900a1010036072bb900a1010036082bb900a3010036092bb800913a0a02360b2bb8008f3a0c1509100da0000e2a2bb8008fb50014a700152bb8008f3a0d190dc6000a190db800a4360b2bb8008f3a0d2bb80092b60093360e190db600779e0011bb004f59190d150eb70050a70004013a0f2a15042bb700943610bb003159150715081509150b190c190a190fb700323a112a2c1d1505150615101911b80018b500012ab40001b9003e01009e000704a7000403b80047b1 -toData,34,2a2bb600992ab40001b900190100b20095b60078a1000d2ab6009a2bb9008b0200b1 -toDataPre_GFE_7_1_0_0,271,2ab40001b9003e01009e000704a7000403b800472ab600592bb8009b2b2ab60058b9009c02002ab400072bb80082033d2ab40001b9008301009900071c04803d2ab40001b9007301009900071c05803d2ab4003a9900071c07803d2b1c1100ff7e91b9009d02002b2ab40001b9003d0100b9009c02002b2ab40001b9004b0100b9009c02002b2ab40001b9003e0100b9009d02002ab40001b9004001002bb800852ab40001b9004c01002bb800822ab40001b9003e01003e1d100da0000e2ab400142bb80082a700132ab40001b9003f0100b8009e2bb800822ab40001b9004e01003a041904c70008124da700081904b600862bb800821904c7000911012ca700081904b60087b800882bb80089b1 -toDataPre_GFE_9_0_0_0,266,2ab600592bb8009b2b2ab60058b9009c02002ab400072bb80082033d2ab40001b9008301009900071c04803d2ab40001b9007301009900071c05803d2ab4003a9900071c07803d1c1008803d2b1c1100ff7e91b9009d02002b2ab40001b9003d0100b9009c02002b2ab40001b9004b0100b9009c02002ab40001b9003e01003e2b1db9009d02002ab40001b9004001002bb800852ab40001b9004c01002bb800821d100da0000e2ab400142bb80082a700132ab40001b9003f0100b8009e2bb800822ab40001b9004e01003a041904c70008124da700081904b600862bb800821904c7000911012ca700081904b60087b800882bb800892ab40001b90019010036052b150504b8008ab1 +fromData,38,2a2bb600a02ab6009bb900190100b20096b60067a100112ab400012bb900970200a700044db1 +fromDataPre_GFE_7_1_0_0,282,2bb800a14d2bb900a201003e2a2bb80090b500072ab2000499000e2c2ab40007b800a3a700072cb60008b500072bb900a4010036041504047e99000704a700040336051504057e99000704a700040336062a1504077e99000704a7000403b5001e2bb900a2010036072bb900a2010036082bb900a4010036092bb800923a0a02360b2bb800903a0c1509100da0000e2a2bb80090b50014a700152bb800903a0d190dc6000a190db800a5360b2bb800903a0d2bb80093b60094360e190db6007d9e0011bb004f59190d150eb70050a70004013a0f2a15042bb700953610bb003259150715081509150b190c190a190fb700333a112a2c1d1505150615101911b80018b500012ab40001b9003e01009e000704a7000403b80047b1 +fromDataPre_GFE_9_0_0_0,282,2bb800a14d2bb900a201003e2a2bb80090b500072ab2000499000e2c2ab40007b800a3a700072cb60008b500072bb900a4010036041504047e99000704a700040336051504057e99000704a700040336062a1504077e99000704a7000403b5001e2bb900a2010036072bb900a2010036082bb900a4010036092bb800923a0a02360b2bb800903a0c1509100da0000e2a2bb80090b50014a700152bb800903a0d190dc6000a190db800a5360b2bb800903a0d2bb80093b60094360e190db6007d9e0011bb004f59190d150eb70050a70004013a0f2a15042bb700953610bb003259150715081509150b190c190a190fb700333a112a2c1d1505150615101911b80018b500012ab40001b9003e01009e000704a7000403b80047b1 +toData,34,2a2bb6009a2ab40001b900190100b20096b60067a1000d2ab6009b2bb9008c0200b1 +toDataPre_GFE_7_1_0_0,271,2ab40001b9003e01009e000704a7000403b800472ab600592bb8009c2b2ab60058b9009d02002ab400072bb80083033d2ab40001b9008401009900071c04803d2ab40001b9007901009900071c05803d2ab4001e9900071c07803d2b1c1100ff7e91b9009e02002b2ab40001b9003d0100b9009d02002b2ab40001b9004b0100b9009d02002b2ab40001b9003e0100b9009e02002ab40001b9004001002bb800862ab40001b9004c01002bb800832ab40001b9003e01003e1d100da0000e2ab400142bb80083a700132ab40001b9003f0100b8009f2bb800832ab40001b9004e01003a041904c70008124da700081904b600872bb800831904c7000911012ca700081904b60088b800892bb8008ab1 +toDataPre_GFE_9_0_0_0,266,2ab600592bb8009c2b2ab60058b9009d02002ab400072bb80083033d2ab40001b9008401009900071c04803d2ab40001b9007901009900071c05803d2ab4001e9900071c07803d1c1008803d2b1c1100ff7e91b9009e02002b2ab40001b9003d0100b9009d02002b2ab40001b9004b0100b9009d02002ab40001b9003e01003e2b1db9009e02002ab40001b9004001002bb800862ab40001b9004c01002bb800831d100da0000e2ab400142bb80083a700132ab40001b9003f0100b8009f2bb800832ab40001b9004e01003a041904c70008124da700081904b600872bb800831904c7000911012ca700081904b60088b800892bb8008a2ab40001b90019010036052b150504b8008bb1 org/apache/geode/distributed/internal/membership/NetView,2 fromData,109,2a2bb8006ec0002bb500132a2bb9006f0100b500082a2bb80070b5000bb200409a00122ab4000bc7000bbb004159b70042bf2abb000c592ab4000bb7000db5000e2a2bb80071b500102a2bb80071b500122a2bb80072b500052bb800734d2cc6000d2ab400042cb900180200b1 toData,60,2ab400132bb800682b2ab40008b9006902002a2ab4000b2bb7006a2ab400102bb8006b2ab400122bb8006b2ab400052bb8006c2ab400042bb8006db1 org/apache/geode/distributed/internal/membership/gms/GMSMember,2 -fromData,62,2a2bb6004b2a2bb9004c0100b500072a2bb9004d0100b5003c2a2bb9004d0100b500092a2bb9004c0100b500082a2bb8004eb5000a2a2bb8004fb5000bb1 -toData,62,2a2bb6003f2b2ab40007b9004002002b2ab4003cb9004102002b2ab40009b9004102002b2ab40008b9004002002ab4000a2bb800422ab4000b2bb80043b1 +fromData,62,2a2bb6004b2a2bb9004c0100b500072a2bb9004d0100b5001e2a2bb9004d0100b500092a2bb9004c0100b500082a2bb8004eb5000a2a2bb8004fb5000bb1 +toData,62,2a2bb6003f2b2ab40007b9004002002b2ab4001eb9004102002b2ab40009b9004102002b2ab40008b9004002002ab4000a2bb800422ab4000b2bb80043b1 org/apache/geode/distributed/internal/membership/gms/locator/FindCoordinatorRequest,2 fromData,97,2a2bb8001dc0001ab500022bb9001e01003d2abb001f591cb70020b50005033e1d1ca2001a2ab400052bb8001dc0001ab90021020057840301a7ffe72a2bb9001e0100b500062a2bb9001e0100b500082a2bb80022b500042a2bb80023b50007b1 toData,114,2ab400022bb800142ab40005c6003a2b2ab40005b900150100b9001602002ab40005b9001701004d2cb9001801009900152cb900190100c0001a4e2d2bb80014a7ffe8a7000a2b03b9001602002b2ab40006b9001602002b2ab40008b9001602002ab400042bb8001b2ab400072bb8001cb1 org/apache/geode/distributed/internal/membership/gms/locator/FindCoordinatorResponse,2 -fromData,105,2a2bb80026c00027b500022a2bb80026c00027b500032a2bb80028b5000a2a2bb80029b5000c2a2bb9002a0100b500092ab400099a00342a2bb9002a0100b500042a2bb9002a0100b500072a2bb9002a0100b500082a2bb80026c0002bb500052a2bb8002cb50006b1 -toData,89,2ab400022bb800212ab400032bb800212ab4000a2bb800222ab4000c2bb800232b2ab40009b9002402002b2ab40004b9002402002b2ab40007b9002402002b2ab40008b9002402002ab400052bb800212ab400062bb80025b1 +fromData,105,2a2bb80025c00026b500022a2bb80025c00026b500032a2bb80027b5000a2a2bb80028b5000c2a2bb900290100b500092ab400099a00342a2bb900290100b500042a2bb900290100b500072a2bb900290100b500082a2bb80025c0002ab500052a2bb8002bb50006b1 +toData,89,2ab400022bb800202ab400032bb800202ab4000a2bb800212ab4000c2bb800222b2ab40009b9002302002b2ab40004b9002302002b2ab40007b9002302002b2ab40008b9002302002ab400052bb800202ab400062bb80024b1 org/apache/geode/distributed/internal/membership/gms/locator/GetViewRequest,2 fromData,1,b1 @@ -974,7 +974,7 @@ fromData,171,2a2bb700632bb9006401003d1c047e9900142a2bb900650100b500092ab40009b80 toData,173,2a2bb70070033d2ab400099900081c0480933d2ab40006029f00081c0780933d2ab40007c600081c0580933d2ab4000d9900091c104080933d2b1cb9007102002ab4000999000d2b2ab40009b9007202002ab40006029f000d2b2ab40006b9007202002ab40007c6000b2ab400072bb800732ab4000e99000e2ab400082bb80073a700102ab40008b9005901002bb800732ab4000a2bb800732ab4000cc000742bb800752ab4000b2bb80076b1 org/apache/geode/internal/cache/DistributedRemoveAllOperation$RemoveAllEntryData,1 -toData,136,2ab4000a4d2c2bb8003f2b2ab40010b40040b9004102002ab400063e2ab40022c600081d0780913e2ab40015c600191d100880913e2ab40015c100429900091d102080913e1d108080913e2b1db9004102002ab40022c6000b2ab400222bb8003f2ab40015c6000b2ab400152bb800432ab6002499000b2ab400122bb800432ab400082bb80044b1 +toData,136,2ab4000a4d2c2bb800412b2ab40010b40042b9004302002ab400063e2ab40024c600081d0780913e2ab40015c600191d100880913e2ab40015c100449900091d102080913e1d108080913e2b1db9004302002ab40024c6000b2ab400242bb800412ab40015c6000b2ab400152bb800452ab6002699000b2ab400122bb800452ab400082bb80046b1 org/apache/geode/internal/cache/DistributedRemoveAllOperation$RemoveAllMessage,2 fromData,197,2a2bb700382a2bb80039c0003ab500052a2bb8003b88b500152a2ab40015bd003cb500062ab400159e00722bb8003d4dbb003e59b7003f4e03360415042ab40015a200202ab400061504bb003c592b2ab4000515042c2db7004053840401a7ffdd2bb9004101003604150499002f2bb800423a0503360615062ab40015a2001d2ab4000615063219051506b60043c00044b5002b840601a7ffe02ab400451140007e99000e2a2bb80039c00046b5000b2a2ab400451180007e99000704a7000403b5001ab1 @@ -999,8 +999,8 @@ toData,22,2b2ab40004c10007b9004002002ab400042bb60041b1 org/apache/geode/internal/cache/EventID,4 fromData,53,2a2bb80041b500042bb80041b800424d2a2cb80043b500092a2cb80043b5000b2a2bb900440100b5000c2a2bb900450100b50001b1 fromDataPre_GFE_8_0_0_0,33,2a2bb80041b500042bb80041b800424d2a2cb80043b500092a2cb80043b5000bb1 -toData,93,2bb8003a4d2cb2003bb6003c9d00252a2cb6002e4ebb0010592cb7003d3a042d1904b600151904b600162bb8003ea7000b2ab400042bb8003e2ab400092ab4000bb800382bb8003e2b2ab4000cb9003f02002b2ab40001b900400200b1 -toDataPre_GFE_8_0_0_0,24,2ab400042bb8003e2ab400092ab4000bb800382bb8003eb1 +toData,97,2bb8003c4d2cb20033b600349c00292ab20036b6002e4ebb001059b20036b7003d3a042d1904b600151904b600162bb8003ea7000b2ab400042bb8003e2ab400092ab4000bb8003a2bb8003e2b2ab4000cb9003f02002b2ab40001b900400200b1 +toDataPre_GFE_8_0_0_0,24,2ab400042bb8003e2ab400092ab4000bb8003a2bb8003eb1 org/apache/geode/internal/cache/EventTracker$EventSeqnoHolder,2 fromData,22,2a2bb9000e0100b500042a2bb8000fc00010b50005b1 @@ -1460,8 +1460,8 @@ fromData,115,2a2bb7002e2bb8002fb6000d3d2abb003059b70031b5000403360415041ca200542 toData,121,2a2bb700272ab40004b900280100b800292bb8002a2ab40004b9000601004d014e013a04013a052cb90009010099004b2cb9000a0100c0000b4e2d2bb8002b2cb9000a0100c0000c3a0419042bb8002a1904b6000d360603360715071506a200172cb9000a01003a0519052bb8002c840701a7ffe8a7ffb2b1 org/apache/geode/internal/cache/ha/ThreadIdentifier,2 -fromData,19,2a2bb80028b500022a2bb900290100b50003b1 -toData,19,2ab400022bb8002a2b2ab40003b9002b0300b1 +fromData,19,2a2bb8002db500022a2bb9002e0100b50003b1 +toData,19,2ab400022bb8002f2b2ab40003b900300300b1 org/apache/geode/internal/cache/locks/TXLockBatch,2 fromData,67,2a2bb80014b500032a2bb80015b500052bb9001601003d1c9b002a2abb0008591cb70017b50004033e1d1ca200172ab400042bb80018b90019020057840301a7ffeab1