{"record":{"id":"e640b8aa378a7e9c","repo":"pinpoint-apm/pinpoint","slug":"invalid-params","errorCode":null,"errorMessage":"invalid params","messagePattern":"invalid params","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"commons-hbase/src/main/java/com/navercorp/pinpoint/common/hbase/async/HbaseAsyncCacheConfiguration.java","lineNumber":59,"sourceCode":"    @Bean\n    public KeyGenerator tableNameAndPoolKeyGenerator() {\n        return new TableNameAndPoolKeyGenerator();\n    }\n\n    private static class TableNameAndPoolKeyGenerator implements KeyGenerator {\n\n        @Override\n        public Object generate(Object target, Method method, Object... params) {\n            final int length = params.length;\n            if (length == 1) {\n                TableName tableName = (TableName) params[0];\n                return new TableNameAndPoolKey(tableName);\n            } else if (length == 2) {\n                TableName tableName = (TableName) params[0];\n                ExecutorService executorService = (ExecutorService) params[1];\n                return new TableNameAndPoolKey(tableName, executorService);\n            }\n            throw new IllegalArgumentException(\"invalid params\");\n        }\n\n        private static class TableNameAndPoolKey {\n            private final TableName tableName;\n            private final ExecutorService pool;\n\n            public TableNameAndPoolKey(TableName tableName) {\n                this.tableName = Objects.requireNonNull(tableName, \"tableName\");\n                this.pool = null;\n            }\n\n            public TableNameAndPoolKey(TableName tableName, ExecutorService pool) {\n                this.tableName = Objects.requireNonNull(tableName, \"tableName\");\n                this.pool = Objects.requireNonNull(pool, \"pool\");\n            }\n\n            @Override\n            public boolean equals(Object o) {","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/commons-hbase/src/main/java/com/navercorp/pinpoint/common/hbase/async/HbaseAsyncCacheConfiguration.java#L41-L77","documentation":"HbaseAsyncCacheConfiguration's cache key generator (generate) builds a key from the executor method's parameter list: either a table name alone (length 1) or a table name plus ExecutorService pool (length 2). Any other parameter signature is unsupported and fails fast with IllegalArgumentException, because the async cache cannot derive a key from it.","triggerScenarios":"Invoking an HBase async template method whose parameters are not exactly (TableName) or (TableName, ExecutorService), causing the cache KeyGenerator to receive params of length 0 or >= 3.","commonSituations":"Calling a custom/extended async HBase API method with extra arguments that the shipped KeyGenerator was never taught to hash; pinpoint code changes adding parameters to async put/get without updating HbaseAsyncCacheConfiguration.","solutions":["Call only supported async method signatures: (TableName) or (TableName, ExecutorService)","Extend HbaseAsyncCacheConfiguration's key generator to handle your new parameter shape","Remove extra arguments and pass configuration via other means (fields, config properties)"],"exampleFix":"// before\nasyncTemplate.put(tableName, executor, extraCallback, family);\n// after\nasyncTemplate.put(tableName, executor);","handlingStrategy":"type-guard","validationCode":"Object[] params = invocation.getArguments();\nif (params.length != 1 && params.length != 2) throw new IllegalArgumentException(\"unsupported async key params: \" + params.length);\nif (params.length >= 1 && !(params[0] instanceof TableName)) throw new IllegalArgumentException(\"first param must be TableName\");\nif (params.length == 2 && !(params[1] instanceof ExecutorService)) throw new IllegalArgumentException(\"second param must be ExecutorService\");","typeGuard":"static boolean isSupportedAsyncSignature(Object[] params) {\n    return (params.length == 1 && params[0] instanceof TableName)\n        || (params.length == 2 && params[0] instanceof TableName && params[1] instanceof ExecutorService);\n}","tryCatchPattern":null,"preventionTips":["Only call documented async HBase template signatures (TableName, optionally ExecutorService)","Update HbaseAsyncCacheConfiguration whenever async method parameters change","Review KeyGenerator coverage in code review for new async APIs"],"tags":["hbase","async","cache-key","argument-validation"],"backgroundTag":"invalid-argument","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}