Explorar o código

fixed issue #724 , retry for broke pipe

七锋 %!s(int64=7) %!d(string=hai) anos
pai
achega
3efd589cb1

+ 17 - 6
parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/DatabaseTableMeta.java

@@ -298,13 +298,24 @@ public class DatabaseTableMeta implements TableMetaTSDB {
                 createDDL = packet.getFieldValues().get(1);
                 tableMetaFromDB.setFields(TableMetaCache.parseTableMeta(schema, table, packet));
             }
-        } catch (IOException e) {
-            if (e.getMessage().contains("errorNumber=1146")) {
-                logger.error("table not exist in db , pls check :" + getFullName(schema, table) + " , mem : "
-                             + tableMetaFromMem);
-                return false;
+        } catch (Throwable e) {
+            try {
+                // retry for broke pipe, see:
+                // https://github.com/alibaba/canal/issues/724
+                connection.reconnect();
+                ResultSetPacket packet = connection.query("show create table " + getFullName(schema, table));
+                if (packet.getFieldValues().size() > 1) {
+                    createDDL = packet.getFieldValues().get(1);
+                    tableMetaFromDB.setFields(TableMetaCache.parseTableMeta(schema, table, packet));
+                }
+            } catch (IOException e1) {
+                if (e.getMessage().contains("errorNumber=1146")) {
+                    logger.error("table not exist in db , pls check :" + getFullName(schema, table) + " , mem : "
+                                 + tableMetaFromMem);
+                    return false;
+                }
+                throw new CanalParseException(e);
             }
-            throw new CanalParseException(e);
         }
 
         boolean result = compareTableMeta(tableMetaFromMem, tableMetaFromDB);