diff options
32 files changed, 398 insertions, 156 deletions
diff --git a/client/js/app/package.json b/client/js/app/package.json index 1cc2432f88f..6de98422514 100644 --- a/client/js/app/package.json +++ b/client/js/app/package.json @@ -25,7 +25,7 @@ "@mantine/notifications": "^5", "@vitejs/plugin-react": "^4", "esbuild-jest": "^0", - "eslint": "^8", + "eslint": "^9.0.0", "eslint-plugin-import": "^2", "eslint-plugin-prettier": "^5", "eslint-plugin-react": "^7", diff --git a/client/js/app/yarn.lock b/client/js/app/yarn.lock index 8993f580fd4..789267f9461 100644 --- a/client/js/app/yarn.lock +++ b/client/js/app/yarn.lock @@ -774,25 +774,25 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== +"@eslint/eslintrc@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.0.2.tgz#36180f8e85bf34d2fe3ccc2261e8e204a411ab4e" + integrity sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" + espree "^10.0.1" + globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.0.0.tgz#1a9e4b4c96d8c7886e0110ed310a0135144a1691" + integrity sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ== "@floating-ui/core@^1.4.2": version "1.5.0" @@ -863,12 +863,12 @@ dependencies: prop-types "^15.8.1" -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.12.3": + version "0.12.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.12.3.tgz#a6216d90f81a30bedd1d4b5d799b47241f318072" + integrity sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -877,10 +877,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1535,11 +1535,6 @@ dependencies: "@types/yargs-parser" "*" -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - "@vitejs/plugin-react@^4": version "4.2.1" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" @@ -1556,7 +1551,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +acorn@^8.11.3: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -2302,13 +2297,6 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -2652,54 +2640,55 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-scope@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc" + integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.3.0: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + +eslint@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.0.0.tgz#6270548758e390343f78c8afd030566d86927d40" + integrity sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/eslintrc" "^3.0.2" + "@eslint/js" "9.0.0" + "@humanwhocodes/config-array" "^0.12.3" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" - doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" + eslint-scope "^8.0.1" + eslint-visitor-keys "^4.0.0" + espree "^10.0.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" + file-entry-cache "^8.0.0" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.19.0" graphemer "^1.4.0" ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" @@ -2709,14 +2698,14 @@ eslint@^8: strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.0.1.tgz#600e60404157412751ba4a6f3a2ee1a42433139f" + integrity sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww== dependencies: - acorn "^8.9.0" + acorn "^8.11.3" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^4.0.0" esprima@^4.0.0: version "4.0.1" @@ -2872,12 +2861,12 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^3.0.4" + flat-cache "^4.0.0" fill-range@^4.0.0: version "4.0.0" @@ -2917,14 +2906,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" + keyv "^4.5.4" flatted@^3.2.9: version "3.3.1" @@ -3061,12 +3049,10 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globalthis@^1.0.3: version "1.0.3" @@ -4104,7 +4090,7 @@ json5@^2.2.2, json5@^2.2.3: object.assign "^4.1.4" object.values "^1.1.6" -keyv@^4.5.3: +keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -4892,13 +4878,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rollup@^4.13.0: version "4.14.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.14.0.tgz#c3e2cd479f1b2358b65c1f810fa05b51603d7be8" @@ -5395,11 +5374,6 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java index eac03531b86..4abd6e89b15 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java @@ -1002,7 +1002,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { return containers; } else if (nodesElement.hasAttribute("count")) // regular, hosted node spec return createNodesFromNodeCount(cluster, containerElement, nodesElement, context); - else if (cluster.isHostedVespa() && cluster.getZone().environment().isManuallyDeployed()) // default to 1 in manual zones + else if (cluster.isHostedVespa()) // default to 1 if node count is not specified return createNodesFromNodeCount(cluster, containerElement, nodesElement, context); else // the non-hosted option return createNodesFromNodeList(context.getDeployState(), cluster, nodesElement); diff --git a/config-model/src/main/resources/schema/containercluster.rnc b/config-model/src/main/resources/schema/containercluster.rnc index f24a1511318..9beaf7b7783 100644 --- a/config-model/src/main/resources/schema/containercluster.rnc +++ b/config-model/src/main/resources/schema/containercluster.rnc @@ -307,7 +307,7 @@ NodesOfContainerCluster = element nodes { attribute type { xsd:string } | ( - attribute count { xsd:positiveInteger | xsd:string } & + attribute count { xsd:positiveInteger | xsd:string }? & attribute flavor { xsd:string }? & attribute required { xsd:boolean }? & attribute exclusive { xsd:boolean }? & diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/JettyContainerModelBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/JettyContainerModelBuilderTest.java index 934606b93ac..c4fc4ee71c6 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/JettyContainerModelBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/JettyContainerModelBuilderTest.java @@ -6,6 +6,7 @@ import com.yahoo.config.model.builder.xml.test.DomBuilderTest; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.deploy.TestProperties; import com.yahoo.config.model.provision.HostsXmlProvisioner; +import com.yahoo.config.model.provision.InMemoryProvisioner; import com.yahoo.config.model.test.MockRoot; import com.yahoo.container.ComponentsConfig; import com.yahoo.container.jdisc.FilterBindingsProvider; @@ -254,25 +255,16 @@ public class JettyContainerModelBuilderTest extends ContainerModelBuilderTestBas " <server port='8080' id='default'>", " </server>", " </http>", - multiNode, + " <nodes count='1' />", "", "</container>"); - String hostsxml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" + - "<hosts>\n" + - " <host name=\"mockhost-1\">\n" + - " <alias>mockhost1</alias>\n" + - " </host>\n" + - " <host name=\"mockhost-2\">\n" + - " <alias>mockhost2</alias>\n" + - " </host>\n" + - "</hosts>\n"; DeployState deployState = new DeployState.Builder() .properties( new TestProperties() .setHostedVespa(true) .setEndpointCertificateSecrets(Optional.of(new EndpointCertificateSecrets("CERT", "KEY")))) - .modelHostProvisioner(new HostsXmlProvisioner(new StringReader(hostsxml))) + .modelHostProvisioner(new InMemoryProvisioner(1, true)) .build(); MockRoot root = new MockRoot("root", deployState); createModel(root, deployState, null, clusterElem); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTestCase.java b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTestCase.java index 69abb10b91d..c7d9ae6b818 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTestCase.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTestCase.java @@ -20,6 +20,9 @@ import com.yahoo.config.model.test.MockApplicationPackage; import com.yahoo.config.model.test.TestDriver; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.Environment; +import com.yahoo.config.provision.RegionName; +import com.yahoo.config.provision.Zone; import com.yahoo.document.config.DocumentmanagerConfig; import com.yahoo.messagebus.MessagebusConfig; import com.yahoo.net.HostName; @@ -309,6 +312,30 @@ public class VespaModelTestCase { assertContainsWarning(logger.msgs, "Directory searchdefinitions/ should not be used for schemas, use schemas/ instead"); } + @Test + void testNoNodesCount() { + var services = + """ + <services version='1.0'> + <container version='1.0' id='default'> + <search/> + <nodes> + <resources disk="24Gb" /> + </nodes> + </container> + </services>"""; + + var app = new MockApplicationPackage.Builder().withServices(services).build(); + var deployState = new DeployState.Builder() + .applicationPackage(app) + .properties(new TestProperties() + .setHostedVespa(true) + .setApplicationId(ApplicationId.from("foo", "bar", "default-t"))) + .build(); + var model = new TestDriver(true).buildModel(deployState); + assertEquals(1, model.getHosts().size()); // node count 1 if not specified + } + private void assertContainsWarning(List<Pair<Level,String>> msgs, String text) { boolean foundCorrectWarning = false; for (var msg : msgs) diff --git a/container-dependency-versions/pom.xml b/container-dependency-versions/pom.xml index bd1cbf8fcf6..8eaa961922d 100644 --- a/container-dependency-versions/pom.xml +++ b/container-dependency-versions/pom.xml @@ -124,7 +124,7 @@ <!-- TODO Vespa 9: stop exporting/providing and move to parent? --> <groupId>com.sun.activation</groupId> <artifactId>javax.activation</artifactId> - <version>1.2.0</version> + <version>${sun.javax.activation.vespa.version}</version> </dependency> <!-- jaxb end --> diff --git a/dependency-versions/pom.xml b/dependency-versions/pom.xml index 9ce3fdc134d..a21620b5cc5 100644 --- a/dependency-versions/pom.xml +++ b/dependency-versions/pom.xml @@ -40,6 +40,7 @@ <jackson2.vespa.version>2.16.2</jackson2.vespa.version> <jackson-databind.vespa.version>${jackson2.vespa.version}</jackson-databind.vespa.version> <jakarta.inject.vespa.version>2.0.1</jakarta.inject.vespa.version> + <javax.activation-api.vespa.version>1.2.0</javax.activation-api.vespa.version> <javax.inject.vespa.version>1</javax.inject.vespa.version> <javax.servlet-api.vespa.version>3.1.0</javax.servlet-api.vespa.version> <javax.ws.rs-api.vespa.version>2.1.1</javax.ws.rs-api.vespa.version> @@ -47,6 +48,7 @@ <jaxb-core.vespa.version>2.3.0.1</jaxb-core.vespa.version> <jaxb-impl.vespa.version>2.3.0</jaxb-impl.vespa.version> <slf4j.vespa.version>1.7.36</slf4j.vespa.version> + <sun.javax.activation.vespa.version>1.2.0</sun.javax.activation.vespa.version> <!-- END Dependencies available from the Jdisc container --> @@ -66,7 +68,7 @@ <assertj.vespa.version>3.25.3</assertj.vespa.version> <!-- Athenz dependencies. Make sure these dependencies match those in Vespa's internal repositories --> - <aws-sdk.vespa.version>1.12.695</aws-sdk.vespa.version> + <aws-sdk.vespa.version>1.12.696</aws-sdk.vespa.version> <athenz.vespa.version>1.11.55</athenz.vespa.version> <!-- Athenz END --> @@ -139,7 +141,7 @@ <protobuf.vespa.version>3.25.3</protobuf.vespa.version> <questdb.vespa.version>7.3.10</questdb.vespa.version> <spifly.vespa.version>1.3.7</spifly.vespa.version> - <spotbugs.vespa.version>4.8.3</spotbugs.vespa.version> <!-- Must match major version in https://github.com/apache/zookeeper/blob/master/pom.xml --> + <spotbugs.vespa.version>4.8.4</spotbugs.vespa.version> <!-- Must match major version in https://github.com/apache/zookeeper/blob/master/pom.xml --> <snappy.vespa.version>1.1.10.5</snappy.vespa.version> <surefire.vespa.version>3.2.5</surefire.vespa.version> <velocity.vespa.version>2.3</velocity.vespa.version> diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java index e038c96bf99..03a713f37f5 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.flags; import com.yahoo.component.Vtag; import com.yahoo.vespa.defaults.Defaults; +import com.yahoo.vespa.flags.custom.RoleList; import java.time.Instant; import java.time.LocalDate; @@ -14,8 +15,6 @@ import java.util.TreeMap; import java.util.function.Predicate; import static com.yahoo.vespa.flags.Dimension.APPLICATION; -import static com.yahoo.vespa.flags.Dimension.ARCHITECTURE; -import static com.yahoo.vespa.flags.Dimension.CLAVE; import static com.yahoo.vespa.flags.Dimension.CLOUD_ACCOUNT; import static com.yahoo.vespa.flags.Dimension.CONSOLE_USER_EMAIL; import static com.yahoo.vespa.flags.Dimension.HOSTNAME; @@ -417,6 +416,12 @@ public class Flags { "Whether to use athenz as node identity provider", "Takes effect on next identity refresh", HOSTNAME); + public static UnboundJacksonFlag<RoleList> ROLE_DEFINITIONS = defineJacksonFlag( + "role-definitions", RoleList.empty(), RoleList.class, + List.of("mortent"), "2024-04-05", "2024-10-01", + "Role definitions for the system", + "Takes effect immediately"); + /** WARNING: public for testing: All flags should be defined in {@link Flags}. */ public static UnboundBooleanFlag defineFeatureFlag(String flagId, boolean defaultValue, List<String> owners, String createdAt, String expiresAt, String description, diff --git a/flags/src/main/java/com/yahoo/vespa/flags/custom/Role.java b/flags/src/main/java/com/yahoo/vespa/flags/custom/Role.java new file mode 100644 index 00000000000..93845b6f59d --- /dev/null +++ b/flags/src/main/java/com/yahoo/vespa/flags/custom/Role.java @@ -0,0 +1,55 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +package com.yahoo.vespa.flags.custom; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; +import java.util.Objects; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(value = JsonInclude.Include.NON_NULL) +public class Role { + @JsonProperty("name") + private final String name; + @JsonProperty("members") + private final List<String> members; + + @JsonCreator + public Role(@JsonProperty("name") String name, @JsonProperty("members") List<String> members) { + this.name = name; + this.members = members; + } + + public String getName() { + return name; + } + + public List<String> getMembers() { + return members; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Role that = (Role) o; + return Objects.equals(name, that.name) && Objects.equals(members, that.members); + } + + @Override + public int hashCode() { + return Objects.hash(name, members); + } + + @Override + public String toString() { + return "RoleDefinition{" + + "name='" + name + '\'' + + ", members=" + members + + '}'; + } +} diff --git a/flags/src/main/java/com/yahoo/vespa/flags/custom/RoleList.java b/flags/src/main/java/com/yahoo/vespa/flags/custom/RoleList.java new file mode 100644 index 00000000000..4e3d14bf076 --- /dev/null +++ b/flags/src/main/java/com/yahoo/vespa/flags/custom/RoleList.java @@ -0,0 +1,45 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +package com.yahoo.vespa.flags.custom; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; +import java.util.Objects; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(value = JsonInclude.Include.NON_NULL) +public class RoleList { + + @JsonProperty("roles") + List<Role> roles; + + @JsonCreator + public RoleList(@JsonProperty("roles") List<Role> roles) { + this.roles = roles; + } + + public List<Role> roles() { + return roles; + } + + public static RoleList empty() { + return new RoleList(List.of()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RoleList roleList = (RoleList) o; + return Objects.equals(roles, roleList.roles); + } + + @Override + public int hashCode() { + return Objects.hash(roles); + } +} diff --git a/flags/src/test/java/com/yahoo/vespa/flags/custom/RoleTest.java b/flags/src/test/java/com/yahoo/vespa/flags/custom/RoleTest.java new file mode 100644 index 00000000000..2b1290f5222 --- /dev/null +++ b/flags/src/test/java/com/yahoo/vespa/flags/custom/RoleTest.java @@ -0,0 +1,56 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +package com.yahoo.vespa.flags.custom; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.yahoo.test.json.Jackson; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RoleTest { + + @Test + void deSerializesCorrectly() throws JsonProcessingException { + String json = """ + { + "roles": [ + { + "name": "role1", + "members": ["u1@example.com", "u2@example.com"] + }, + { + "name": "role2", + "members": [ "u1@example.com" ] + } + ] + } + """; + var mapper = Jackson.mapper(); + RoleList roleList = mapper.readValue(json, RoleList.class); + assertEquals(2, roleList.roles().size()); + Optional<Role> role1 = roleList.roles().stream() + .filter(r -> r.getName().equals("role1")) + .findFirst(); + assertEquals(2, role1.get().getMembers().size()); + + Optional<Role> role2 = roleList.roles().stream() + .filter(r -> r.getName().equals("role2")) + .findFirst(); + assertEquals(1, role2.get().getMembers().size()); + } + + @Test + void serializeCorrectly() throws JsonProcessingException { + Role role1 = new Role("role1", List.of("u1", "u2")); + Role role2 = new Role("role2", List.of("u1")); + RoleList roleList = new RoleList(List.of(role1, role2)); + var mapper = Jackson.mapper(); + String serialized = mapper.writeValueAsString(roleList); + RoleList deserialized = mapper.readValue(serialized, RoleList.class); + assertEquals(roleList, deserialized); + } +}
\ No newline at end of file diff --git a/parent/pom.xml b/parent/pom.xml index ad8e1e0dc13..4b64e0dceda 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -317,7 +317,7 @@ --> <groupId>org.openrewrite.maven</groupId> <artifactId>rewrite-maven-plugin</artifactId> - <version>5.27.0</version> + <version>5.28.0</version> <configuration> <activeRecipes> <recipe>org.openrewrite.java.testing.junit5.JUnit5BestPractices</recipe> diff --git a/searchlib/src/tests/attribute/direct_multi_term_blueprint/direct_multi_term_blueprint_test.cpp b/searchlib/src/tests/attribute/direct_multi_term_blueprint/direct_multi_term_blueprint_test.cpp index 1d66c59d2c9..196b1cbb475 100644 --- a/searchlib/src/tests/attribute/direct_multi_term_blueprint/direct_multi_term_blueprint_test.cpp +++ b/searchlib/src/tests/attribute/direct_multi_term_blueprint/direct_multi_term_blueprint_test.cpp @@ -435,4 +435,13 @@ TEST_P(DirectMultiTermBlueprintTest, hash_filter_with_string_folding_used_for_no expect_hits({30, 31, 40, 41}, *itr); } +TEST_P(DirectMultiTermBlueprintTest, supports_more_than_64k_btree_iterators) { + setup(false, true); + std::vector<int64_t> term_values(std::numeric_limits<uint16_t>::max() + 1, 3); + add_terms(term_values); + auto itr = create_leaf_search(); + EXPECT_THAT(itr->asString(), StartsWith(resolve_iterator_with_unpack())); + expect_hits({30, 31}, *itr); +} + GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchlib/src/vespa/searchlib/attribute/posting_iterator_pack.cpp b/searchlib/src/vespa/searchlib/attribute/posting_iterator_pack.cpp index 662d77dd5d7..93bc4735916 100644 --- a/searchlib/src/vespa/searchlib/attribute/posting_iterator_pack.cpp +++ b/searchlib/src/vespa/searchlib/attribute/posting_iterator_pack.cpp @@ -6,27 +6,34 @@ namespace search { -template <typename IteratorType> -PostingIteratorPack<IteratorType>::~PostingIteratorPack() = default; +template <typename IteratorType, typename RefType> +PostingIteratorPack<IteratorType, RefType>::~PostingIteratorPack() = default; -template <typename IteratorType> -PostingIteratorPack<IteratorType>::PostingIteratorPack(std::vector<IteratorType> &&children) +template <typename IteratorType, typename RefType> +PostingIteratorPack<IteratorType, RefType>::PostingIteratorPack(std::vector<IteratorType> &&children) : _children(std::move(children)) { assert(_children.size() <= std::numeric_limits<ref_t>::max()); } -template <typename IteratorType> +template <typename IteratorType, typename RefType> +bool +PostingIteratorPack<IteratorType, RefType>::can_handle_iterators(size_t num_iterators) +{ + return num_iterators <= std::numeric_limits<ref_t>::max(); +} + +template <typename IteratorType, typename RefType> std::unique_ptr<BitVector> -PostingIteratorPack<IteratorType>::get_hits(uint32_t begin_id, uint32_t end_id) { +PostingIteratorPack<IteratorType, RefType>::get_hits(uint32_t begin_id, uint32_t end_id) { BitVector::UP result(BitVector::create(begin_id, end_id)); or_hits_into(*result, begin_id); return result; } -template <typename IteratorType> +template <typename IteratorType, typename RefType> void -PostingIteratorPack<IteratorType>::or_hits_into(BitVector &result, uint32_t begin_id) { +PostingIteratorPack<IteratorType, RefType>::or_hits_into(BitVector &result, uint32_t begin_id) { for (size_t i = 0; i < size(); ++i) { uint32_t docId = get_docid(i); if (begin_id > docId) { @@ -41,12 +48,21 @@ PostingIteratorPack<IteratorType>::or_hits_into(BitVector &result, uint32_t begi template <> int32_t -PostingIteratorPack<DocidIterator>::get_weight(ref_t, uint32_t) +PostingIteratorPack<DocidIterator, uint16_t>::get_weight(ref_t, uint32_t) +{ + return 1; +} + +template <> +int32_t +PostingIteratorPack<DocidIterator, uint32_t>::get_weight(ref_t, uint32_t) { return 1; } -template class PostingIteratorPack<DocidIterator>; -template class PostingIteratorPack<DocidWithWeightIterator>; +template class PostingIteratorPack<DocidIterator, uint16_t>; +template class PostingIteratorPack<DocidIterator, uint32_t>; +template class PostingIteratorPack<DocidWithWeightIterator, uint16_t>; +template class PostingIteratorPack<DocidWithWeightIterator, uint32_t>; } diff --git a/searchlib/src/vespa/searchlib/attribute/posting_iterator_pack.h b/searchlib/src/vespa/searchlib/attribute/posting_iterator_pack.h index 28150730bad..7c6b85dd3ec 100644 --- a/searchlib/src/vespa/searchlib/attribute/posting_iterator_pack.h +++ b/searchlib/src/vespa/searchlib/attribute/posting_iterator_pack.h @@ -12,13 +12,13 @@ class BitVector; /** * Class that wraps a set of underlying low-level posting lists and provides an API to search in them. */ -template <typename IteratorType> +template <typename IteratorType, typename RefType> class PostingIteratorPack { private: std::vector<IteratorType> _children; public: - using ref_t = uint16_t; + using ref_t = RefType; PostingIteratorPack() noexcept : _children() {} PostingIteratorPack(PostingIteratorPack &&rhs) noexcept = default; PostingIteratorPack &operator=(PostingIteratorPack &&rhs) noexcept = default; @@ -26,6 +26,8 @@ public: explicit PostingIteratorPack(std::vector<IteratorType> &&children); ~PostingIteratorPack(); + static bool can_handle_iterators(size_t num_iterators); + uint32_t get_docid(ref_t ref) const { return _children[ref].valid() ? _children[ref].getKey() : endDocId; } @@ -59,8 +61,10 @@ private: } }; -using DocidIteratorPack = PostingIteratorPack<DocidIterator>; -using DocidWithWeightIteratorPack = PostingIteratorPack<DocidWithWeightIterator>; +using DocidIteratorPack = PostingIteratorPack<DocidIterator, uint16_t>; +using DocidIteratorPackUint32 = PostingIteratorPack<DocidIterator, uint32_t>; +using DocidWithWeightIteratorPack = PostingIteratorPack<DocidWithWeightIterator, uint16_t>; +using DocidWithWeightIteratorPackUint32 = PostingIteratorPack<DocidWithWeightIterator, uint32_t>; } diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp index fdea54424de..5b3a67d7b5e 100644 --- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp @@ -8,18 +8,23 @@ namespace search::queryeval { -SearchIteratorPack::~SearchIteratorPack() = default; +template <typename RefType> +SearchIteratorPackT<RefType>::~SearchIteratorPackT() = default; -SearchIteratorPack::SearchIteratorPack() = default; +template <typename RefType> +SearchIteratorPackT<RefType>::SearchIteratorPackT() = default; -SearchIteratorPack::SearchIteratorPack(SearchIteratorPack &&rhs) noexcept = default; +template <typename RefType> +SearchIteratorPackT<RefType>::SearchIteratorPackT(SearchIteratorPackT<RefType> &&rhs) noexcept = default; -SearchIteratorPack & -SearchIteratorPack::operator=(SearchIteratorPack &&rhs) noexcept = default; +template <typename RefType> +SearchIteratorPackT<RefType> & +SearchIteratorPackT<RefType>::operator=(SearchIteratorPackT<RefType> &&rhs) noexcept = default; -SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &children, - const std::vector<fef::TermFieldMatchData*> &childMatch, - MatchDataUP md) +template <typename RefType> +SearchIteratorPackT<RefType>::SearchIteratorPackT(const std::vector<SearchIterator*> &children, + const std::vector<fef::TermFieldMatchData*> &childMatch, + MatchDataUP md) : _children(), _childMatch(childMatch), _md(std::move(md)) @@ -32,12 +37,21 @@ SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &child assert(_children.size() <= std::numeric_limits<ref_t>::max()); } -SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &children, MatchDataUP md) - : SearchIteratorPack(children, std::vector<fef::TermFieldMatchData*>(), MatchDataUP(std::move(md))) +template <typename RefType> +SearchIteratorPackT<RefType>::SearchIteratorPackT(const std::vector<SearchIterator*> &children, MatchDataUP md) + : SearchIteratorPackT(children, std::vector<fef::TermFieldMatchData*>(), MatchDataUP(std::move(md))) { } +template <typename RefType> +bool +SearchIteratorPackT<RefType>::can_handle_iterators(size_t num_iterators) +{ + return num_iterators <= std::numeric_limits<ref_t>::max(); +} + +template <typename RefType> std::unique_ptr<BitVector> -SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) const { +SearchIteratorPackT<RefType>::get_hits(uint32_t begin_id, uint32_t end_id) const { BitVector::UP result = TermwiseHelper::orChildren(_children.begin(), _children.end(), begin_id); if (! result ) { result = BitVector::create(begin_id, end_id); @@ -45,10 +59,13 @@ SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) const { return result; } +template <typename RefType> void -SearchIteratorPack::or_hits_into(BitVector &result, uint32_t begin_id) const { +SearchIteratorPackT<RefType>::or_hits_into(BitVector &result, uint32_t begin_id) const { TermwiseHelper::orChildren(result, _children.begin(), _children.end(), begin_id); } +template class SearchIteratorPackT<uint16_t>; +template class SearchIteratorPackT<uint32_t>; } diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h index 0a1b140f28a..f05bf8e1adc 100644 --- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h +++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h @@ -9,7 +9,8 @@ namespace search::fef { class MatchData; } namespace search::queryeval { -class SearchIteratorPack +template <typename RefType> +class SearchIteratorPackT { private: using MatchDataUP = std::unique_ptr<fef::MatchData>; @@ -18,19 +19,21 @@ private: MatchDataUP _md; public: - using ref_t = uint16_t; - SearchIteratorPack(); - ~SearchIteratorPack(); - SearchIteratorPack(SearchIteratorPack &&rhs) noexcept; - SearchIteratorPack &operator=(SearchIteratorPack &&rhs) noexcept; + using ref_t = RefType; + SearchIteratorPackT(); + ~SearchIteratorPackT(); + SearchIteratorPackT(SearchIteratorPackT<RefType> &&rhs) noexcept; + SearchIteratorPackT<RefType> &operator=(SearchIteratorPackT<RefType> &&rhs) noexcept; // TODO: use MultiSearch::Children to pass ownership - SearchIteratorPack(const std::vector<SearchIterator*> &children, - const std::vector<fef::TermFieldMatchData*> &childMatch, - MatchDataUP md); + SearchIteratorPackT(const std::vector<SearchIterator*> &children, + const std::vector<fef::TermFieldMatchData*> &childMatch, + MatchDataUP md); // TODO: use MultiSearch::Children to pass ownership - SearchIteratorPack(const std::vector<SearchIterator*> &children, MatchDataUP md); + SearchIteratorPackT(const std::vector<SearchIterator*> &children, MatchDataUP md); + + static bool can_handle_iterators(size_t num_iterators); uint32_t get_docid(ref_t ref) const { return _children[ref]->getDocId(); @@ -60,5 +63,8 @@ public: void or_hits_into(BitVector &result, uint32_t begin_id) const; }; +using SearchIteratorPack = SearchIteratorPackT<uint16_t>; +using SearchIteratorPackUint32 = SearchIteratorPackT<uint32_t>; + } diff --git a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp index 0be014474d0..6a93c2fe322 100644 --- a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp @@ -196,11 +196,21 @@ WeightedSetTermSearch::create(const std::vector<SearchIterator *> &children, fef::MatchData::UP match_data) { if (children.size() < 128) { - return create_helper<vespalib::LeftArrayHeap, SearchIteratorPack>(tmd, is_filter_search, std::cref(weights), - SearchIteratorPack(children, std::move(match_data))); + if (SearchIteratorPack::can_handle_iterators(children.size())) { + return create_helper<vespalib::LeftArrayHeap, SearchIteratorPack>(tmd, is_filter_search, std::cref(weights), + SearchIteratorPack(children, std::move(match_data))); + } else { + return create_helper<vespalib::LeftArrayHeap, SearchIteratorPackUint32>(tmd, is_filter_search, std::cref(weights), + SearchIteratorPackUint32(children, std::move(match_data))); + } + } + if (SearchIteratorPack::can_handle_iterators(children.size())) { + return create_helper<vespalib::LeftHeap, SearchIteratorPack>(tmd, is_filter_search, std::cref(weights), + SearchIteratorPack(children, std::move(match_data))); + } else { + return create_helper<vespalib::LeftHeap, SearchIteratorPackUint32>(tmd, is_filter_search, std::cref(weights), + SearchIteratorPackUint32(children, std::move(match_data))); } - return create_helper<vespalib::LeftHeap, SearchIteratorPack>(tmd, is_filter_search, std::cref(weights), - SearchIteratorPack(children, std::move(match_data))); } namespace { @@ -228,7 +238,11 @@ WeightedSetTermSearch::create(fef::TermFieldMatchData& tmd, std::variant<std::reference_wrapper<const std::vector<int32_t>>, std::vector<int32_t>> weights, std::vector<DocidIterator>&& iterators) { - return create_helper_resolve_pack<DocidIterator, DocidIteratorPack>(tmd, is_filter_search, std::move(weights), std::move(iterators)); + if (DocidIteratorPack::can_handle_iterators(iterators.size())) { + return create_helper_resolve_pack<DocidIterator, DocidIteratorPack>(tmd, is_filter_search, std::move(weights), std::move(iterators)); + } else { + return create_helper_resolve_pack<DocidIterator, DocidIteratorPackUint32>(tmd, is_filter_search, std::move(weights), std::move(iterators)); + } } SearchIterator::UP @@ -237,7 +251,11 @@ WeightedSetTermSearch::create(fef::TermFieldMatchData &tmd, std::variant<std::reference_wrapper<const std::vector<int32_t>>, std::vector<int32_t>> weights, std::vector<DocidWithWeightIterator> &&iterators) { - return create_helper_resolve_pack<DocidWithWeightIterator, DocidWithWeightIteratorPack>(tmd, is_filter_search, std::move(weights), std::move(iterators)); + if (DocidWithWeightIteratorPack::can_handle_iterators(iterators.size())) { + return create_helper_resolve_pack<DocidWithWeightIterator, DocidWithWeightIteratorPack>(tmd, is_filter_search, std::move(weights), std::move(iterators)); + } else { + return create_helper_resolve_pack<DocidWithWeightIterator, DocidWithWeightIteratorPackUint32>(tmd, is_filter_search, std::move(weights), std::move(iterators)); + } } namespace { diff --git a/vespa-dependencies-enforcer/allowed-maven-dependencies.txt b/vespa-dependencies-enforcer/allowed-maven-dependencies.txt index fd7baf675b6..1ad000b6830 100644 --- a/vespa-dependencies-enforcer/allowed-maven-dependencies.txt +++ b/vespa-dependencies-enforcer/allowed-maven-dependencies.txt @@ -31,7 +31,7 @@ com.google.protobuf:protobuf-java:${protobuf.vespa.version} com.ibm.icu:icu4j:${icu4j.vespa.version} com.microsoft.onnxruntime:onnxruntime:${onnxruntime.vespa.version} de.kherud:llama:${kherud.llama.vespa.version} -com.sun.activation:javax.activation:1.2.0 +com.sun.activation:javax.activation:${sun.javax.activation.vespa.version} com.sun.istack:istack-commons-runtime:4.1.2 com.sun.xml.bind:jaxb-core:${jaxb-core.vespa.version} com.sun.xml.bind:jaxb-impl:${jaxb-impl.vespa.version} @@ -74,7 +74,7 @@ io.prometheus:simpleclient_tracer_common:${prometheus.client.vespa.version} io.prometheus:simpleclient_tracer_otel:${prometheus.client.vespa.version} io.prometheus:simpleclient_tracer_otel_agent:${prometheus.client.vespa.version} jakarta.inject:jakarta.inject-api:${jakarta.inject.vespa.version} -javax.activation:javax.activation-api:1.2.0 +javax.activation:javax.activation-api:${javax.activation-api.vespa.version} javax.annotation:javax.annotation-api:${javax.annotation.vespa.version} javax.inject:javax.inject:${javax.inject.vespa.version} javax.servlet:javax.servlet-api:${javax.servlet-api.vespa.version} diff --git a/zkfacade/pom.xml b/zkfacade/pom.xml index 02be1006bc3..6e46fe35801 100644 --- a/zkfacade/pom.xml +++ b/zkfacade/pom.xml @@ -77,8 +77,6 @@ <configuration> <compilerArgs> <arg>-Xlint:all</arg> - <arg>-Xlint:-serial</arg> - <arg>-Xlint:-try</arg> </compilerArgs> </configuration> </plugin> diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/NodeCacheWrapper.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/NodeCacheWrapper.java index d69ddb2f1c8..3be55af601d 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/NodeCacheWrapper.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/NodeCacheWrapper.java @@ -15,8 +15,10 @@ import java.io.IOException; */ class NodeCacheWrapper implements Curator.FileCache { + @SuppressWarnings("deprecation") private final NodeCache wrapped; + @SuppressWarnings("deprecation") public NodeCacheWrapper(CuratorFramework curatorFramework, String path, boolean dataIsCompressed) { wrapped = new NodeCache(curatorFramework, path, dataIsCompressed); } diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/PathChildrenCacheWrapper.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/PathChildrenCacheWrapper.java index 644334a6fe0..9de672ee64d 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/PathChildrenCacheWrapper.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/PathChildrenCacheWrapper.java @@ -18,12 +18,15 @@ import java.util.concurrent.ExecutorService; */ class PathChildrenCacheWrapper implements Curator.DirectoryCache { + @SuppressWarnings("deprecation") private final PathChildrenCache wrapped; + @SuppressWarnings("deprecation") public PathChildrenCacheWrapper(CuratorFramework curatorFramework, String path, boolean cacheData, boolean dataIsCompressed, ExecutorService executorService) { wrapped = new PathChildrenCache(curatorFramework, path, cacheData, dataIsCompressed, executorService); } + @SuppressWarnings("deprecation") @Override public void start() { try { diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/SingletonManager.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/SingletonManager.java index 35fc9f06eec..f1ba9c54514 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/SingletonManager.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/SingletonManager.java @@ -100,7 +100,7 @@ class SingletonManager { } public synchronized CompletableFuture<?> shutdown() { - CompletableFuture<?>[] futures = new CompletableFuture[registrations.size()]; + CompletableFuture<?>[] futures = new CompletableFuture<?>[registrations.size()]; int i = 0; for (SingletonWorker singleton : List.copyOf(registrations.keySet())) { String id = registrations.get(singleton); diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCuratorFramework.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCuratorFramework.java index b04cf5840de..4732016e428 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCuratorFramework.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCuratorFramework.java @@ -210,6 +210,7 @@ public class MockCuratorFramework implements CuratorFramework { @Override public GetConfigBuilder getConfig() { throw new UnsupportedOperationException("Not implemented in MockCurator"); } + @Deprecated @Override public CuratorTransaction inTransaction() { return new MockCuratorTransactionFinal(); @@ -221,6 +222,7 @@ public class MockCuratorFramework implements CuratorFramework { @Override public TransactionOp transactionOp() { throw new UnsupportedOperationException("Not implemented in MockCurator"); } + @Deprecated @Override public RemoveWatchesBuilder watches() { throw new UnsupportedOperationException("Not implemented in MockCurator"); } @@ -309,6 +311,7 @@ public class MockCuratorFramework implements CuratorFramework { return new EnsurePath(path); } + @Deprecated @Override public void clearWatcherReferences(Watcher watcher) { throw new UnsupportedOperationException("Not implemented in MockCurator"); diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorCreateOperation.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorCreateOperation.java index 633fd9a7a20..99669007d06 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorCreateOperation.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorCreateOperation.java @@ -34,6 +34,7 @@ class CuratorCreateOperation implements CuratorOperation { } @Override + @SuppressWarnings("deprecation") public CuratorTransaction and(CuratorTransaction transaction) throws Exception { if (data.isPresent()) { return transaction.create().forPath(path, data.get()).and(); diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorDeleteOperation.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorDeleteOperation.java index aa1bffd4174..f4e1d909e21 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorDeleteOperation.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorDeleteOperation.java @@ -33,6 +33,7 @@ class CuratorDeleteOperation implements CuratorOperation { return false; } + @SuppressWarnings("deprecation") @Override public CuratorTransaction and(CuratorTransaction transaction) throws Exception { return transaction.delete().forPath(path).and(); diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorOperation.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorOperation.java index 7c332f4675c..17d09bcbcde 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorOperation.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorOperation.java @@ -20,6 +20,7 @@ public interface CuratorOperation extends Transaction.Operation { * @return the transaction, for chaining. * @throws Exception if unable to create transaction for this operation. */ + @SuppressWarnings("deprecation") CuratorTransaction and(CuratorTransaction transaction) throws Exception; /** diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorSetDataOperation.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorSetDataOperation.java index 116daf1e359..b8cfa54623e 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorSetDataOperation.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorSetDataOperation.java @@ -28,6 +28,7 @@ class CuratorSetDataOperation implements CuratorOperation { } @Override + @SuppressWarnings("deprecation") public CuratorTransaction and(CuratorTransaction transaction) throws Exception { return transaction.setData().forPath(path, data).and(); } diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorTransaction.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorTransaction.java index 3026a90cea7..21a2071900d 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorTransaction.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/transaction/CuratorTransaction.java @@ -52,6 +52,7 @@ public class CuratorTransaction extends AbstractTransaction { /** Commits this transaction. If it is not already prepared this will prepare it first */ @Override + @SuppressWarnings("deprecation") public void commit() { try { if ( ! prepared) diff --git a/zookeeper-server/zookeeper-server-3.9.2/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperAdminImpl.java b/zookeeper-server/zookeeper-server-3.9.2/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperAdminImpl.java index 1f15c758583..c74a020bcf4 100644 --- a/zookeeper-server/zookeeper-server-3.9.2/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperAdminImpl.java +++ b/zookeeper-server/zookeeper-server-3.9.2/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperAdminImpl.java @@ -26,6 +26,8 @@ public class VespaZooKeeperAdminImpl implements VespaZooKeeperAdmin { private static final Logger log = java.util.logging.Logger.getLogger(VespaZooKeeperAdminImpl.class.getName()); + + @SuppressWarnings("try") @Override public void reconfigure(String connectionSpec, String servers) throws ReconfigException { try (ZooKeeperAdmin zooKeeperAdmin = createAdmin(connectionSpec)) { @@ -58,6 +60,7 @@ public class VespaZooKeeperAdminImpl implements VespaZooKeeperAdmin { } /** Creates a node in zookeeper, with hostname as part of node name, this ensures that server is up and working before returning */ + @SuppressWarnings("try") void createDummyNode(ZookeeperServerConfig zookeeperServerConfig) { int sleepTime = 2_000; try (ZooKeeperAdmin zooKeeperAdmin = createAdmin(localConnectionSpec(zookeeperServerConfig))) { diff --git a/zookeeper-server/zookeeper-server/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperAdminImpl.java b/zookeeper-server/zookeeper-server/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperAdminImpl.java index 1f15c758583..891a35582b3 100644 --- a/zookeeper-server/zookeeper-server/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperAdminImpl.java +++ b/zookeeper-server/zookeeper-server/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperAdminImpl.java @@ -26,6 +26,7 @@ public class VespaZooKeeperAdminImpl implements VespaZooKeeperAdmin { private static final Logger log = java.util.logging.Logger.getLogger(VespaZooKeeperAdminImpl.class.getName()); + @SuppressWarnings("try") @Override public void reconfigure(String connectionSpec, String servers) throws ReconfigException { try (ZooKeeperAdmin zooKeeperAdmin = createAdmin(connectionSpec)) { @@ -58,6 +59,7 @@ public class VespaZooKeeperAdminImpl implements VespaZooKeeperAdmin { } /** Creates a node in zookeeper, with hostname as part of node name, this ensures that server is up and working before returning */ + @SuppressWarnings("try") void createDummyNode(ZookeeperServerConfig zookeeperServerConfig) { int sleepTime = 2_000; try (ZooKeeperAdmin zooKeeperAdmin = createAdmin(localConnectionSpec(zookeeperServerConfig))) { |