Jelajahi Sumber

删除操作计算hash值的情况没有考虑,导致删除时的分区和插入时的分区不一致 (#1848)

Marsss___ 6 tahun lalu
induk
melakukan
37fc248ebf

+ 18 - 3
server/src/main/java/com/alibaba/otter/canal/common/MQMessageUtils.java

@@ -230,10 +230,25 @@ public class MQMessageUtils {
                                     }
                                 }
                             } else {
-                                for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
-                                    if (checkPkNamesHasContain(hashMode.pkNames, column.getName())) {
-                                        hashCode = hashCode ^ column.getValue().hashCode();
+                                try {
+                                    CanalEntry.EventType eventType = RowChange.parseFrom(entry.getStoreValue()).getEventType();
+                                    if(eventType == CanalEntry.EventType.DELETE){
+                                        for (CanalEntry.Column column : rowData.getBeforeColumnsList()) {
+                                            if (checkPkNamesHasContain(hashMode.pkNames, column.getName())) {
+                                                hashCode = hashCode ^ column.getValue().hashCode();
+                                            }
+                                        }
                                     }
+                                    else {
+                                        for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
+                                            if (checkPkNamesHasContain(hashMode.pkNames, column.getName())) {
+                                                hashCode = hashCode ^ column.getValue().hashCode();
+                                            }
+                                        }
+                                    }
+                                }
+                                catch (InvalidProtocolBufferException e) {
+                                    e.printStackTrace();
                                 }
                             }