{"record":{"id":"b36ad45c0385a95f","repo":"alibaba/canal","slug":"unsupport-indexmode-for","errorCode":null,"errorMessage":"unsupport indexMode for {}","messagePattern":"unsupport indexMode for (.+?)","errorType":"validation","errorClass":"CanalException","httpStatus":null,"severity":"error","filePath":"instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java","lineNumber":462,"sourceCode":"        if (indexMode.isMemory()) {\n            logPositionManager = new MemoryLogPositionManager();\n        } else if (indexMode.isZookeeper()) {\n            logPositionManager = new ZooKeeperLogPositionManager(getZkclientx());\n        } else if (indexMode.isMixed()) {\n            MemoryLogPositionManager memoryLogPositionManager = new MemoryLogPositionManager();\n            ZooKeeperLogPositionManager zooKeeperLogPositionManager = new ZooKeeperLogPositionManager(getZkclientx());\n            logPositionManager = new PeriodMixedLogPositionManager(memoryLogPositionManager,\n                zooKeeperLogPositionManager,\n                1000L);\n        } else if (indexMode.isMeta()) {\n            logPositionManager = new MetaLogPositionManager(metaManager);\n        } else if (indexMode.isMemoryMetaFailback()) {\n            MemoryLogPositionManager primary = new MemoryLogPositionManager();\n            MetaLogPositionManager secondary = new MetaLogPositionManager(metaManager);\n\n            logPositionManager = new FailbackLogPositionManager(primary, secondary);\n        } else {\n            throw new CanalException(\"unsupport indexMode for \" + indexMode);\n        }\n\n        logger.info(\"init logPositionManager end! \\n\\t load CanalLogPositionManager:{}\", logPositionManager.getClass()\n            .getName());\n\n        return logPositionManager;\n    }\n\n    protected void startEventParserInternal(CanalEventParser eventParser, boolean isGroup) {\n        if (eventParser instanceof AbstractEventParser) {\n            AbstractEventParser abstractEventParser = (AbstractEventParser) eventParser;\n            abstractEventParser.setAlarmHandler(getAlarmHandler());\n        }\n\n        super.startEventParserInternal(eventParser, isGroup);\n    }\n\n    private int getGroupSize() {","sourceCodeStart":444,"sourceCodeEnd":480,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java#L444-L480","documentation":"The terminal else-branch in initLogPositionManager() (CanalInstanceWithManager.java:461-462): thrown when IndexMode is none of MEMORY, ZOOKEEPER, MIXED, META, or MEMORY_META_FAILBACK. The IndexMode enum defines exactly those five values and the standard parser rejects unknown names earlier, so this branch is effectively unreachable on stock canal — it is a defensive fallback for a future enum constant lacking a manager implementation.","triggerScenarios":"A new IndexMode constant is added without a branch in initLogPositionManager, or a custom CanalParameter returns an IndexMode whose is*() methods all return false. With stock canal no configuration string reaches this line because the enum parse would fail first.","commonSituations":"Practically unseen on stock canal; only on forks extending IndexMode or via reflection-injected test parameters. A live occurrence implies a customized build.","solutions":["On a fork, give every IndexMode constant a branch in initLogPositionManager (or revert the enum).","On stock canal, confirm canal.instance.indexMode is one of MEMORY/ZOOKEEPER/MIXED/META/MEMORY_META_FAILBACK.","For mocked CanalParameter in tests, return IndexMode.MEMORY."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"CanalParameter.IndexMode m = parameters.getIndexMode();\nif (!(m.isMemory() || m.isZookeeper() || m.isMixed() || m.isMeta() || m.isMemoryMetaFailback())) {\n    throw new IllegalArgumentException(\"Unsupported canal.instance.indexMode: \" + m);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Restrict canal.instance.indexMode to MEMORY/ZOOKEEPER/MIXED/META/MEMORY_META_FAILBACK.","On a fork extending IndexMode, add the matching branch in initLogPositionManager.","Use mocked IndexMode.MEMORY in tests."],"tags":["configuration","index-mode","log-position","enum","instance-manager","defensive"],"backgroundTag":null,"analyzedSha":"87be50e87686a3e8af08c368d0e1ffd1f59eb04a","analyzedAt":"2026-08-14T04:30:11.918Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}