Merge branch 'main' into adapter-jdbc

This commit is contained in:
Madhavan Sridharan
2023-02-07 21:43:10 -05:00
68 changed files with 1265 additions and 429 deletions

484
.all-contributorsrc Normal file
View File

@@ -0,0 +1,484 @@
{
"projectOwner": "nosqlbench",
"projectName": "nosqlbench",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"CONTRIBUTING.md"
],
"imageSize": 50,
"commit": false,
"commitConvention": "angular",
"contributorsPerLine": 6,
"contributorsSortAlphabetically": false,
"linkToUsage": false,
"skipCi": true,
"contributors": [
{
"login": "jshook",
"name": "Jonathan Shook",
"avatar_url": "https://avatars.githubusercontent.com/u/2148847?v=4",
"profile": "https://github.com/jshook",
"contributions": [
"review",
"tool",
"bug",
"business",
"code",
"content",
"data",
"doc",
"design",
"example",
"ideas",
"infra",
"maintenance",
"mentoring",
"platform",
"plugin",
"projectManagement",
"research",
"security",
"test",
"userTesting"
]
},
{
"login": "MikeYaacoubStax",
"name": "MikeYaacoubStax",
"avatar_url": "https://avatars.githubusercontent.com/u/117678633?v=4",
"profile": "https://github.com/MikeYaacoubStax",
"contributions": [
"review",
"tool",
"bug",
"business",
"code",
"content",
"data",
"doc",
"design",
"example",
"ideas",
"infra",
"maintenance",
"mentoring",
"platform",
"plugin",
"projectManagement",
"research",
"security",
"test",
"userTesting"
]
},
{
"login": "jeffbanks",
"name": "Jeff Banks",
"avatar_url": "https://avatars.githubusercontent.com/u/4078933?v=4",
"profile": "http://jjbanks.com",
"contributions": [
"code",
"mentoring",
"test",
"bug",
"business",
"content",
"data",
"doc",
"design",
"example",
"ideas",
"infra",
"maintenance",
"platform",
"plugin",
"projectManagement",
"research",
"review",
"security",
"tool",
"userTesting"
]
},
{
"login": "msmygit",
"name": "Madhavan",
"avatar_url": "https://avatars.githubusercontent.com/u/19366623?v=4",
"profile": "https://github.com/msmygit",
"contributions": [
"code",
"bug",
"doc",
"ideas",
"question",
"research",
"review",
"tool",
"userTesting",
"talk",
"tutorial"
]
},
{
"login": "hemidactylus",
"name": "Stefano Lottini",
"avatar_url": "https://avatars.githubusercontent.com/u/14221764?v=4",
"profile": "https://github.com/hemidactylus",
"contributions": [
"bug",
"blog",
"code",
"content",
"data",
"doc",
"example",
"eventOrganizing",
"mentoring",
"promotion",
"research",
"tutorial",
"userTesting",
"video"
]
},
{
"login": "phact",
"name": "Sebastián Estévez",
"avatar_url": "https://avatars.githubusercontent.com/u/1313220?v=4",
"profile": "https://github.com/phact",
"contributions": [
"bug",
"design",
"business",
"code",
"content",
"data",
"doc",
"ideas",
"promotion",
"research"
]
},
{
"login": "smccarthy788",
"name": "Sean McCarthy",
"avatar_url": "https://avatars.githubusercontent.com/u/6601281?v=4",
"profile": "https://github.com/smccarthy788",
"contributions": [
"mentoring",
"ideas",
"code",
"test"
]
},
{
"login": "yabinmeng",
"name": "yabinmeng",
"avatar_url": "https://avatars.githubusercontent.com/u/16789452?v=4",
"profile": "https://github.com/yabinmeng",
"contributions": [
"bug",
"test"
]
},
{
"login": "eolivelli",
"name": "Enrico Olivelli",
"avatar_url": "https://avatars.githubusercontent.com/u/9469110?v=4",
"profile": "http://eolivelli.blogspot.it/",
"contributions": [
"test",
"code",
"review"
]
},
{
"login": "lhotari",
"name": "Lari Hotari",
"avatar_url": "https://avatars.githubusercontent.com/u/66864?v=4",
"profile": "https://github.com/lhotari",
"contributions": [
"bug",
"code",
"review"
]
},
{
"login": "mfleming",
"name": "Matt Fleming",
"avatar_url": "https://avatars.githubusercontent.com/u/94254?v=4",
"profile": "http://www.codeblueprint.co.uk",
"contributions": [
"bug",
"design"
]
},
{
"login": "tjake",
"name": "Jake Luciani",
"avatar_url": "https://avatars.githubusercontent.com/u/44456?v=4",
"profile": "https://github.com/tjake",
"contributions": [
"bug",
"ideas"
]
},
{
"login": "lakshmi-M18",
"name": "Lakshmi Manjunatha",
"avatar_url": "https://avatars.githubusercontent.com/u/89935678?v=4",
"profile": "https://github.com/lakshmi-M18",
"contributions": [
"bug"
]
},
{
"login": "pingtimeout",
"name": "Pierre Laporte",
"avatar_url": "https://avatars.githubusercontent.com/u/1159578?v=4",
"profile": "http://www.pingtimeout.fr",
"contributions": [
"ideas",
"bug"
]
},
{
"login": "tatu-at-datastax",
"name": "Tatu Saloranta",
"avatar_url": "https://avatars.githubusercontent.com/u/87213665?v=4",
"profile": "https://github.com/tatu-at-datastax",
"contributions": [
"doc"
]
},
{
"login": "alexott",
"name": "Alex Ott",
"avatar_url": "https://avatars.githubusercontent.com/u/30342?v=4",
"profile": "http://alexott.net",
"contributions": [
"platform",
"bug",
"code"
]
},
{
"login": "jeffreyscarpenter",
"name": "Jeffrey Carpenter",
"avatar_url": "https://avatars.githubusercontent.com/u/12115970?v=4",
"profile": "https://github.com/jeffreyscarpenter",
"contributions": [
"bug",
"test",
"maintenance"
]
},
{
"login": "yassermohamed81",
"name": "yassermohamed81",
"avatar_url": "https://avatars.githubusercontent.com/u/53837411?v=4",
"profile": "https://github.com/yassermohamed81",
"contributions": [
"code"
]
},
{
"login": "Pierrotws",
"name": "Pierre Sauvage",
"avatar_url": "https://avatars.githubusercontent.com/u/6002161?v=4",
"profile": "https://github.com/Pierrotws",
"contributions": [
"code"
]
},
{
"login": "dougwettlaufer",
"name": "Doug Wettlaufer",
"avatar_url": "https://avatars.githubusercontent.com/u/45750136?v=4",
"profile": "https://github.com/dougwettlaufer",
"contributions": [
"test"
]
},
{
"login": "jeromatron",
"name": "Jeremy Hanna",
"avatar_url": "https://avatars.githubusercontent.com/u/254887?v=4",
"profile": "http://jeromatron.blogspot.com",
"contributions": [
"test",
"ideas"
]
},
{
"login": "alicel",
"name": "Alice Lottini",
"avatar_url": "https://avatars.githubusercontent.com/u/2972347?v=4",
"profile": "https://github.com/alicel",
"contributions": [
"bug",
"ideas",
"test"
]
},
{
"login": "EricBorczuk",
"name": "Eric Borczuk",
"avatar_url": "https://avatars.githubusercontent.com/u/4205492?v=4",
"profile": "https://github.com/EricBorczuk",
"contributions": [
"code",
"review",
"test"
]
},
{
"login": "weideng1",
"name": "weideng1",
"avatar_url": "https://avatars.githubusercontent.com/u/5520525?v=4",
"profile": "https://github.com/weideng1",
"contributions": [
"test",
"ideas",
"code"
]
},
{
"login": "ivansenic",
"name": "Ivan Senic",
"avatar_url": "https://avatars.githubusercontent.com/u/10600041?v=4",
"profile": "https://github.com/ivansenic",
"contributions": [
"test"
]
},
{
"login": "justinchuch",
"name": "Justin Chu",
"avatar_url": "https://avatars.githubusercontent.com/u/15710241?v=4",
"profile": "https://justinchuch.wordpress.com/",
"contributions": [
"code",
"test",
"review"
]
},
{
"login": "ds-steven-matison",
"name": "Steven Matison",
"avatar_url": "https://avatars.githubusercontent.com/u/70520951?v=4",
"profile": "https://ds-steven-matison.github.io/",
"contributions": [
"test",
"ideas"
]
},
{
"login": "szimmer1",
"name": "shahar z",
"avatar_url": "https://avatars.githubusercontent.com/u/8455475?v=4",
"profile": "https://github.com/szimmer1",
"contributions": [
"ideas",
"code"
]
},
{
"login": "ncarvind",
"name": "ncarvind",
"avatar_url": "https://avatars.githubusercontent.com/u/70302571?v=4",
"profile": "https://github.com/ncarvind",
"contributions": [
"code",
"test"
]
},
{
"login": "MMirelli",
"name": "Massimiliano Mirelli",
"avatar_url": "https://avatars.githubusercontent.com/u/22191891?v=4",
"profile": "https://github.com/MMirelli",
"contributions": [
"platform"
]
},
{
"login": "derrickCos",
"name": "Derrick Cosmas",
"avatar_url": "https://avatars.githubusercontent.com/u/25781387?v=4",
"profile": "https://github.com/derrickCos",
"contributions": [
"code",
"ideas"
]
},
{
"login": "grighetto",
"name": "Gianluca Righetto",
"avatar_url": "https://avatars.githubusercontent.com/u/413792?v=4",
"profile": "https://github.com/grighetto",
"contributions": [
"platform"
]
},
{
"login": "BrynCooke",
"name": "Bryn Cooke",
"avatar_url": "https://avatars.githubusercontent.com/u/747836?v=4",
"profile": "https://github.com/BrynCooke",
"contributions": [
"doc"
]
},
{
"login": "KatSarah",
"name": "KatSarah",
"avatar_url": "https://avatars.githubusercontent.com/u/658015?v=4",
"profile": "https://github.com/KatSarah",
"contributions": [
"ideas"
]
},
{
"login": "peytoncasper",
"name": "Peyton Casper",
"avatar_url": "https://avatars.githubusercontent.com/u/8305883?v=4",
"profile": "https://github.com/peytoncasper",
"contributions": [
"ideas",
"code"
]
},
{
"login": "landim",
"name": "Arthur Costa",
"avatar_url": "https://avatars.githubusercontent.com/u/91446?v=4",
"profile": "https://github.com/landim",
"contributions": [
"bug"
]
},
{
"login": "guyboltonking",
"name": "Guy Bolton King",
"avatar_url": "https://avatars.githubusercontent.com/u/98294?v=4",
"profile": "https://github.com/guyboltonking",
"contributions": [
"bug",
"code",
"ideas"
]
},
{
"login": "XN137",
"name": "Christopher Lambert",
"avatar_url": "https://avatars.githubusercontent.com/u/1204398?v=4",
"profile": "https://github.com/XN137",
"contributions": [
"code",
"ideas"
]
}
]
}

View File

@@ -79,6 +79,7 @@ jobs:
builddocs: builddocs:
needs: build needs: build
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
if: ${{ github.repository == 'nosqlbench/nosqlbench' && github.event_name == 'push' && github.ref_name == 'main' }}
steps: steps:
- name: set git username - name: set git username

View File

@@ -1,3 +1,5 @@
[![All Contributors](https://img.shields.io/github/all-contributors/nosqlbench/nosqlbench?color=ee8449&style=flat-square)](#contributors)
NoSQLBench is an ambitious project. It aims to solve long-standing problems in distributed systems NoSQLBench is an ambitious project. It aims to solve long-standing problems in distributed systems
testing. There are *many* ways you can contribute! Please take a moment to review this document testing. There are *many* ways you can contribute! Please take a moment to review this document
in order to make the contribution process easy and effective for everyone involved. in order to make the contribution process easy and effective for everyone involved.
@@ -117,5 +119,73 @@ are eager to get it into the hands of users who need it.
[discord server](https://discord.gg/dBHRakusMN) and raise your hand! [discord server](https://discord.gg/dBHRakusMN) and raise your hand!
## Contributors
Thanks to these contributors! :sparkle:
For recognizing contributions, please follow [this documentation](https://allcontributors.org/docs/en/bot/usage) and pick a key/contribution type from [here](https://allcontributors.org/docs/en/emoji-key).
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jshook"><img src="https://avatars.githubusercontent.com/u/2148847?v=4?s=50" width="50px;" alt="Jonathan Shook"/><br /><sub><b>Jonathan Shook</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/pulls?q=is%3Apr+reviewed-by%3Ajshook" title="Reviewed Pull Requests">👀</a> <a href="#tool-jshook" title="Tools">🔧</a> <a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Ajshook" title="Bug reports">🐛</a> <a href="#business-jshook" title="Business development">💼</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=jshook" title="Code">💻</a> <a href="#content-jshook" title="Content">🖋</a> <a href="#data-jshook" title="Data">🔣</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=jshook" title="Documentation">📖</a> <a href="#design-jshook" title="Design">🎨</a> <a href="#example-jshook" title="Examples">💡</a> <a href="#ideas-jshook" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-jshook" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-jshook" title="Maintenance">🚧</a> <a href="#mentoring-jshook" title="Mentoring">🧑‍🏫</a> <a href="#platform-jshook" title="Packaging/porting to new platform">📦</a> <a href="#plugin-jshook" title="Plugin/utility libraries">🔌</a> <a href="#projectManagement-jshook" title="Project Management">📆</a> <a href="#research-jshook" title="Research">🔬</a> <a href="#security-jshook" title="Security">🛡️</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=jshook" title="Tests">⚠️</a> <a href="#userTesting-jshook" title="User Testing">📓</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MikeYaacoubStax"><img src="https://avatars.githubusercontent.com/u/117678633?v=4?s=50" width="50px;" alt="MikeYaacoubStax"/><br /><sub><b>MikeYaacoubStax</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/pulls?q=is%3Apr+reviewed-by%3AMikeYaacoubStax" title="Reviewed Pull Requests">👀</a> <a href="#tool-MikeYaacoubStax" title="Tools">🔧</a> <a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3AMikeYaacoubStax" title="Bug reports">🐛</a> <a href="#business-MikeYaacoubStax" title="Business development">💼</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=MikeYaacoubStax" title="Code">💻</a> <a href="#content-MikeYaacoubStax" title="Content">🖋</a> <a href="#data-MikeYaacoubStax" title="Data">🔣</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=MikeYaacoubStax" title="Documentation">📖</a> <a href="#design-MikeYaacoubStax" title="Design">🎨</a> <a href="#example-MikeYaacoubStax" title="Examples">💡</a> <a href="#ideas-MikeYaacoubStax" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-MikeYaacoubStax" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-MikeYaacoubStax" title="Maintenance">🚧</a> <a href="#mentoring-MikeYaacoubStax" title="Mentoring">🧑‍🏫</a> <a href="#platform-MikeYaacoubStax" title="Packaging/porting to new platform">📦</a> <a href="#plugin-MikeYaacoubStax" title="Plugin/utility libraries">🔌</a> <a href="#projectManagement-MikeYaacoubStax" title="Project Management">📆</a> <a href="#research-MikeYaacoubStax" title="Research">🔬</a> <a href="#security-MikeYaacoubStax" title="Security">🛡️</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=MikeYaacoubStax" title="Tests">⚠️</a> <a href="#userTesting-MikeYaacoubStax" title="User Testing">📓</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://jjbanks.com"><img src="https://avatars.githubusercontent.com/u/4078933?v=4?s=50" width="50px;" alt="Jeff Banks"/><br /><sub><b>Jeff Banks</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=jeffbanks" title="Code">💻</a> <a href="#mentoring-jeffbanks" title="Mentoring">🧑‍🏫</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=jeffbanks" title="Tests">⚠️</a> <a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Ajeffbanks" title="Bug reports">🐛</a> <a href="#business-jeffbanks" title="Business development">💼</a> <a href="#content-jeffbanks" title="Content">🖋</a> <a href="#data-jeffbanks" title="Data">🔣</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=jeffbanks" title="Documentation">📖</a> <a href="#design-jeffbanks" title="Design">🎨</a> <a href="#example-jeffbanks" title="Examples">💡</a> <a href="#ideas-jeffbanks" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-jeffbanks" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-jeffbanks" title="Maintenance">🚧</a> <a href="#platform-jeffbanks" title="Packaging/porting to new platform">📦</a> <a href="#plugin-jeffbanks" title="Plugin/utility libraries">🔌</a> <a href="#projectManagement-jeffbanks" title="Project Management">📆</a> <a href="#research-jeffbanks" title="Research">🔬</a> <a href="https://github.com/nosqlbench/nosqlbench/pulls?q=is%3Apr+reviewed-by%3Ajeffbanks" title="Reviewed Pull Requests">👀</a> <a href="#security-jeffbanks" title="Security">🛡️</a> <a href="#tool-jeffbanks" title="Tools">🔧</a> <a href="#userTesting-jeffbanks" title="User Testing">📓</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/msmygit"><img src="https://avatars.githubusercontent.com/u/19366623?v=4?s=50" width="50px;" alt="Madhavan"/><br /><sub><b>Madhavan</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=msmygit" title="Code">💻</a> <a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Amsmygit" title="Bug reports">🐛</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=msmygit" title="Documentation">📖</a> <a href="#ideas-msmygit" title="Ideas, Planning, & Feedback">🤔</a> <a href="#question-msmygit" title="Answering Questions">💬</a> <a href="#research-msmygit" title="Research">🔬</a> <a href="https://github.com/nosqlbench/nosqlbench/pulls?q=is%3Apr+reviewed-by%3Amsmygit" title="Reviewed Pull Requests">👀</a> <a href="#tool-msmygit" title="Tools">🔧</a> <a href="#userTesting-msmygit" title="User Testing">📓</a> <a href="#talk-msmygit" title="Talks">📢</a> <a href="#tutorial-msmygit" title="Tutorials"></a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hemidactylus"><img src="https://avatars.githubusercontent.com/u/14221764?v=4?s=50" width="50px;" alt="Stefano Lottini"/><br /><sub><b>Stefano Lottini</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Ahemidactylus" title="Bug reports">🐛</a> <a href="#blog-hemidactylus" title="Blogposts">📝</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=hemidactylus" title="Code">💻</a> <a href="#content-hemidactylus" title="Content">🖋</a> <a href="#data-hemidactylus" title="Data">🔣</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=hemidactylus" title="Documentation">📖</a> <a href="#example-hemidactylus" title="Examples">💡</a> <a href="#eventOrganizing-hemidactylus" title="Event Organizing">📋</a> <a href="#mentoring-hemidactylus" title="Mentoring">🧑‍🏫</a> <a href="#promotion-hemidactylus" title="Promotion">📣</a> <a href="#research-hemidactylus" title="Research">🔬</a> <a href="#tutorial-hemidactylus" title="Tutorials"></a> <a href="#userTesting-hemidactylus" title="User Testing">📓</a> <a href="#video-hemidactylus" title="Videos">📹</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/phact"><img src="https://avatars.githubusercontent.com/u/1313220?v=4?s=50" width="50px;" alt="Sebastián Estévez"/><br /><sub><b>Sebastián Estévez</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Aphact" title="Bug reports">🐛</a> <a href="#design-phact" title="Design">🎨</a> <a href="#business-phact" title="Business development">💼</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=phact" title="Code">💻</a> <a href="#content-phact" title="Content">🖋</a> <a href="#data-phact" title="Data">🔣</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=phact" title="Documentation">📖</a> <a href="#ideas-phact" title="Ideas, Planning, & Feedback">🤔</a> <a href="#promotion-phact" title="Promotion">📣</a> <a href="#research-phact" title="Research">🔬</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/smccarthy788"><img src="https://avatars.githubusercontent.com/u/6601281?v=4?s=50" width="50px;" alt="Sean McCarthy"/><br /><sub><b>Sean McCarthy</b></sub></a><br /><a href="#mentoring-smccarthy788" title="Mentoring">🧑‍🏫</a> <a href="#ideas-smccarthy788" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=smccarthy788" title="Code">💻</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=smccarthy788" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/yabinmeng"><img src="https://avatars.githubusercontent.com/u/16789452?v=4?s=50" width="50px;" alt="yabinmeng"/><br /><sub><b>yabinmeng</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Ayabinmeng" title="Bug reports">🐛</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=yabinmeng" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://eolivelli.blogspot.it/"><img src="https://avatars.githubusercontent.com/u/9469110?v=4?s=50" width="50px;" alt="Enrico Olivelli"/><br /><sub><b>Enrico Olivelli</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=eolivelli" title="Tests">⚠️</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=eolivelli" title="Code">💻</a> <a href="https://github.com/nosqlbench/nosqlbench/pulls?q=is%3Apr+reviewed-by%3Aeolivelli" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/lhotari"><img src="https://avatars.githubusercontent.com/u/66864?v=4?s=50" width="50px;" alt="Lari Hotari"/><br /><sub><b>Lari Hotari</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Alhotari" title="Bug reports">🐛</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=lhotari" title="Code">💻</a> <a href="https://github.com/nosqlbench/nosqlbench/pulls?q=is%3Apr+reviewed-by%3Alhotari" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://www.codeblueprint.co.uk"><img src="https://avatars.githubusercontent.com/u/94254?v=4?s=50" width="50px;" alt="Matt Fleming"/><br /><sub><b>Matt Fleming</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Amfleming" title="Bug reports">🐛</a> <a href="#design-mfleming" title="Design">🎨</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/tjake"><img src="https://avatars.githubusercontent.com/u/44456?v=4?s=50" width="50px;" alt="Jake Luciani"/><br /><sub><b>Jake Luciani</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Atjake" title="Bug reports">🐛</a> <a href="#ideas-tjake" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/lakshmi-M18"><img src="https://avatars.githubusercontent.com/u/89935678?v=4?s=50" width="50px;" alt="Lakshmi Manjunatha"/><br /><sub><b>Lakshmi Manjunatha</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Alakshmi-M18" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://www.pingtimeout.fr"><img src="https://avatars.githubusercontent.com/u/1159578?v=4?s=50" width="50px;" alt="Pierre Laporte"/><br /><sub><b>Pierre Laporte</b></sub></a><br /><a href="#ideas-pingtimeout" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Apingtimeout" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/tatu-at-datastax"><img src="https://avatars.githubusercontent.com/u/87213665?v=4?s=50" width="50px;" alt="Tatu Saloranta"/><br /><sub><b>Tatu Saloranta</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=tatu-at-datastax" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://alexott.net"><img src="https://avatars.githubusercontent.com/u/30342?v=4?s=50" width="50px;" alt="Alex Ott"/><br /><sub><b>Alex Ott</b></sub></a><br /><a href="#platform-alexott" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Aalexott" title="Bug reports">🐛</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=alexott" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jeffreyscarpenter"><img src="https://avatars.githubusercontent.com/u/12115970?v=4?s=50" width="50px;" alt="Jeffrey Carpenter"/><br /><sub><b>Jeffrey Carpenter</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Ajeffreyscarpenter" title="Bug reports">🐛</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=jeffreyscarpenter" title="Tests">⚠️</a> <a href="#maintenance-jeffreyscarpenter" title="Maintenance">🚧</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/yassermohamed81"><img src="https://avatars.githubusercontent.com/u/53837411?v=4?s=50" width="50px;" alt="yassermohamed81"/><br /><sub><b>yassermohamed81</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=yassermohamed81" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Pierrotws"><img src="https://avatars.githubusercontent.com/u/6002161?v=4?s=50" width="50px;" alt="Pierre Sauvage"/><br /><sub><b>Pierre Sauvage</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=Pierrotws" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dougwettlaufer"><img src="https://avatars.githubusercontent.com/u/45750136?v=4?s=50" width="50px;" alt="Doug Wettlaufer"/><br /><sub><b>Doug Wettlaufer</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=dougwettlaufer" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="16.66%"><a href="http://jeromatron.blogspot.com"><img src="https://avatars.githubusercontent.com/u/254887?v=4?s=50" width="50px;" alt="Jeremy Hanna"/><br /><sub><b>Jeremy Hanna</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=jeromatron" title="Tests">⚠️</a> <a href="#ideas-jeromatron" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/alicel"><img src="https://avatars.githubusercontent.com/u/2972347?v=4?s=50" width="50px;" alt="Alice Lottini"/><br /><sub><b>Alice Lottini</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Aalicel" title="Bug reports">🐛</a> <a href="#ideas-alicel" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=alicel" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/EricBorczuk"><img src="https://avatars.githubusercontent.com/u/4205492?v=4?s=50" width="50px;" alt="Eric Borczuk"/><br /><sub><b>Eric Borczuk</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=EricBorczuk" title="Code">💻</a> <a href="https://github.com/nosqlbench/nosqlbench/pulls?q=is%3Apr+reviewed-by%3AEricBorczuk" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=EricBorczuk" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/weideng1"><img src="https://avatars.githubusercontent.com/u/5520525?v=4?s=50" width="50px;" alt="weideng1"/><br /><sub><b>weideng1</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=weideng1" title="Tests">⚠️</a> <a href="#ideas-weideng1" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=weideng1" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ivansenic"><img src="https://avatars.githubusercontent.com/u/10600041?v=4?s=50" width="50px;" alt="Ivan Senic"/><br /><sub><b>Ivan Senic</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=ivansenic" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://justinchuch.wordpress.com/"><img src="https://avatars.githubusercontent.com/u/15710241?v=4?s=50" width="50px;" alt="Justin Chu"/><br /><sub><b>Justin Chu</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=justinchuch" title="Code">💻</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=justinchuch" title="Tests">⚠️</a> <a href="https://github.com/nosqlbench/nosqlbench/pulls?q=is%3Apr+reviewed-by%3Ajustinchuch" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://ds-steven-matison.github.io/"><img src="https://avatars.githubusercontent.com/u/70520951?v=4?s=50" width="50px;" alt="Steven Matison"/><br /><sub><b>Steven Matison</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=ds-steven-matison" title="Tests">⚠️</a> <a href="#ideas-ds-steven-matison" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/szimmer1"><img src="https://avatars.githubusercontent.com/u/8455475?v=4?s=50" width="50px;" alt="shahar z"/><br /><sub><b>shahar z</b></sub></a><br /><a href="#ideas-szimmer1" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=szimmer1" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ncarvind"><img src="https://avatars.githubusercontent.com/u/70302571?v=4?s=50" width="50px;" alt="ncarvind"/><br /><sub><b>ncarvind</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=ncarvind" title="Code">💻</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=ncarvind" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MMirelli"><img src="https://avatars.githubusercontent.com/u/22191891?v=4?s=50" width="50px;" alt="Massimiliano Mirelli"/><br /><sub><b>Massimiliano Mirelli</b></sub></a><br /><a href="#platform-MMirelli" title="Packaging/porting to new platform">📦</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/derrickCos"><img src="https://avatars.githubusercontent.com/u/25781387?v=4?s=50" width="50px;" alt="Derrick Cosmas"/><br /><sub><b>Derrick Cosmas</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=derrickCos" title="Code">💻</a> <a href="#ideas-derrickCos" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/grighetto"><img src="https://avatars.githubusercontent.com/u/413792?v=4?s=50" width="50px;" alt="Gianluca Righetto"/><br /><sub><b>Gianluca Righetto</b></sub></a><br /><a href="#platform-grighetto" title="Packaging/porting to new platform">📦</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/BrynCooke"><img src="https://avatars.githubusercontent.com/u/747836?v=4?s=50" width="50px;" alt="Bryn Cooke"/><br /><sub><b>Bryn Cooke</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=BrynCooke" title="Documentation">📖</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/KatSarah"><img src="https://avatars.githubusercontent.com/u/658015?v=4?s=50" width="50px;" alt="KatSarah"/><br /><sub><b>KatSarah</b></sub></a><br /><a href="#ideas-KatSarah" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/peytoncasper"><img src="https://avatars.githubusercontent.com/u/8305883?v=4?s=50" width="50px;" alt="Peyton Casper"/><br /><sub><b>Peyton Casper</b></sub></a><br /><a href="#ideas-peytoncasper" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=peytoncasper" title="Code">💻</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/landim"><img src="https://avatars.githubusercontent.com/u/91446?v=4?s=50" width="50px;" alt="Arthur Costa"/><br /><sub><b>Arthur Costa</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Alandim" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/guyboltonking"><img src="https://avatars.githubusercontent.com/u/98294?v=4?s=50" width="50px;" alt="Guy Bolton King"/><br /><sub><b>Guy Bolton King</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/issues?q=author%3Aguyboltonking" title="Bug reports">🐛</a> <a href="https://github.com/nosqlbench/nosqlbench/commits?author=guyboltonking" title="Code">💻</a> <a href="#ideas-guyboltonking" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="16.66%"><a href="https://github.com/XN137"><img src="https://avatars.githubusercontent.com/u/1204398?v=4?s=50" width="50px;" alt="Christopher Lambert"/><br /><sub><b>Christopher Lambert</b></sub></a><br /><a href="https://github.com/nosqlbench/nosqlbench/commits?author=XN137" title="Code">💻</a> <a href="#ideas-XN137" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
---

View File

@@ -1,5 +1,7 @@
[comment]: < ![build](https://github.com/nosqlbench/nosqlbench/workflows/build/badge.svg) > [comment]: < ![build](https://github.com/nosqlbench/nosqlbench/workflows/build/badge.svg) >
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.nosqlbench/nosqlbench/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.nosqlbench/nosqlbench)
[![Star on Github](https://img.shields.io/github/stars/nosqlbench/nosqlbench.svg?style=social)](https://github.com/nosqlbench/nosqlbench/stargazers)
[![Chat on Discord](https://img.shields.io/discord/819995781406130176?logo=discord)](https://discord.gg/dBHRakusMN)
# NoSQLBench v5 # NoSQLBench v5
@@ -104,3 +106,9 @@ available, but more work is needed to support them fully. Here is what is suppor
</td> </td>
</tr> </tr>
</table> </table>
## Contributors
Checkout all our wonderful contributors [here](./CONTRIBUTING.md#contributors).
---

View File

@@ -320,9 +320,9 @@ public class CGWorkloadExporter implements BundledApp {
put("default", put("default",
new LinkedHashMap<>() {{ new LinkedHashMap<>() {{
put("schema", "run driver=cql tags=block:'schema-*.*' threads===UNDEF cycles===UNDEF"); put("schema", "run driver=cql tags=block:\"schema.*\" threads===UNDEF cycles===UNDEF");
put("rampup", "run driver=cql tags=block:rampup threads=auto cycles===TEMPLATE(rampup-cycles,10000)"); put("rampup", "run driver=cql tags=block:rampup threads=auto cycles===TEMPLATE(rampup-cycles,10000)");
put("main", "run driver=cql tags=block:'main-*.*' threads=auto cycles===TEMPLATE(main-cycles,10000)"); put("main", "run driver=cql tags=block:\"main.*\" threads=auto cycles===TEMPLATE(main-cycles,10000)");
}}); }});
put("main-insert", "run driver=cql tags=block:main-insert threads=auto cycles===TEMPLATE(main-cycles,10000)"); put("main-insert", "run driver=cql tags=block:main-insert threads=auto cycles===TEMPLATE(main-cycles,10000)");

View File

@@ -2,8 +2,8 @@ description: An IOT workload with more optimal settings for DSE
scenarios: scenarios:
default: default:
schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,100) threads=auto
main: run driver=cql tags==block:"main-*.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,100) threads=auto
bindings: bindings:
machine_id: Mod(<<sources:10000>>); ToHashedUUID() -> java.util.UUID machine_id: Mod(<<sources:10000>>); ToHashedUUID() -> java.util.UUID

View File

@@ -7,11 +7,11 @@ scenarios:
default: default:
schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=cql tags==block:"main-*.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
astra: astra:
schema: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF schema: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=cql tags==block:"main-*.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
params: params:
instrument: TEMPLATE(instrument,false) instrument: TEMPLATE(instrument,false)

View File

@@ -5,11 +5,11 @@ scenarios:
default: default:
schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=cql tags==block:'main-*.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
astra: astra:
schema: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF schema: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=cql tags==block:'main-*.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
bindings: bindings:
seq_key: Mod(<<keycount:1000000000>>); ToString() -> String seq_key: Mod(<<keycount:1000000000>>); ToString() -> String

View File

@@ -0,0 +1,79 @@
description: |
A cql-starter workload primarily for:
* Cassandra: 3.x, 4.x.
* DataStax Enterprise: 6.8.x.
* DataStax Astra.
scenarios:
default:
schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10) threads=auto
main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,10) threads=auto
astra:
schema: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10) threads=auto
main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,10) threads=auto
params:
x: y
bindings:
machine_id: Mod(<<sources:10000>>); ToHashedUUID() -> java.util.UUID
message: ToString(); TextOfFile('data/cql-starter-message.txt')
time: Mul(100L); Div(10000L); ToJavaInstant()
timestamp: Mul(<<timespeed:100>>L); Div(<<sources:10000>>L); Mul(1000L);
blocks:
schema:
params:
prepared: false
ops:
create-keyspace: |
create keyspace if not exists <<keyspace:starter>>
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '<<rf:1>>'}
AND durable_writes = true;
create-table: |
create table if not exists <<keyspace:starter>>.<<table:cqlstarter>> (
machine_id UUID,
message text,
time timestamp,
PRIMARY KEY ((machine_id), time)
) WITH CLUSTERING ORDER BY (time DESC);
# truncate-table: |
# truncate table <<keyspace:starter>>.<<table:cqlstarter>>;
schema-astra:
params:
prepared: false
ops:
create-table-astra: |
create table if not exists <<keyspace:starter>>.<<table:cqlstarter>> (
machine_id UUID,
message text,
time timestamp,
PRIMARY KEY ((machine_id), time)
) WITH CLUSTERING ORDER BY (time DESC);
rampup:
params:
cl: <<write_cl:LOCAL_QUORUM>>
idempotent: true
ops:
insert-rampup: |
insert into <<keyspace:starter>>.<<table:cqlstarter>> (machine_id, message, time)
values ({machine_id}, {message}, {time}) using timestamp {timestamp};
main-read:
params:
ratio: <<read_ratio:1>>
cl: <<read_cl:LOCAL_QUORUM>>
ops:
select-read: |
select * from <<keyspace:starter>>.<<table:cqlstarter>>
where machine_id={machine_id};
main-write:
params:
ratio: <<write_ratio:9>>
cl: <<write_cl:LOCAL_QUORUM>>
idempotent: true
ops:
insert-main: |
insert into <<keyspace:starter>>.<<table:cqlstarter>>
(machine_id, message, time) values ({machine_id}, {message}, {time}) using timestamp {timestamp};

View File

@@ -29,11 +29,11 @@ scenarios:
default: default:
schema: run tags=block:schema.* threads==1 schema: run tags=block:schema.* threads==1
main: run tags=block:main-.*.* cycles===TEMPLATE(main-cycles,0) threads=auto main: run tags=block:main-.*.* cycles===TEMPLATE(main-cycles,0) threads=auto
default-schema: run tags=block:'schema.*' threads==1 default-schema: run tags=block:"schema.*" threads==1
default-main: run tags=block:'main.*' cycles===TEMPLATE(main-cycles,0) threads=auto default-main: run tags=block:"main.*" cycles===TEMPLATE(main-cycles,0) threads=auto
astra: astra:
schema: run tags=block:astra-schema threads==1 schema: run tags=block:astra-schema threads==1
main: run tags=block:'main.*' cycles===TEMPLATE(main-cycles,0) threads=auto main: run tags=block:"main.*" cycles===TEMPLATE(main-cycles,0) threads=auto
params: params:
instrument: true instrument: true

View File

@@ -28,12 +28,12 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10B) threads=auto rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,100) threads=auto
main: run driver=cql tags==block:"main-*.*" cycles===TEMPLATE(main-cycles,100M) threads=auto main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,100) threads=auto
astra: astra:
schema: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF schema: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,100) threads=auto
main: run driver=cql tags==block:"main-*.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,100) threads=auto
params: params:
instrument: true instrument: true
@@ -100,13 +100,13 @@ blocks:
rampup-insert: | rampup-insert: |
insert into TEMPLATE(keyspace,baselines).TEMPLATE(table,tabular) insert into TEMPLATE(keyspace,baselines).TEMPLATE(table,tabular)
(part,clust,data0,data1,data2,data3,data4,data5,data6,data7) (part,clust,data0,data1,data2,data3,data4,data5,data6,data7)
values ({part_layout},{clust_layout},{data0},{data1},{data2},{data3},{data4},{data5},{data6},{data7}) values ({part_layout},{clust_layout},{data0},{data1},{data2},{data3},{data4},{data5},{data6},{data7});
verify: verify:
params: params:
cl: TEMPLATE(read_cl,LOCAL_QUORUM) cl: TEMPLATE(read_cl,LOCAL_QUORUM)
ops: ops:
verify-select: | verify-select: |
select * from TEMPLATE(keyspace,baselines).TEMPLATE(table,tabular) where part={part_layout} and clust={clust_layout} select * from TEMPLATE(keyspace,baselines).TEMPLATE(table,tabular) where part={part_layout} and clust={clust_layout};
main-read: main-read:
params: params:
ratio: 1 ratio: 1

View File

@@ -7,11 +7,11 @@ scenarios:
default: default:
schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF schema: run driver=cql tags==block:schema threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=cql tags==block:"main-*.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
astra: astra:
schema: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF schema: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF
rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=cql tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=cql tags==block:"main-*.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=cql tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
params: params:
instrument: TEMPLATE(instrument,false) instrument: TEMPLATE(instrument,false)

View File

@@ -126,7 +126,7 @@ timeouts:
blockplan: blockplan:
# not needed when tags=block:'schema.*' # not needed when tags=block:"schema.*"
# schema: schema-keyspaces, schema-tables, schema-types # schema: schema-keyspaces, schema-tables, schema-types
schema-keyspaces: schema-keyspaces schema-keyspaces: schema-keyspaces
schema-tables: schema-tables schema-tables: schema-tables

View File

@@ -160,7 +160,7 @@ activity types.
- **ssl** - specifies the type of the SSL implementation. - **ssl** - specifies the type of the SSL implementation.
Disabled by default, possible values are `jdk` and `openssl`. Disabled by default, possible values are `jdk` and `openssl`.
[Additional parameters may need to be provided](ssl.md). See the ssl help topic for more details with `nb5 help ssl` for more details.
- **jmxreporting** - enable JMX reporting if needed. - **jmxreporting** - enable JMX reporting if needed.
Examples: Examples:

View File

@@ -0,0 +1 @@
Welcome to cql-starter!

View File

@@ -1,9 +1,9 @@
description: Auto-generated workload from source schema. description: Auto-generated workload from source schema.
scenarios: scenarios:
default: default:
schema: run driver=cql tags=block:'schema.*' threads===UNDEF cycles===UNDEF schema: run driver=cql tags=block:"schema.*" threads===UNDEF cycles===UNDEF
rampup: run driver=cql tags=block:'rampup.*' threads=auto cycles===TEMPLATE(rampup-cycles,10000) rampup: run driver=cql tags=block:"rampup.*" threads=auto cycles===TEMPLATE(rampup-cycles,10000)
main: run driver=cql tags=block:'main.*' threads=auto cycles===TEMPLATE(main-cycles,10000) main: run driver=cql tags=block:"main.*" threads=auto cycles===TEMPLATE(main-cycles,10000)
main-insert: run driver=cql tags=block:main-insert threads=auto cycles===TEMPLATE(main-cycles,10000) main-insert: run driver=cql tags=block:main-insert threads=auto cycles===TEMPLATE(main-cycles,10000)
main-select: run driver=cql tags=block:main-select threads=auto cycles===TEMPLATE(main-cycles,10000) main-select: run driver=cql tags=block:main-select threads=auto cycles===TEMPLATE(main-cycles,10000)
main-scan: run driver=cql tags=block:main-scan threads=auto cycles===TEMPLATE(main-cycles,10000) main-scan: run driver=cql tags=block:main-scan threads=auto cycles===TEMPLATE(main-cycles,10000)

View File

@@ -6,9 +6,9 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=dynamodb tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=dynamodb tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=dynamodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=dynamodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=dynamodb tags==block:'main-*.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=dynamodb tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
read: run driver=dynamodb tags==block:main-read cycles===TEMPLATE(main-cycles,10000000) threads=auto read: run driver=dynamodb tags==block:main-read cycles===TEMPLATE(main-cycles,10000000) threads=auto
write: run driver=dynamodb tags==block:main-write cycles===TEMPLATE(main-cycles,10000000) threads=auto write: run driver=dynamodb tags==block:main-write cycles===TEMPLATE(main-cycles,10000000) threads=auto

View File

@@ -4,10 +4,10 @@ description: |
Run a read/write workload against DynamoDB with varying field sizes and query patterns Run a read/write workload against DynamoDB with varying field sizes and query patterns
scenarios: scenarios:
schema: run driver=dynamodb tags=block:'schema.*' region=us-east-1 schema: run driver=dynamodb tags=block:"schema.*" region=us-east-1
rampup: run driver=dynamodb tags=block:rampup region=us-east-1 rampup: run driver=dynamodb tags=block:rampup region=us-east-1
read: run driver=dynamodb tags=block:read region=us-east-1 read: run driver=dynamodb tags=block:read region=us-east-1
main: run driver=dynamodb tags=block:'main-*.*' region=us-east-1 main: run driver=dynamodb tags=block:"main.*" region=us-east-1
read01: run driver=dynamodb tags='name:.*main-read-01' region=us-east-1 read01: run driver=dynamodb tags='name:.*main-read-01' region=us-east-1
delete: delete:
table: run driver=dynamodb tags==block:delete threads==1 cycles==UNDEF table: run driver=dynamodb tags==block:delete threads==1 cycles==UNDEF

View File

@@ -11,7 +11,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=dynamodb tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=dynamodb tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=dynamodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=dynamodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=dynamodb tags==block:main cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=dynamodb tags==block:main cycles===TEMPLATE(main-cycles,10000000) threads=auto
delete: delete:

View File

@@ -9,8 +9,8 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:schema threads==1 cycles==UNDEF schema: run driver=http tags==block:schema threads==1 cycles==UNDEF
rampup: run driver=http tags==block:"rampup-*.*" cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=http tags==block:"rampup.*" cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=http tags==block:"main-*.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
bindings: bindings:
# To enable an optional weighted set of hosts in place of a load balancer # To enable an optional weighted set of hosts in place of a load balancer

View File

@@ -9,9 +9,9 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=http tags==block:'rampup-*.*' cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=http tags==block:"rampup.*" cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=http tags==block:'main-*.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
bindings: bindings:
# To enable an optional weighted set of hosts in place of a load balancer # To enable an optional weighted set of hosts in place of a load balancer

View File

@@ -12,10 +12,10 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=cql tags==block:'schema-*.*' threads==1 cycles==UNDEF schema: run driver=cql tags==block:"schema.*" threads==1 cycles==UNDEF
schema-astra: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF schema-astra: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF
rampup: run driver=http tags==block:'rampup-*.*' cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=http tags==block:"rampup.*" cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=http tags==block:'main-*.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
bindings: bindings:
# To enable an optional weighted set of hosts in place of a load balancer # To enable an optional weighted set of hosts in place of a load balancer

View File

@@ -7,7 +7,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF
write: run driver=http tags==block:'write.*' cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn write: run driver=http tags==block:'write.*' cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn
read: run driver=http tags==block:'read.*' cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn read: run driver=http tags==block:'read.*' cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn
update: run driver=http tags==block:'update.*' cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn update: run driver=http tags==block:'update.*' cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn

View File

@@ -7,7 +7,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF
write: run driver=http tags==name:'write.*' cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn write: run driver=http tags==name:'write.*' cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn
read: run driver=http tags==name:'read.*' cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn read: run driver=http tags==name:'read.*' cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn
update: run driver=http tags==name:'update.*' cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn update: run driver=http tags==name:'update.*' cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn

View File

@@ -10,7 +10,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=http tags==block:main cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=http tags==block:main cycles===TEMPLATE(main-cycles,10000000) threads=auto

View File

@@ -15,7 +15,7 @@ description: |
# complex2: (match1 LTE 0 OR match2 EQ "false") AND (match2 EQ "false" OR match3 EQ true) # complex2: (match1 LTE 0 OR match2 EQ "false") AND (match2 EQ "false" OR match3 EQ true)
# complex3: (match1 LTE 0 AND match2 EQ "true") OR (match2 EQ "false" AND match3 EQ true) # complex3: (match1 LTE 0 AND match2 EQ "true") OR (match2 EQ "false" AND match3 EQ true)
scenarios: scenarios:
schema: run driver=http tags==block:'schema.*' threads==<<threads:1>> cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==<<threads:1>> cycles==UNDEF
rampup: rampup:
write: run driver=http tags==name:'rampup-put.*' cycles===TEMPLATE(docscount,10000000) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=<<threads:auto>> errors=timer,warn write: run driver=http tags==name:'rampup-put.*' cycles===TEMPLATE(docscount,10000000) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=<<threads:auto>> errors=timer,warn
read: run driver=http tags==block:'rampup-get.*' cycles===TEMPLATE(rampup-cycles, 10000000) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<<threads:auto>> errors=timer,warn read: run driver=http tags==block:'rampup-get.*' cycles===TEMPLATE(rampup-cycles, 10000000) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<<threads:auto>> errors=timer,warn

View File

@@ -7,7 +7,7 @@ description: |
Note that docsapi_port should reflect the port where the Docs API is exposed (defaults to 8180). Note that docsapi_port should reflect the port where the Docs API is exposed (defaults to 8180).
scenarios: scenarios:
schema: run driver=http tags==block:'schema.*' threads==<<threads:1>> cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==<<threads:1>> cycles==UNDEF
rampup: rampup:
write: run driver=http tags==name:'rampup-put.*' cycles===TEMPLATE(docscount,10000000) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=<<threads:auto>> errors=timer,warn write: run driver=http tags==name:'rampup-put.*' cycles===TEMPLATE(docscount,10000000) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=<<threads:auto>> errors=timer,warn
read: run driver=http tags==name:'rampup-get.*' cycles===TEMPLATE(rampup-cycles, 10000000) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<<threads:auto>> errors=timer,warn read: run driver=http tags==name:'rampup-get.*' cycles===TEMPLATE(rampup-cycles, 10000000) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<<threads:auto>> errors=timer,warn

View File

@@ -9,7 +9,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto

View File

@@ -10,9 +10,9 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=http tags==block:'main.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
bindings: bindings:
# To enable an optional weighted set of hosts in place of a load balancer # To enable an optional weighted set of hosts in place of a load balancer

View File

@@ -13,9 +13,9 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=http tags==block:'main.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
bindings: bindings:
# To enable an optional weighted set of hosts in place of a load balancer # To enable an optional weighted set of hosts in place of a load balancer

View File

@@ -15,9 +15,9 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
man: run driver=http tags==block:'main.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto man: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
bindings: bindings:
# To enable an optional weighted set of hosts in place of a load balancer # To enable an optional weighted set of hosts in place of a load balancer

View File

@@ -19,9 +19,9 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=http tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=http tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=http tags==block:'main.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
bindings: bindings:
# To enable an optional weighted set of hosts in place of a load balancer # To enable an optional weighted set of hosts in place of a load balancer

View File

@@ -9,7 +9,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=mongodb tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=mongodb tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=mongodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=mongodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=mongodb tags==block:'main-.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=mongodb tags==block:'main-.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto
drop: run driver=mongodb tags==block:drop-collection threads==1 cycles==UNDEF drop: run driver=mongodb tags==block:drop-collection threads==1 cycles==UNDEF

View File

@@ -9,7 +9,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=mongodb tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=mongodb tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=mongodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=mongodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=mongodb tags==block:'main-.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=mongodb tags==block:'main-.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto
drop: run driver=mongodb tags==block:drop-collection threads==1 cycles==UNDEF drop: run driver=mongodb tags==block:drop-collection threads==1 cycles==UNDEF

View File

@@ -13,7 +13,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=mongodb tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=mongodb tags==block:"schema.*" threads==1 cycles==UNDEF
rampup: run driver=mongodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto rampup: run driver=mongodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto
main: run driver=mongodb tags==block:'main-.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=mongodb tags==block:'main-.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto
drop: run driver=mongodb tags==block:drop-collection threads==1 cycles==UNDEF drop: run driver=mongodb tags==block:drop-collection threads==1 cycles==UNDEF

View File

@@ -3,7 +3,7 @@ description: An example of a basic mongo insert and find.
scenarios: scenarios:
default: default:
rampup: run driver=mongodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,1000000) threads=auto rampup: run driver=mongodb tags==block:rampup cycles===TEMPLATE(rampup-cycles,1000000) threads=auto
main: run driver=mongodb tags==block:'main-*.*' cycles===TEMPLATE(main-cycles,10000000) threads=auto main: run driver=mongodb tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto
bindings: bindings:
seq_key: Mod(<<keyCount:1000000>>L); ToInt() seq_key: Mod(<<keyCount:1000000>>L); ToInt()

View File

@@ -6,7 +6,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=mongodb tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=mongodb tags==block:"schema.*" threads==1 cycles==UNDEF
write: run driver=mongodb tags==block:main-write,type:write cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn write: run driver=mongodb tags==block:main-write,type:write cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn
read: run driver=mongodb tags==block:main-read,type:read cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn read: run driver=mongodb tags==block:main-read,type:read cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn
update: run driver=mongodb tags==block:main-update,type:update cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn update: run driver=mongodb tags==block:main-update,type:update cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn

View File

@@ -6,7 +6,7 @@ description: |
scenarios: scenarios:
default: default:
schema: run driver=mongodb tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=mongodb tags==block:"schema.*" threads==1 cycles==UNDEF
write: run driver=mongodb tags==block:main-write,type:write cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn write: run driver=mongodb tags==block:main-write,type:write cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn
read: run driver=mongodb tags==block:main-read,type:read cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn read: run driver=mongodb tags==block:main-read,type:read cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn
update: run driver=mongodb tags==block:main-update,type:update cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn update: run driver=mongodb tags==block:main-update,type:update cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn

View File

@@ -6,7 +6,7 @@ description: |
It's a counterpart of the Stargate's Documents API Basic Search workflow. It's a counterpart of the Stargate's Documents API Basic Search workflow.
scenarios: scenarios:
schema: run driver=mongodb tags==block:'schema.*' threads==1 cycles==UNDEF schema: run driver=mongodb tags==block:"schema.*" threads==1 cycles==UNDEF
rampup-write: run driver=mongodb tags==block:rampup-write cycles===TEMPLATE(docscount,10000000) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=auto errors=timer,warn rampup-write: run driver=mongodb tags==block:rampup-write cycles===TEMPLATE(docscount,10000000) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=auto errors=timer,warn
rampup-read: run driver=mongodb tags==block:rampup-read cycles===TEMPLATE(rampup-cycles, 10000000) field-projection=TEMPLATE(fields,null) threads=<<threads:auto>> errors=timer,warn rampup-read: run driver=mongodb tags==block:rampup-read cycles===TEMPLATE(rampup-cycles, 10000000) field-projection=TEMPLATE(fields,null) threads=<<threads:auto>> errors=timer,warn
main: run driver=mongodb tags==block:main cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) field-projection=TEMPLATE(fields,null) threads=<<threads:auto>> errors=timer,warn main: run driver=mongodb tags==block:main cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) field-projection=TEMPLATE(fields,null) threads=<<threads:auto>> errors=timer,warn

View File

@@ -32,8 +32,10 @@ import org.apache.pulsar.client.admin.PulsarAdminBuilder;
import org.apache.pulsar.client.api.*; import org.apache.pulsar.client.api.*;
import org.apache.pulsar.common.schema.KeyValueEncodingType; import org.apache.pulsar.common.schema.KeyValueEncodingType;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
public class PulsarSpace implements AutoCloseable { public class PulsarSpace implements AutoCloseable {
@@ -50,9 +52,18 @@ public class PulsarSpace implements AutoCloseable {
private PulsarAdmin pulsarAdmin; private PulsarAdmin pulsarAdmin;
private Schema<?> pulsarSchema; private Schema<?> pulsarSchema;
private final ConcurrentHashMap<String, Producer<?>> producers = new ConcurrentHashMap<>(); public record ProducerCacheKey(String producerName, String topicName) {
private final ConcurrentHashMap<String, Consumer<?>> consumers = new ConcurrentHashMap<>(); }
private final ConcurrentHashMap<String, Reader<?>> readers = new ConcurrentHashMap<>();
private final ConcurrentHashMap<ProducerCacheKey, Producer<?>> producers = new ConcurrentHashMap<>();
public record ConsumerCacheKey(String consumerName, String subscriptionName, List<String> topicNameList, String topicPattern) {
}
private final ConcurrentHashMap<ConsumerCacheKey, Consumer<?>> consumers = new ConcurrentHashMap<>();
public record ReaderCacheKey(String readerName, String topicName, String startMsgPosStr) {
}
private final ConcurrentHashMap<ReaderCacheKey, Reader<?>> readers = new ConcurrentHashMap<>();
public PulsarSpace(String spaceName, NBConfiguration cfg) { public PulsarSpace(String spaceName, NBConfiguration cfg) {
@@ -89,13 +100,11 @@ public class PulsarSpace implements AutoCloseable {
public int getProducerSetCnt() { return producers.size(); } public int getProducerSetCnt() { return producers.size(); }
public int getConsumerSetCnt() { return consumers.size(); } public int getConsumerSetCnt() { return consumers.size(); }
public int getReaderSetCnt() { return readers.size(); } public int getReaderSetCnt() { return readers.size(); }
public Producer<?> getProducer(String name) { return producers.get(name); } public Producer<?> getProducer(ProducerCacheKey key, Supplier<Producer<?>> producerSupplier) { return producers.computeIfAbsent(key, __ -> producerSupplier.get()); }
public void setProducer(String name, Producer<?> producer) { producers.put(name, producer); }
public Consumer<?> getConsumer(String name) { return consumers.get(name); }
public void setConsumer(String name, Consumer<?> consumer) { consumers.put(name, consumer); }
public Reader<?> getReader(String name) { return readers.get(name); } public Consumer<?> getConsumer(ConsumerCacheKey key, Supplier<Consumer<?>> consumerSupplier) { return consumers.computeIfAbsent(key, __ -> consumerSupplier.get()); }
public void setReader(String name, Reader<?> reader) { readers.put(name, reader); }
public Reader<?> getReader(ReaderCacheKey key, Supplier<Reader<?>> readerSupplier) { return readers.computeIfAbsent(key, __ -> readerSupplier.get()); }
/** /**

View File

@@ -37,7 +37,6 @@ import java.util.*;
import java.util.function.LongFunction; import java.util.function.LongFunction;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, PulsarSpace> implements NBNamedElement { public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, PulsarSpace> implements NBNamedElement {
@@ -239,10 +238,8 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
PulsarAdapterUtil.PRODUCER_CONF_STD_KEY.producerName.label, PulsarAdapterUtil.PRODUCER_CONF_STD_KEY.producerName.label,
cycleProducerName); cycleProducerName);
String producerCacheKey = PulsarAdapterUtil.buildCacheKey(producerName, topicName); PulsarSpace.ProducerCacheKey producerCacheKey = new PulsarSpace.ProducerCacheKey(producerName, topicName);
Producer<?> producer = pulsarSpace.getProducer(producerCacheKey); return pulsarSpace.getProducer(producerCacheKey, () -> {
if (producer == null) {
PulsarClient pulsarClient = pulsarSpace.getPulsarClient(); PulsarClient pulsarClient = pulsarSpace.getPulsarClient();
// Get other possible producer settings that are set at global level // Get other possible producer settings that are set at global level
@@ -262,21 +259,17 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
producerBuilder = producerBuilder.producerName(producerName); producerBuilder = producerBuilder.producerName(producerName);
} }
producer = producerBuilder.create(); Producer<?> producer = producerBuilder.create();
pulsarSpace.setProducer(producerCacheKey, producer);
pulsarAdapterMetrics.registerProducerApiMetrics(producer, pulsarAdapterMetrics.registerProducerApiMetrics(producer,
getPulsarAPIMetricsPrefix( getPulsarAPIMetricsPrefix(
PulsarAdapterUtil.PULSAR_API_TYPE.PRODUCER.label, PulsarAdapterUtil.PULSAR_API_TYPE.PRODUCER.label,
producerName, producerName,
topicName)); topicName));
} return producer;
catch (PulsarClientException ple) { } catch (PulsarClientException ple) {
throw new PulsarAdapterUnexpectedException("Failed to create a Pulsar producer."); throw new PulsarAdapterUnexpectedException("Failed to create a Pulsar producer.");
} }
} });
return producer;
} }
private List<String> getEffectiveConsumerTopicNameList(String cycleTopicNameListStr) { private List<String> getEffectiveConsumerTopicNameList(String cycleTopicNameListStr) {
@@ -296,24 +289,6 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
return effectiveTopicNameList; return effectiveTopicNameList;
} }
private Pattern getEffectiveConsumerTopicPattern(String cycleTopicPatternStr) {
String effectiveTopicPatternStr = getEffectiveConValue(
PulsarAdapterUtil.CONF_GATEGORY.Consumer.label,
PulsarAdapterUtil.CONSUMER_CONF_STD_KEY.topicsPattern.label,
cycleTopicPatternStr);
Pattern topicsPattern;
try {
if (!StringUtils.isBlank(effectiveTopicPatternStr))
topicsPattern = Pattern.compile(effectiveTopicPatternStr);
else
topicsPattern = null;
} catch (PatternSyntaxException pse) {
topicsPattern = null;
}
return topicsPattern;
}
private SubscriptionType getEffectiveSubscriptionType(String cycleSubscriptionType) { private SubscriptionType getEffectiveSubscriptionType(String cycleSubscriptionType) {
String subscriptionTypeStr = getEffectiveConValue( String subscriptionTypeStr = getEffectiveConValue(
PulsarAdapterUtil.CONF_GATEGORY.Consumer.label, PulsarAdapterUtil.CONF_GATEGORY.Consumer.label,
@@ -344,11 +319,10 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
List<String> topicNameList = getEffectiveConsumerTopicNameList(cycleTopicNameListStr); List<String> topicNameList = getEffectiveConsumerTopicNameList(cycleTopicNameListStr);
String topicPatternStr = getEffectiveConValue( String topicPatternStr = StringUtils.trimToNull(getEffectiveConValue(
PulsarAdapterUtil.CONF_GATEGORY.Consumer.label, PulsarAdapterUtil.CONF_GATEGORY.Consumer.label,
PulsarAdapterUtil.CONSUMER_CONF_STD_KEY.topicsPattern.label, PulsarAdapterUtil.CONSUMER_CONF_STD_KEY.topicsPattern.label,
cycleTopicPatternStr); cycleTopicPatternStr));
Pattern topicPattern = getEffectiveConsumerTopicPattern(cycleTopicPatternStr);
String subscriptionName = getEffectiveConValue( String subscriptionName = getEffectiveConValue(
PulsarAdapterUtil.CONF_GATEGORY.Consumer.label, PulsarAdapterUtil.CONF_GATEGORY.Consumer.label,
@@ -368,28 +342,14 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
"creating multiple consumers of \"Exclusive\" subscription type under the same subscription name"); "creating multiple consumers of \"Exclusive\" subscription type under the same subscription name");
} }
if ( (topicNameList.isEmpty() && (topicPattern == null)) || if ( (topicNameList.isEmpty() && (topicPatternStr == null)) ||
(!topicNameList.isEmpty() && (topicPattern != null)) ) { (!topicNameList.isEmpty() && (topicPatternStr != null)) ) {
throw new PulsarAdapterInvalidParamException( throw new PulsarAdapterInvalidParamException(
"Invalid combination of topic name(s) and topic patterns; only specify one parameter!"); "Invalid combination of topic name(s) and topic patterns; only specify one parameter!");
} }
boolean multiTopicConsumer = (topicNameList.size() > 1 || (topicPattern != null)); return pulsarSpace.getConsumer(
new PulsarSpace.ConsumerCacheKey(consumerName, subscriptionName, topicNameList, topicPatternStr), () -> {
String consumerTopicListString;
if (!topicNameList.isEmpty()) {
consumerTopicListString = String.join("|", topicNameList);
} else {
consumerTopicListString = topicPatternStr;
}
String consumerCacheKey = PulsarAdapterUtil.buildCacheKey(
consumerName,
subscriptionName,
consumerTopicListString);
Consumer<?> consumer = pulsarSpace.getConsumer(consumerCacheKey);
if (consumer == null) {
PulsarClient pulsarClient = pulsarSpace.getPulsarClient(); PulsarClient pulsarClient = pulsarSpace.getPulsarClient();
// Get other possible consumer settings that are set at global level // Get other possible consumer settings that are set at global level
@@ -417,6 +377,7 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
consumerConfToLoad.remove(PulsarAdapterUtil.CONSUMER_CONF_STD_KEY.negativeAckRedeliveryBackoff.label); consumerConfToLoad.remove(PulsarAdapterUtil.CONSUMER_CONF_STD_KEY.negativeAckRedeliveryBackoff.label);
consumerConfToLoad.remove(PulsarAdapterUtil.CONSUMER_CONF_STD_KEY.ackTimeoutRedeliveryBackoff.label); consumerConfToLoad.remove(PulsarAdapterUtil.CONSUMER_CONF_STD_KEY.ackTimeoutRedeliveryBackoff.label);
boolean multiTopicConsumer = (topicNameList.size() > 1 || (topicPatternStr != null));
if (!multiTopicConsumer) { if (!multiTopicConsumer) {
assert (topicNameList.size() == 1); assert (topicNameList.size() == 1);
consumerBuilder = pulsarClient.newConsumer(pulsarSpace.getPulsarSchema()); consumerBuilder = pulsarClient.newConsumer(pulsarSpace.getPulsarSchema());
@@ -429,6 +390,7 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
consumerBuilder.topics(topicNameList); consumerBuilder.topics(topicNameList);
} }
else { else {
Pattern topicPattern = Pattern.compile(topicPatternStr);
consumerBuilder.topicsPattern(topicPattern); consumerBuilder.topicsPattern(topicPattern);
} }
} }
@@ -465,22 +427,22 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
consumerBuilder.keySharedPolicy(keySharedPolicy); consumerBuilder.keySharedPolicy(keySharedPolicy);
} }
consumer = consumerBuilder.subscribe(); Consumer<?> consumer = consumerBuilder.subscribe();
pulsarSpace.setConsumer(consumerCacheKey, consumer);
String consumerTopicListString = (!topicNameList.isEmpty()) ? String.join("|", topicNameList) : topicPatternStr;
pulsarAdapterMetrics.registerConsumerApiMetrics( pulsarAdapterMetrics.registerConsumerApiMetrics(
consumer, consumer,
getPulsarAPIMetricsPrefix( getPulsarAPIMetricsPrefix(
PulsarAdapterUtil.PULSAR_API_TYPE.CONSUMER.label, PulsarAdapterUtil.PULSAR_API_TYPE.CONSUMER.label,
consumerName, consumerName,
consumerTopicListString)); consumerTopicListString));
return consumer;
} }
catch (PulsarClientException ple) { catch (PulsarClientException ple) {
throw new PulsarAdapterUnexpectedException("Failed to create a Pulsar consumer!"); throw new PulsarAdapterUnexpectedException("Failed to create a Pulsar consumer!");
} }
} });
return consumer;
} }
private static Range[] parseRanges(String ranges) { private static Range[] parseRanges(String ranges) {
@@ -528,10 +490,7 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
throw new RuntimeException("Reader:: Invalid value for reader start message position!"); throw new RuntimeException("Reader:: Invalid value for reader start message position!");
} }
String readerCacheKey = PulsarAdapterUtil.buildCacheKey(topicName, readerName, startMsgPosStr); return pulsarSpace.getReader(new PulsarSpace.ReaderCacheKey(readerName, topicName, startMsgPosStr), () -> {
Reader<?> reader = pulsarSpace.getReader(readerCacheKey);
if (reader == null) {
PulsarClient pulsarClient = pulsarSpace.getPulsarClient();; PulsarClient pulsarClient = pulsarSpace.getPulsarClient();;
Map<String, Object> readerConf = pulsarSpace.getPulsarNBClientConf().getReaderConfMapTgt(); Map<String, Object> readerConf = pulsarSpace.getPulsarNBClientConf().getReaderConfMapTgt();
@@ -558,17 +517,12 @@ public abstract class PulsarBaseOpDispenser extends BaseOpDispenser<PulsarOp, P
// startMsgId = MessageId.latest; // startMsgId = MessageId.latest;
//} //}
reader = readerBuilder.startMessageId(startMsgId).create(); return readerBuilder.startMessageId(startMsgId).create();
} catch (PulsarClientException ple) { } catch (PulsarClientException ple) {
ple.printStackTrace(); ple.printStackTrace();
throw new RuntimeException("Unable to create a Pulsar reader!"); throw new RuntimeException("Unable to create a Pulsar reader!");
} }
});
pulsarSpace.setReader(readerCacheKey, reader);
}
return reader;
} }
// //
////////////////////////////////////// //////////////////////////////////////

View File

@@ -16,6 +16,7 @@
package io.nosqlbench.adapter.pulsar.util; package io.nosqlbench.adapter.pulsar.util;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.nosqlbench.adapter.pulsar.exception.PulsarAdapterInvalidParamException; import io.nosqlbench.adapter.pulsar.exception.PulsarAdapterInvalidParamException;
import io.nosqlbench.adapter.pulsar.exception.PulsarAdapterUnexpectedException; import io.nosqlbench.adapter.pulsar.exception.PulsarAdapterUnexpectedException;
@@ -23,6 +24,8 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.apache.pulsar.client.api.Schema; import org.apache.pulsar.client.api.Schema;
import org.apache.pulsar.common.schema.SchemaInfo;
import org.apache.pulsar.common.schema.SchemaType;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
@@ -30,7 +33,11 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.*; import java.util.Base64;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -60,9 +67,6 @@ public class PulsarAdapterUtil {
this.label = label; this.label = label;
} }
} }
public static boolean isValidDocLevelParam(String param) {
return Arrays.stream(DOC_LEVEL_PARAMS.values()).anyMatch(t -> t.label.equals(param));
}
/////// ///////
// Message processing sequence error simulation types // Message processing sequence error simulation types
@@ -77,29 +81,21 @@ public class PulsarAdapterUtil {
this.label = label; this.label = label;
} }
private static final Map<String, MSG_SEQ_ERROR_SIMU_TYPE> MAPPING = new HashMap<>(); private static final Map<String, MSG_SEQ_ERROR_SIMU_TYPE> MAPPING = Stream.of(values())
.flatMap(simuType ->
static { Stream.of(simuType.label,
for (MSG_SEQ_ERROR_SIMU_TYPE simuType : values()) { simuType.label.toLowerCase(),
MAPPING.put(simuType.label, simuType); simuType.label.toUpperCase(),
MAPPING.put(simuType.label.toLowerCase(), simuType); simuType.name(),
MAPPING.put(simuType.label.toUpperCase(), simuType); simuType.name().toLowerCase(),
MAPPING.put(simuType.name(), simuType); simuType.name().toUpperCase())
MAPPING.put(simuType.name().toLowerCase(), simuType); .distinct().map(key -> Map.entry(key, simuType)))
MAPPING.put(simuType.name().toUpperCase(), simuType); .collect(Collectors.toUnmodifiableMap(Map.Entry::getKey, Map.Entry::getValue));
}
}
public static Optional<MSG_SEQ_ERROR_SIMU_TYPE> parseSimuType(String simuTypeString) { public static Optional<MSG_SEQ_ERROR_SIMU_TYPE> parseSimuType(String simuTypeString) {
return Optional.ofNullable(MAPPING.get(simuTypeString.trim())); return Optional.ofNullable(MAPPING.get(simuTypeString.trim()));
} }
} }
public static boolean isValidSeqErrSimuType(String item) {
return Arrays.stream(MSG_SEQ_ERROR_SIMU_TYPE.values()).anyMatch(t -> t.label.equals(item));
}
public static String getValidSeqErrSimuTypeList() {
return Arrays.stream(MSG_SEQ_ERROR_SIMU_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", "));
}
/////// ///////
// Valid Pulsar API type // Valid Pulsar API type
@@ -113,12 +109,15 @@ public class PulsarAdapterUtil {
PULSAR_API_TYPE(String label) { PULSAR_API_TYPE(String label) {
this.label = label; this.label = label;
} }
private static final Set<String> LABELS = Stream.of(values()).map(v -> v.label).collect(Collectors.toUnmodifiableSet());
public static boolean isValidLabel(String label) {
return LABELS.contains(label);
}
} }
public static boolean isValidPulsarApiType(String param) { public static boolean isValidPulsarApiType(String param) {
return Arrays.stream(PULSAR_API_TYPE.values()).anyMatch(t -> t.label.equals(param)); return PULSAR_API_TYPE.isValidLabel(param);
}
public static String getValidPulsarApiTypeList() {
return Arrays.stream(PULSAR_API_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", "));
} }
@@ -136,14 +135,16 @@ public class PulsarAdapterUtil {
CONF_GATEGORY(String label) { CONF_GATEGORY(String label) {
this.label = label; this.label = label;
} }
private static final Set<String> LABELS = Stream.of(values()).map(v -> v.label).collect(Collectors.toUnmodifiableSet());
public static boolean isValidLabel(String label) {
return LABELS.contains(label);
}
} }
public static boolean isValidConfCategory(String item) { public static boolean isValidConfCategory(String item) {
return Arrays.stream(CONF_GATEGORY.values()).anyMatch(t -> t.label.equals(item)); return CONF_GATEGORY.isValidLabel(item);
} }
public static String getValidConfCategoryList() {
return Arrays.stream(CONF_GATEGORY.values()).map(t -> t.label).collect(Collectors.joining(", "));
}
/////// ///////
// Valid persistence type // Valid persistence type
public enum PERSISTENT_TYPES { public enum PERSISTENT_TYPES {
@@ -156,9 +157,6 @@ public class PulsarAdapterUtil {
this.label = label; this.label = label;
} }
} }
public static boolean isValidPersistenceType(String type) {
return Arrays.stream(PERSISTENT_TYPES.values()).anyMatch(t -> t.label.equals(type));
}
/////// ///////
// Valid Pulsar client configuration (activity-level settings) // Valid Pulsar client configuration (activity-level settings)
@@ -194,9 +192,6 @@ public class PulsarAdapterUtil {
this.label = label; this.label = label;
} }
} }
public static boolean isValidClientConfItem(String item) {
return Arrays.stream(CLNT_CONF_KEY.values()).anyMatch(t -> t.label.equals(item));
}
/////// ///////
// Standard producer configuration (activity-level settings) // Standard producer configuration (activity-level settings)
@@ -222,9 +217,6 @@ public class PulsarAdapterUtil {
this.label = label; this.label = label;
} }
} }
public static boolean isStandardProducerConfItem(String item) {
return Arrays.stream(PRODUCER_CONF_STD_KEY.values()).anyMatch(t -> t.label.equals(item));
}
// compressionType // compressionType
public enum COMPRESSION_TYPE { public enum COMPRESSION_TYPE {
@@ -239,12 +231,12 @@ public class PulsarAdapterUtil {
COMPRESSION_TYPE(String label) { COMPRESSION_TYPE(String label) {
this.label = label; this.label = label;
} }
private final static String TYPE_LIST = Stream.of(COMPRESSION_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", "));
} }
public static boolean isValidCompressionType(String item) {
return Arrays.stream(COMPRESSION_TYPE.values()).anyMatch(t -> t.label.equals(item));
}
public static String getValidCompressionTypeList() { public static String getValidCompressionTypeList() {
return Arrays.stream(COMPRESSION_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", ")); return COMPRESSION_TYPE.TYPE_LIST;
} }
/////// ///////
@@ -284,9 +276,6 @@ public class PulsarAdapterUtil {
this.label = label; this.label = label;
} }
} }
public static boolean isStandardConsumerConfItem(String item) {
return Arrays.stream(CONSUMER_CONF_STD_KEY.values()).anyMatch(t -> t.label.equals(item));
}
/////// ///////
// Custom consumer configuration (activity-level settings) // Custom consumer configuration (activity-level settings)
@@ -301,9 +290,16 @@ public class PulsarAdapterUtil {
CONSUMER_CONF_CUSTOM_KEY(String label) { CONSUMER_CONF_CUSTOM_KEY(String label) {
this.label = label; this.label = label;
} }
private static final Set<String> LABELS = Stream.of(values()).map(v -> v.label).collect(Collectors.toUnmodifiableSet());
public static boolean isValidLabel(String label) {
return LABELS.contains(label);
}
} }
public static boolean isCustomConsumerConfItem(String item) { public static boolean isCustomConsumerConfItem(String item) {
return Arrays.stream(CONSUMER_CONF_CUSTOM_KEY.values()).anyMatch(t -> t.label.equals(item)); return CONSUMER_CONF_CUSTOM_KEY.isValidLabel(item);
} }
// subscriptionTyp // subscriptionTyp
@@ -318,12 +314,21 @@ public class PulsarAdapterUtil {
SUBSCRIPTION_TYPE(String label) { SUBSCRIPTION_TYPE(String label) {
this.label = label; this.label = label;
} }
private static final Set<String> LABELS = Stream.of(values()).map(v -> v.label)
.collect(Collectors.toUnmodifiableSet());
public static boolean isValidLabel(String label) {
return LABELS.contains(label);
}
private final static String TYPE_LIST = Stream.of(COMPRESSION_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", "));
} }
public static boolean isValidSubscriptionType(String item) { public static boolean isValidSubscriptionType(String item) {
return Arrays.stream(SUBSCRIPTION_TYPE.values()).anyMatch(t -> t.label.equals(item)); return SUBSCRIPTION_TYPE.isValidLabel(item);
} }
public static String getValidSubscriptionTypeList() { public static String getValidSubscriptionTypeList() {
return Arrays.stream(SUBSCRIPTION_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", ")); return SUBSCRIPTION_TYPE.TYPE_LIST;
} }
// subscriptionInitialPosition // subscriptionInitialPosition
@@ -336,12 +341,12 @@ public class PulsarAdapterUtil {
SUBSCRIPTION_INITIAL_POSITION(String label) { SUBSCRIPTION_INITIAL_POSITION(String label) {
this.label = label; this.label = label;
} }
}
public static boolean isValidSubscriptionInitialPosition(String item) { private final static String TYPE_LIST = Stream.of(COMPRESSION_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", "));
return Arrays.stream(SUBSCRIPTION_INITIAL_POSITION.values()).anyMatch(t -> t.label.equals(item));
} }
public static String getValidSubscriptionInitialPositionList() { public static String getValidSubscriptionInitialPositionList() {
return Arrays.stream(SUBSCRIPTION_INITIAL_POSITION.values()).map(t -> t.label).collect(Collectors.joining(", ")); return SUBSCRIPTION_INITIAL_POSITION.TYPE_LIST;
} }
// regexSubscriptionMode // regexSubscriptionMode
@@ -355,12 +360,12 @@ public class PulsarAdapterUtil {
REGEX_SUBSCRIPTION_MODE(String label) { REGEX_SUBSCRIPTION_MODE(String label) {
this.label = label; this.label = label;
} }
private final static String TYPE_LIST = Stream.of(COMPRESSION_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", "));
} }
public static boolean isValidRegexSubscriptionMode(String item) {
return Arrays.stream(REGEX_SUBSCRIPTION_MODE.values()).anyMatch(t -> t.label.equals(item));
}
public static String getValidRegexSubscriptionModeList() { public static String getValidRegexSubscriptionModeList() {
return Arrays.stream(REGEX_SUBSCRIPTION_MODE.values()).map(t -> t.label).collect(Collectors.joining(", ")); return REGEX_SUBSCRIPTION_MODE.TYPE_LIST;
} }
/////// ///////
@@ -383,9 +388,6 @@ public class PulsarAdapterUtil {
this.label = label; this.label = label;
} }
} }
public static boolean isStandardReaderConfItem(String item) {
return Arrays.stream(READER_CONF_STD_KEY.values()).anyMatch(t -> t.label.equals(item));
}
/////// ///////
// Custom reader configuration (activity-level settings) // Custom reader configuration (activity-level settings)
@@ -400,9 +402,6 @@ public class PulsarAdapterUtil {
this.label = label; this.label = label;
} }
} }
public static boolean isCustomReaderConfItem(String item) {
return Arrays.stream(READER_CONF_CUSTOM_KEY.values()).anyMatch(t -> t.label.equals(item));
}
/////// ///////
// Valid read positions for a Pulsar reader // Valid read positions for a Pulsar reader
@@ -415,156 +414,84 @@ public class PulsarAdapterUtil {
READER_MSG_POSITION_TYPE(String label) { READER_MSG_POSITION_TYPE(String label) {
this.label = label; this.label = label;
} }
private static final Set<String> LABELS = Stream.of(values()).map(v -> v.label)
.collect(Collectors.toUnmodifiableSet());
public static boolean isValidLabel(String label) {
return LABELS.contains(label);
}
} }
public static boolean isValideReaderStartPosition(String item) { public static boolean isValideReaderStartPosition(String item) {
return Arrays.stream(READER_MSG_POSITION_TYPE.values()).anyMatch(t -> t.label.equals(item)); return READER_MSG_POSITION_TYPE.isValidLabel(item);
} }
private static final Map<String, Schema<?>> PRIMITIVE_SCHEMA_TYPE_MAPPING = Stream.of(SchemaType.values())
.filter(SchemaType::isPrimitive)
.collect(Collectors.toUnmodifiableMap(schemaType -> schemaType.name().toUpperCase(),
schemaType -> Schema.getSchema(SchemaInfo.builder().type(schemaType).build())));
/////// ///////
// Primitive Schema type // Primitive Schema type
public static boolean isPrimitiveSchemaTypeStr(String typeStr) { public static boolean isPrimitiveSchemaTypeStr(String typeStr) {
boolean isPrimitive = false; return StringUtils.isBlank(typeStr) || PRIMITIVE_SCHEMA_TYPE_MAPPING.containsKey(typeStr.toUpperCase());
// Use "BYTES" as the default type if the type string is not explicitly specified
if (StringUtils.isBlank(typeStr)) {
typeStr = "BYTES";
}
if (typeStr.equalsIgnoreCase("BOOLEAN") || typeStr.equalsIgnoreCase("INT8") ||
typeStr.equalsIgnoreCase("INT16") || typeStr.equalsIgnoreCase("INT32") ||
typeStr.equalsIgnoreCase("INT64") || typeStr.equalsIgnoreCase("FLOAT") ||
typeStr.equalsIgnoreCase("DOUBLE") || typeStr.equalsIgnoreCase("BYTES") ||
typeStr.equalsIgnoreCase("DATE") || typeStr.equalsIgnoreCase("TIME") ||
typeStr.equalsIgnoreCase("TIMESTAMP") || typeStr.equalsIgnoreCase("INSTANT") ||
typeStr.equalsIgnoreCase("LOCAL_DATE") || typeStr.equalsIgnoreCase("LOCAL_TIME") ||
typeStr.equalsIgnoreCase("LOCAL_DATE_TIME")) {
isPrimitive = true;
}
return isPrimitive;
} }
public static Schema<?> getPrimitiveTypeSchema(String typeStr) { public static Schema<?> getPrimitiveTypeSchema(String typeStr) {
Schema<?> schema; String lookupKey = StringUtils.isBlank(typeStr) ? "BYTES" : typeStr.toUpperCase();
Schema<?> schema = PRIMITIVE_SCHEMA_TYPE_MAPPING.get(lookupKey);
if (StringUtils.isBlank(typeStr)) { if (schema == null) {
typeStr = "BYTES"; throw new PulsarAdapterInvalidParamException("Invalid Pulsar primitive schema type string : " + typeStr);
} }
switch (typeStr.toUpperCase()) {
case "BOOLEAN":
schema = Schema.BOOL;
break;
case "INT8":
schema = Schema.INT8;
break;
case "INT16":
schema = Schema.INT16;
break;
case "INT32":
schema = Schema.INT32;
break;
case "INT64":
schema = Schema.INT64;
break;
case "FLOAT":
schema = Schema.FLOAT;
break;
case "DOUBLE":
schema = Schema.DOUBLE;
break;
case "DATE":
schema = Schema.DATE;
break;
case "TIME":
schema = Schema.TIME;
break;
case "TIMESTAMP":
schema = Schema.TIMESTAMP;
break;
case "INSTANT":
schema = Schema.INSTANT;
break;
case "LOCAL_DATE":
schema = Schema.LOCAL_DATE;
break;
case "LOCAL_TIME":
schema = Schema.LOCAL_TIME;
break;
case "LOCAL_DATE_TIME":
schema = Schema.LOCAL_DATE_TIME;
break;
case "BYTES":
schema = Schema.BYTES;
break;
// Report an error if non-valid, non-empty schema type string is provided
default:
throw new PulsarAdapterInvalidParamException("Invalid Pulsar primitive schema type string : " + typeStr);
}
return schema; return schema;
} }
/////// ///////
// Complex strut type: Avro or Json // Complex strut type: Avro or Json
public static boolean isAvroSchemaTypeStr(String typeStr) { public static boolean isAvroSchemaTypeStr(String typeStr) {
return (StringUtils.isNotBlank(typeStr) && typeStr.equalsIgnoreCase("AVRO")); return "AVRO".equalsIgnoreCase(typeStr);
} }
// automatic decode the type from the Registry // automatic decode the type from the Registry
public static boolean isAutoConsumeSchemaTypeStr(String typeStr) { public static boolean isAutoConsumeSchemaTypeStr(String typeStr) {
return (StringUtils.isNotBlank(typeStr) && typeStr.equalsIgnoreCase("AUTO_CONSUME")); return "AUTO_CONSUME".equalsIgnoreCase(typeStr);
} }
public static Schema<?> getAvroSchema(String typeStr, String definitionStr) {
String schemaDefinitionStr = definitionStr;
String filePrefix = "file://";
Schema<?> schema;
private static final Map<String, Schema<?>> AVRO_SCHEMA_CACHE = new ConcurrentHashMap<>();
public static Schema<?> getAvroSchema(String typeStr, final String definitionStr) {
// Check if payloadStr points to a file (e.g. "file:///path/to/a/file") // Check if payloadStr points to a file (e.g. "file:///path/to/a/file")
if (isAvroSchemaTypeStr(typeStr)) { if (isAvroSchemaTypeStr(typeStr)) {
if (StringUtils.isBlank(schemaDefinitionStr)) { if (StringUtils.isBlank(definitionStr)) {
throw new PulsarAdapterInvalidParamException( throw new PulsarAdapterInvalidParamException("Schema definition must be provided for \"Avro\" schema type!");
"Schema definition must be provided for \"Avro\" schema type!");
} }
else if (schemaDefinitionStr.startsWith(filePrefix)) { return AVRO_SCHEMA_CACHE.computeIfAbsent(definitionStr, __ -> {
try { String schemaDefinitionStr = definitionStr;
Path filePath = Paths.get(URI.create(schemaDefinitionStr)); if (schemaDefinitionStr.startsWith("file://")) {
schemaDefinitionStr = Files.readString(filePath, StandardCharsets.US_ASCII); try {
Path filePath = Paths.get(URI.create(schemaDefinitionStr));
schemaDefinitionStr = Files.readString(filePath, StandardCharsets.UTF_8);
} catch (IOException ioe) {
throw new PulsarAdapterUnexpectedException("Error reading the specified \"Avro\" schema definition file: " + definitionStr + ": " + ioe.getMessage());
}
} }
catch (IOException ioe) { return PulsarAvroSchemaUtil.GetSchema_PulsarAvro("NBAvro", schemaDefinitionStr);
throw new PulsarAdapterUnexpectedException( });
"Error reading the specified \"Avro\" schema definition file: " + definitionStr + ": " + ioe.getMessage()); } else {
} throw new PulsarAdapterInvalidParamException("Trying to create a \"Avro\" schema for a non-Avro schema type string: " + typeStr);
}
schema = PulsarAvroSchemaUtil.GetSchema_PulsarAvro("NBAvro", schemaDefinitionStr);
} }
else {
throw new PulsarAdapterInvalidParamException(
"Trying to create a \"Avro\" schema for a non-Avro schema type string: " + typeStr);
}
return schema;
}
///////
// Generate effective key string
public static String buildCacheKey(String... keyParts) {
// Ignore blank keyPart
String joinedKeyStr =
Stream.of(keyParts)
.filter(s -> !StringUtils.isBlank(s))
.collect(Collectors.joining(","));
return Base64.getEncoder().encodeToString(joinedKeyStr.getBytes());
} }
/////// ///////
// Convert JSON string to a key/value map // Convert JSON string to a key/value map
public static Map<String, String> convertJsonToMap(String jsonStr) throws Exception { private static final ObjectMapper JACKSON_OBJECT_MAPPER = new ObjectMapper();
ObjectMapper mapper = new ObjectMapper(); private static final TypeReference<Map<String, String>> MAP_TYPE_REF = new TypeReference<>() {};
return mapper.readValue(jsonStr, Map.class);
public static Map<String, String> convertJsonToMap(String jsonStr) throws IOException {
return JACKSON_OBJECT_MAPPER.readValue(jsonStr, MAP_TYPE_REF);
} }
/////// ///////
// Get full namespace name (<tenant>/<namespace>) from a Pulsar topic URI // Get full namespace name (<tenant>/<namespace>) from a Pulsar topic URI
public static String getFullNamespaceName(String topicUri) { public static String getFullNamespaceName(String topicUri) {

View File

@@ -0,0 +1,90 @@
/*
* Copyright (c) 2022 nosqlbench
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.nosqlbench.adapter.pulsar.util;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class MessageSequenceNumberSendingHandlerTest {
MessageSequenceNumberSendingHandler sequenceNumberSendingHandler = new MessageSequenceNumberSendingHandler();
@Test
void shouldAddMonotonicSequence() {
for (long l = 1; l <= 100; l++) {
assertEquals(l, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.emptySet()));
}
}
@Test
void shouldInjectMessageLoss() {
assertEquals(1L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.emptySet()));
assertEquals(3L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.singleton(PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE.MsgLoss), 100));
}
@Test
void shouldInjectMessageDuplication() {
assertEquals(1L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.emptySet()));
assertEquals(1L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.singleton(PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE.MsgDup), 100));
}
@Test
void shouldInjectMessageOutOfOrder() {
assertEquals(1L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.emptySet()));
assertEquals(4L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.singleton(PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE.OutOfOrder), 100));
assertEquals(2L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.emptySet()));
assertEquals(3L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.emptySet()));
assertEquals(5L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.emptySet()));
assertEquals(6, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.emptySet()));
}
@Test
void shouldInjectOneOfTheSimulatedErrorsRandomly() {
Set<PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE> allErrorTypes = new HashSet<>(Arrays.asList(PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE.values()));
assertEquals(1L, sequenceNumberSendingHandler.getNextSequenceNumber(Collections.emptySet()));
long previousSequenceNumber = 1L;
int outOfSequenceInjectionCounter = 0;
int messageDupCounter = 0;
int messageLossCounter = 0;
int successCounter = 0;
for (int i = 0; i < 1000; i++) {
long nextSequenceNumber = sequenceNumberSendingHandler.getNextSequenceNumber(allErrorTypes);
if (nextSequenceNumber >= previousSequenceNumber + 3) {
outOfSequenceInjectionCounter++;
} else if (nextSequenceNumber <= previousSequenceNumber) {
messageDupCounter++;
} else if (nextSequenceNumber >= previousSequenceNumber + 2) {
messageLossCounter++;
} else if (nextSequenceNumber == previousSequenceNumber + 1) {
successCounter++;
}
previousSequenceNumber = nextSequenceNumber;
}
assertTrue(outOfSequenceInjectionCounter > 0);
assertTrue(messageDupCounter > 0);
assertTrue(messageLossCounter > 0);
assertEquals(1000, outOfSequenceInjectionCounter + messageDupCounter + messageLossCounter + successCounter);
}
}

View File

@@ -0,0 +1,247 @@
/*
* Copyright (c) 2022 nosqlbench
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package io.nosqlbench.adapter.pulsar.util;
import com.codahale.metrics.Counter;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ReceivedMessageSequenceTrackerTest {
Counter msgErrOutOfSeqCounter = new Counter();
Counter msgErrDuplicateCounter = new Counter();
Counter msgErrLossCounter = new Counter();
ReceivedMessageSequenceTracker messageSequenceTracker = new ReceivedMessageSequenceTracker(msgErrOutOfSeqCounter, msgErrDuplicateCounter, msgErrLossCounter, 20, 20);
@Test
void shouldCountersBeZeroWhenSequenceDoesntContainGaps() {
// when
for (long l = 0; l < 100L; l++) {
messageSequenceTracker.sequenceNumberReceived(l);
}
messageSequenceTracker.close();
// then
assertEquals(0, msgErrOutOfSeqCounter.getCount());
assertEquals(0, msgErrDuplicateCounter.getCount());
assertEquals(0, msgErrLossCounter.getCount());
}
@ParameterizedTest
@ValueSource(longs = {10L, 11L, 19L, 20L, 21L, 100L})
void shouldDetectMsgLossWhenEverySecondMessageIsLost(long totalMessages) {
doShouldDetectMsgLoss(totalMessages, 2);
}
@ParameterizedTest
@ValueSource(longs = {10L, 11L, 19L, 20L, 21L, 100L})
void shouldDetectMsgLossWhenEveryThirdMessageIsLost(long totalMessages) {
doShouldDetectMsgLoss(totalMessages, 3);
}
@ParameterizedTest
@ValueSource(longs = {20L, 21L, 40L, 41L, 42L, 43L, 100L})
void shouldDetectMsgLossWhenEvery21stMessageIsLost(long totalMessages) {
doShouldDetectMsgLoss(totalMessages, 21);
}
private void doShouldDetectMsgLoss(long totalMessages, int looseEveryNthMessage) {
int messagesLost = 0;
// when
boolean lastMessageWasLost = false;
for (long l = 0; l < totalMessages; l++) {
if (l % looseEveryNthMessage == 1) {
messagesLost++;
lastMessageWasLost = true;
continue;
} else {
lastMessageWasLost = false;
}
messageSequenceTracker.sequenceNumberReceived(l);
}
if (lastMessageWasLost) {
messageSequenceTracker.sequenceNumberReceived(totalMessages);
}
messageSequenceTracker.close();
// then
assertEquals(0, msgErrOutOfSeqCounter.getCount());
assertEquals(0, msgErrDuplicateCounter.getCount());
assertEquals(messagesLost, msgErrLossCounter.getCount());
}
@ParameterizedTest
@ValueSource(longs = {10L, 11L, 19L, 20L, 21L, 100L})
void shouldDetectMsgDuplication(long totalMessages) {
int messagesDuplicated = 0;
// when
for (long l = 0; l < totalMessages; l++) {
if (l % 2 == 1) {
messagesDuplicated++;
messageSequenceTracker.sequenceNumberReceived(l);
}
messageSequenceTracker.sequenceNumberReceived(l);
}
if (totalMessages % 2 == 0) {
messageSequenceTracker.sequenceNumberReceived(totalMessages);
}
if (totalMessages < 2 * messageSequenceTracker.getMaxTrackOutOfOrderSequenceNumbers()) {
messageSequenceTracker.close();
}
// then
assertEquals(0, msgErrOutOfSeqCounter.getCount());
assertEquals(messagesDuplicated, msgErrDuplicateCounter.getCount());
assertEquals(0, msgErrLossCounter.getCount());
}
@Test
void shouldDetectSingleMessageOutOfSequence() {
// when
for (long l = 0; l < 10L; l++) {
messageSequenceTracker.sequenceNumberReceived(l);
}
messageSequenceTracker.sequenceNumberReceived(10L);
messageSequenceTracker.sequenceNumberReceived(12L);
messageSequenceTracker.sequenceNumberReceived(11L);
for (long l = 13L; l < 100L; l++) {
messageSequenceTracker.sequenceNumberReceived(l);
}
// then
assertEquals(1, msgErrOutOfSeqCounter.getCount());
assertEquals(0, msgErrDuplicateCounter.getCount());
assertEquals(0, msgErrLossCounter.getCount());
}
@Test
void shouldDetectMultipleMessagesOutOfSequence() {
// when
for (long l = 0; l < 10L; l++) {
messageSequenceTracker.sequenceNumberReceived(l);
}
messageSequenceTracker.sequenceNumberReceived(10L);
messageSequenceTracker.sequenceNumberReceived(14L);
messageSequenceTracker.sequenceNumberReceived(13L);
messageSequenceTracker.sequenceNumberReceived(11L);
messageSequenceTracker.sequenceNumberReceived(12L);
for (long l = 15L; l < 100L; l++) {
messageSequenceTracker.sequenceNumberReceived(l);
}
// then
assertEquals(2, msgErrOutOfSeqCounter.getCount());
assertEquals(0, msgErrDuplicateCounter.getCount());
assertEquals(0, msgErrLossCounter.getCount());
}
@Test
void shouldDetectIndividualMessageLoss() {
// when
for (long l = 0; l < 100L; l++) {
if (l != 11L) {
messageSequenceTracker.sequenceNumberReceived(l);
}
}
messageSequenceTracker.close();
// then
assertEquals(0, msgErrOutOfSeqCounter.getCount());
assertEquals(0, msgErrDuplicateCounter.getCount());
assertEquals(1, msgErrLossCounter.getCount());
}
@Test
void shouldDetectGapAndMessageDuplication() {
// when
for (long l = 0; l < 100L; l++) {
if (l != 11L) {
messageSequenceTracker.sequenceNumberReceived(l);
}
if (l == 12L) {
messageSequenceTracker.sequenceNumberReceived(l);
}
}
messageSequenceTracker.close();
// then
assertEquals(0, msgErrOutOfSeqCounter.getCount());
assertEquals(1, msgErrDuplicateCounter.getCount());
assertEquals(1, msgErrLossCounter.getCount());
}
@Test
void shouldDetectGapAndMessageDuplicationTimes2() {
// when
for (long l = 0; l < 100L; l++) {
if (l != 11L) {
messageSequenceTracker.sequenceNumberReceived(l);
}
if (l == 12L) {
messageSequenceTracker.sequenceNumberReceived(l);
messageSequenceTracker.sequenceNumberReceived(l);
}
}
messageSequenceTracker.close();
// then
assertEquals(0, msgErrOutOfSeqCounter.getCount());
assertEquals(2, msgErrDuplicateCounter.getCount());
assertEquals(1, msgErrLossCounter.getCount());
}
@Test
void shouldDetectDelayedOutOfOrderDelivery() {
// when
for (long l = 0; l < 5 * messageSequenceTracker.getMaxTrackOutOfOrderSequenceNumbers(); l++) {
if (l != 10) {
messageSequenceTracker.sequenceNumberReceived(l);
}
if (l == messageSequenceTracker.getMaxTrackOutOfOrderSequenceNumbers() * 2) {
messageSequenceTracker.sequenceNumberReceived(10);
}
}
messageSequenceTracker.close();
// then
assertEquals(1, msgErrOutOfSeqCounter.getCount());
assertEquals(0, msgErrDuplicateCounter.getCount());
assertEquals(0, msgErrLossCounter.getCount());
}
@Test
void shouldDetectDelayedOutOfOrderDeliveryOf2ConsecutiveSequenceNumbers() {
// when
for (long l = 0; l < 5 * messageSequenceTracker.getMaxTrackOutOfOrderSequenceNumbers(); l++) {
if (l != 10 && l != 11) {
messageSequenceTracker.sequenceNumberReceived(l);
}
if (l == messageSequenceTracker.getMaxTrackOutOfOrderSequenceNumbers() * 2) {
messageSequenceTracker.sequenceNumberReceived(10);
messageSequenceTracker.sequenceNumberReceived(11);
}
}
messageSequenceTracker.close();
// then
assertEquals(2, msgErrOutOfSeqCounter.getCount());
assertEquals(0, msgErrDuplicateCounter.getCount());
assertEquals(0, msgErrLossCounter.getCount());
}
}

View File

@@ -33,7 +33,7 @@ Run a stdout activity named 'stdout-test', with definitions from activities/stdo
To enable, specifies the type of the SSL implementation with either `jdk` or `openssl`. To enable, specifies the type of the SSL implementation with either `jdk` or `openssl`.
[Additional parameters may need to be provided](../../../../driver-cql/src/main/resources/ssl.md). See the ssl help topic for more details with `nb5 help ssl` for more details.
- **host** - this is the name to bind to (local interface address) - **host** - this is the name to bind to (local interface address)
- default: localhost - default: localhost

View File

@@ -45,7 +45,7 @@ Run a stdout activity named 'stdout-test', with definitions from activities/stdo
To enable, specifies the type of the SSL implementation with either `jdk` or `openssl`. To enable, specifies the type of the SSL implementation with either `jdk` or `openssl`.
[Additional parameters may need to be provided](../../../../driver-cql/src/main/resources/ssl.md). See the ssl help topic for more details with `nb5 help ssl` for more details.
- **host** - this is the name to bind to (local interface address) - **host** - this is the name to bind to (local interface address)
- default: localhost - default: localhost

View File

@@ -77,7 +77,7 @@ public class RawYamlTemplateLoaderTest {
assertThat(schemaOnlyScenario.keySet()) assertThat(schemaOnlyScenario.keySet())
.containsExactly("000"); .containsExactly("000");
assertThat(schemaOnlyScenario.values()) assertThat(schemaOnlyScenario.values())
.containsExactly("run driver=blah tags=block:'schema.*'"); .containsExactly("run driver=blah tags=block:\"schema.*\"");
assertThat(rawOpsDoc.getName()).isEqualTo("doc1"); assertThat(rawOpsDoc.getName()).isEqualTo("doc1");
assertThat(blocks).hasSize(1); assertThat(blocks).hasSize(1);

View File

@@ -7,7 +7,7 @@ scenarios:
- run driver=stdout alias=step1 - run driver=stdout alias=step1
- run driver=stdout alias=step2 - run driver=stdout alias=step2
schema-only: schema-only:
- run driver=blah tags=block:'schema.*' - run driver=blah tags=block:"schema.*"
tags: tags:
atagname: atagvalue atagname: atagvalue

View File

@@ -80,6 +80,7 @@ public class StandardActivity<R extends Op, S> extends SimpleActivity implements
for (OpTemplate ot : opTemplates) { for (OpTemplate ot : opTemplates) {
ParsedOp incompleteOpDef = new ParsedOp(ot, NBConfiguration.empty(), List.of()); ParsedOp incompleteOpDef = new ParsedOp(ot, NBConfiguration.empty(), List.of());
String driverName = incompleteOpDef.takeOptionalStaticValue("driver", String.class) String driverName = incompleteOpDef.takeOptionalStaticValue("driver", String.class)
.or(() -> incompleteOpDef.takeOptionalStaticValue("type",String.class))
.or(() -> activityDef.getParams().getOptionalString("driver")) .or(() -> activityDef.getParams().getOptionalString("driver"))
.orElseThrow(() -> new OpConfigError("Unable to identify driver name for op template:\n" + ot)); .orElseThrow(() -> new OpConfigError("Unable to identify driver name for op template:\n" + ot));

View File

@@ -16,15 +16,15 @@
package io.nosqlbench.engine.api.activityimpl.uniform; package io.nosqlbench.engine.api.activityimpl.uniform;
import io.nosqlbench.api.config.standard.NBConfigModel;
import io.nosqlbench.api.config.standard.NBConfiguration;
import io.nosqlbench.api.config.standard.NBReconfigurable;
import io.nosqlbench.api.engine.activityimpl.ActivityDef;
import io.nosqlbench.engine.api.activityapi.core.ActionDispenser; import io.nosqlbench.engine.api.activityapi.core.ActionDispenser;
import io.nosqlbench.engine.api.activityapi.core.ActivityType; import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityconfig.OpsLoader; import io.nosqlbench.engine.api.activityconfig.OpsLoader;
import io.nosqlbench.engine.api.activityconfig.yaml.OpsDocList; import io.nosqlbench.engine.api.activityconfig.yaml.OpsDocList;
import io.nosqlbench.api.engine.activityimpl.ActivityDef;
import io.nosqlbench.engine.api.activityimpl.SimpleActivity; import io.nosqlbench.engine.api.activityimpl.SimpleActivity;
import io.nosqlbench.api.config.standard.NBConfigModel;
import io.nosqlbench.api.config.standard.NBConfiguration;
import io.nosqlbench.api.config.standard.NBReconfigurable;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -39,7 +39,10 @@ public class StandardActivityType<A extends StandardActivity<?,?>> extends Simpl
private final Map<String,DriverAdapter> adapters = new HashMap<>(); private final Map<String,DriverAdapter> adapters = new HashMap<>();
public StandardActivityType(DriverAdapter<?,?> adapter, ActivityDef activityDef) { public StandardActivityType(DriverAdapter<?,?> adapter, ActivityDef activityDef) {
super(activityDef); super(activityDef
.deprecate("type","driver")
.deprecate("yaml", "workload")
);
this.adapters.put(adapter.getAdapterName(),adapter); this.adapters.put(adapter.getAdapterName(),adapter);
if (adapter instanceof ActivityDefAware) { if (adapter instanceof ActivityDefAware) {
((ActivityDefAware) adapter).setActivityDef(activityDef); ((ActivityDefAware) adapter).setActivityDef(activityDef);

View File

@@ -139,7 +139,7 @@ public class NBCLIScenarioParser {
if (selectedScenario.containsKey(stepname)) { if (selectedScenario.containsKey(stepname)) {
namedSteps.put(stepname,selectedScenario.get(stepname)); namedSteps.put(stepname,selectedScenario.get(stepname));
} else { } else {
throw new BasicError("Unable to find named scenario.step'" + scenarioName + "' in workload '" + workloadName throw new BasicError("Unable to find named scenario.step '" + scenarioName + "' in workload '" + workloadName
+ "', but you can pick from one of: " + selectedScenario.keySet().stream().map(n -> nameparts[0].concat(".").concat(n)).collect(Collectors.joining(", "))); + "', but you can pick from one of: " + selectedScenario.keySet().stream().map(n -> nameparts[0].concat(".").concat(n)).collect(Collectors.joining(", ")));
} }
} }

View File

@@ -48,7 +48,7 @@ schema_activitydef = params.withDefaults({
}); });
schema_activitydef.alias="findmax_schema"; schema_activitydef.alias="findmax_schema";
schema_activitydef.threads="1"; schema_activitydef.threads="1";
schema_activitydef.tags="TEMPLATE(schematags,block:'schema.*')"; schema_activitydef.tags="TEMPLATE(schematags,block:\"schema.*\")";
print("Creating schema with schematags:" + schema_activitydef.tags); print("Creating schema with schematags:" + schema_activitydef.tags);
scenario.run(schema_activitydef); scenario.run(schema_activitydef);

View File

@@ -120,7 +120,7 @@ public class NBCLIScenarioParserTest {
"alias", "scenariotest_schemaonly_schema", "alias", "scenariotest_schemaonly_schema",
"cycles-test", "20", "cycles-test", "20",
"driver", "stdout", "driver", "stdout",
"tags", "block:'schema.*'", "tags", "block:\"schema.*\"",
"workload", "scenario-test" "workload", "scenario-test"
)); ));
NBCLIOptions opts1 = new NBCLIOptions(new String[]{"scenario-test", "schema-only", "doundef=20"}); NBCLIOptions opts1 = new NBCLIOptions(new String[]{"scenario-test", "schema-only", "doundef=20"});
@@ -170,7 +170,7 @@ public class NBCLIScenarioParserTest {
"alias", "scenariotest_schemaonly_schema", "alias", "scenariotest_schemaonly_schema",
"cycles-test", "20", "cycles-test", "20",
"driver", "stdout", "driver", "stdout",
"tags", "block:'schema.*'", "tags", "block:\"schema.*\"",
"workload", "scenario-test" "workload", "scenario-test"
)); ));
NBCLIOptions opts1 = new NBCLIOptions(new String[]{"local/example-scenarios", "namedsteps.one", "testparam1=testvalue2"}); NBCLIOptions opts1 = new NBCLIOptions(new String[]{"local/example-scenarios", "namedsteps.one", "testparam1=testvalue2"});

View File

@@ -1,6 +1,6 @@
name: alternate-format-test name: alternate-format-test
scenarios: scenarios:
default: default:
schema: run driver=cql protocol_version=v4 tags=block:'schema.*' threads==1 cycles=UNDEF schema: run driver=cql protocol_version=v4 tags=block:"schema.*" threads==1 cycles=UNDEF
rampup: run driver=cql protocol_version=v4 tags=block:rampup cycles=10000 rampup: run driver=cql protocol_version=v4 tags=block:rampup cycles=10000
main: run driver=cql protocol_version=v4 tags=block:main_mixed cycles=10000 main: run driver=cql protocol_version=v4 tags=block:main_mixed cycles=10000

View File

@@ -2,11 +2,11 @@ min_version: "5.17.1"
scenarios: scenarios:
default: default:
schema: run driver==stdout workload===scenario-test tags=block:'schema.*' schema: run driver==stdout workload===scenario-test tags=block:"schema.*"
rampup: run driver=stdout workload===scenario-test tags=block:rampup cycles=TEMPLATE(cycles1,10) rampup: run driver=stdout workload===scenario-test tags=block:rampup cycles=TEMPLATE(cycles1,10)
main: run driver=stdout workload===scenario-test tags=block:'main.*' cycles=TEMPLATE(cycles2,10) main: run driver=stdout workload===scenario-test tags=block:"main.*" cycles=TEMPLATE(cycles2,10)
schema-only: schema-only:
schema: run driver=stdout workload==scenario-test tags=block:'schema.*' doundef==undef schema: run driver=stdout workload==scenario-test tags=block:"schema.*" doundef==undef
template-test: template-test:
with-template: run driver=stdout cycles=TEMPLATE(cycles-test,10) with-template: run driver=stdout cycles=TEMPLATE(cycles-test,10)

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022 nosqlbench * Copyright (c) 2022-2023 nosqlbench
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -41,6 +41,7 @@ public class ActivityLoader {
} }
public synchronized Activity loadActivity(ActivityDef activityDef) { public synchronized Activity loadActivity(ActivityDef activityDef) {
activityDef= activityDef.deprecate("yaml","workload").deprecate("type","driver");
Activity activity = new StandardActivityType(activityDef).getAssembledActivity(activityDef, activityMap); Activity activity = new StandardActivityType(activityDef).getAssembledActivity(activityDef, activityMap);
activityMap.put(activity.getAlias(),activity); activityMap.put(activity.getAlias(),activity);
logger.debug("Resolved activity for alias '" + activityDef.getAlias() + "'"); logger.debug("Resolved activity for alias '" + activityDef.getAlias() + "'");

View File

@@ -15,7 +15,7 @@ command line, go ahead and execute the following command, replacing
the `host=<host-or-ip>` with that of one of your database nodes. the `host=<host-or-ip>` with that of one of your database nodes.
```text ```text
./nb run driver=cql workload=cql-keyvalue tags=block:'schema.*' host=<host-or-ip> ./nb run driver=cql workload=cql-keyvalue tags=block:"schema.*" host=<host-or-ip>
``` ```
This command is creating the following schema in your database: This command is creating the following schema in your database:

View File

@@ -501,7 +501,6 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId> <artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration> <configuration>
<propertiesEncoding>ISO-8859-1</propertiesEncoding> <propertiesEncoding>ISO-8859-1</propertiesEncoding>
</configuration> </configuration>
@@ -535,7 +534,6 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration> <configuration>
<debug>true</debug> <debug>true</debug>
<target>17</target> <target>17</target>
@@ -551,7 +549,6 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M6</version>
<configuration> <configuration>
<argLine>-ea ${argLine}</argLine> <argLine>-ea ${argLine}</argLine>
<systemPropertyVariables> <systemPropertyVariables>
@@ -576,7 +573,6 @@
<plugin> <plugin>
<groupId>org.jacoco</groupId> <groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId> <artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.8</version>
<executions> <executions>
<execution> <execution>
<id>prepare-agent</id> <id>prepare-agent</id>
@@ -627,7 +623,6 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId> <artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M6</version>
<executions> <executions>
<execution> <execution>
<id>run-tests</id> <id>run-tests</id>
@@ -655,7 +650,6 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>
<version>3.4.1</version>
<configuration> <configuration>
<release>17</release> <release>17</release>
<doctitle>${javadoc.name}</doctitle> <doctitle>${javadoc.name}</doctitle>
@@ -686,7 +680,6 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId> <artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions> <executions>
<execution> <execution>
<id>attach-sources</id> <id>attach-sources</id>
@@ -702,7 +695,6 @@
<plugin> <plugin>
<groupId>org.sonatype.plugins</groupId> <groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId> <artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.13</version>
<extensions>true</extensions> <extensions>true</extensions>
<configuration> <configuration>
<serverId>ossrh</serverId> <serverId>ossrh</serverId>
@@ -714,7 +706,6 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId> <artifactId>maven-gpg-plugin</artifactId>
<version>3.0.1</version>
</plugin> </plugin>
<plugin> <plugin>
@@ -744,7 +735,6 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId> <artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<executions> <executions>
<execution> <execution>
<id>enforce-java</id> <id>enforce-java</id>
@@ -768,18 +758,18 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId> <artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version> <version>3.4.2</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId> <artifactId>maven-release-plugin</artifactId>
<version>3.0.0-M6</version> <version>3.0.0-M7</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId> <artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version> <version>3.0.1</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
@@ -789,27 +779,27 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M4</version> <version>3.0.0-M8</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId> <artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M4</version> <version>3.0.0-M8</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.1</version> <version>3.4.1</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId> <artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version> <version>3.2.1</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.sonatype.plugins</groupId> <groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId> <artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.8</version> <version>1.6.13</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.antlr</groupId> <groupId>org.antlr</groupId>
@@ -819,43 +809,43 @@
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId> <artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version> <version>3.1.0</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId> <artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version> <version>3.2.1</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId> <artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version> <version>3.2.0</version>
</plugin> </plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId> <artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version> <version>3.3.0</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.jacoco</groupId> <groupId>org.jacoco</groupId>
<artifactId>org.jacoco.ant</artifactId> <artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version> <version>${jacoco.version}</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId> <artifactId>maven-jar-plugin</artifactId>
<version>3.1.1</version> <version>3.3.0</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId> <artifactId>maven-install-plugin</artifactId>
<version>3.0.0-M1</version> <version>3.1.0</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId> <artifactId>maven-deploy-plugin</artifactId>
<version>3.0.0-M1</version> <version>3.0.0</version>
</plugin> </plugin>
</plugins> </plugins>
</pluginManagement> </pluginManagement>

View File

@@ -18,6 +18,7 @@ package io.nosqlbench.api.engine.activityimpl;
import io.nosqlbench.api.config.NBNamedElement; import io.nosqlbench.api.config.NBNamedElement;
import io.nosqlbench.api.engine.util.Unit; import io.nosqlbench.api.engine.util.Unit;
import io.nosqlbench.api.errors.BasicError;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -213,4 +214,22 @@ public class ActivityDef implements NBNamedElement {
public String getName() { public String getName() {
return getAlias(); return getAlias();
} }
public ActivityDef deprecate(String deprecatedName, String newName) {
Object deprecatedParam = this.parameterMap.get(deprecatedName);
if (deprecatedParam==null) {
return this;
}
if (deprecatedParam instanceof CharSequence chars) {
if (this.parameterMap.containsKey(newName)) {
throw new BasicError("You have specified activity param '" + deprecatedName + "' in addition to the valid name '" + newName +"'. Remove '" + deprecatedName + "'.");
} else {
logger.warn("Auto replacing deprecated activity param '" + deprecatedName + "="+ chars +"' with new '" + newName +"="+ chars +"'.");
parameterMap.put(newName,parameterMap.remove(deprecatedName));
}
} else {
throw new BasicError("Can't replace deprecated name with value of type " + deprecatedName.getClass().getCanonicalName());
}
return this;
}
} }

View File

@@ -33,9 +33,6 @@ import java.nio.file.StandardOpenOption;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.function.Function; import java.util.function.Function;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@@ -65,10 +62,7 @@ public class BundledMarkdownZipExporter {
} }
} }
ExecutorService executorService = Executors.newSingleThreadExecutor(); Map<String, StringBuilder> builderMap= new VirtDataGenDocsApp(null).call();
Future<Map<String, StringBuilder>> future = executorService.submit(new VirtDataGenDocsApp(null));
Map<String, StringBuilder> builderMap = future.get();
executorService.shutdown();
String bindingsPrefix ="bindings/"; String bindingsPrefix ="bindings/";
for(Map.Entry<String, StringBuilder> entry : builderMap.entrySet()) for(Map.Entry<String, StringBuilder> entry : builderMap.entrySet())
{ {

View File

@@ -10,13 +10,16 @@ scenarios:
# a scale parameter or a custom MathContext, but not both. The scale parameter # a scale parameter or a custom MathContext, but not both. The scale parameter
# is not supported for String or Double input forms. # is not supported for String or Double input forms.
# As of Java 17, the roundingMode enums are UP DOWN CEILING FLOOR HALF_UP HALF_DOWN HALF_EVEN UNNECESSARY
# and the precision must be zero or greater
bindings: bindings:
# convert an example double with some fractional values, then convert it to BigDecimal # convert an example double with some fractional values, then convert it to BigDecimal
from_double: ToDouble(); Div(100.0d); ToBigDecimal(); from_double: ToDouble(); Div(100.0d); ToBigDecimal();
# convert doubles to BigDecimal, with custom precision and rounding # convert doubles to BigDecimal, with custom precision and rounding
from_double_custom5: ToDouble(); Div(100.0d); ToBigDecimal('precision=5 roundingMode=HALF'); from_double_custom5: ToDouble(); Div(100.0d); ToBigDecimal('precision=5 roundingMode=HALF_EVEN');
# convert directly to BigDecimal from long as whole numbers # convert directly to BigDecimal from long as whole numbers
from_long: ToBigDecimal(); from_long: ToBigDecimal();

View File

@@ -21,9 +21,6 @@ bindings:
# control the size of the extracted sample with a hash range # control the size of the extracted sample with a hash range
hashed_bb_sizerange: ByteBufferSizedHashed(HashRange(1,10)); ToHexString(); hashed_bb_sizerange: ByteBufferSizedHashed(HashRange(1,10)); ToHexString();
# control the size of the extracted sample based on a continuous function
hashed_bb_size_normal: ByteBufferSizedHashed(Normal(5.0, 1.0)); ToHexString();
# control the size of the extracted sample based on a discrete function # control the size of the extracted sample based on a discrete function
hashed_bb_size_binomial: ByteBufferSizedHashed(Binomial(8,0.5)); ToHexString(); hashed_bb_size_binomial: ByteBufferSizedHashed(Binomial(8,0.5)); ToHexString();

View File

@@ -5,12 +5,12 @@ description: |
scenarios: scenarios:
default: run driver===stdout format=readout default: run driver===stdout format=readout
names: run driver===stdout format=readout bindings=names names: run driver===stdout format=readout bindings='names.*'
cities: run driver===stdout format=readout bindings=cities cities: run driver===stdout format=readout bindings='cities.*'
states: run driver===stdout format=readout bindings=states states: run driver===stdout format=readout bindings='states.*'
zips: run driver===stdout format=readout bindings=zips zips: run driver===stdout format=readout bindings='zips.*'
counties: run driver===stdout format=readout bindings=counties counties: run driver===stdout format=readout bindings='counties.*'
countries: run driver===stdout format=readout bindings=country countries: run driver===stdout format=readout bindings='country.*'
# Each binding is named, so the bindings is a map of names to # Each binding is named, so the bindings is a map of names to

View File

@@ -21,10 +21,10 @@ bindings:
# The TypeOf() function tells you the java class of its input # The TypeOf() function tells you the java class of its input
typeof: TypeOf(); typeof: ToJavaInstant(); TypeOf();
# The Show() function provides a snapshot of what is in the thread-local # The Show() function provides a snapshot of what is in the thread-local
# variable map as a String # variable map as a String
show: Show(); show: SaveLong('var42'); Show();

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022 nosqlbench * Copyright (c) 2022-2023 nosqlbench
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -39,7 +39,7 @@ public class MathContextReader {
} }
} catch (IllegalArgumentException iae) { } catch (IllegalArgumentException iae) {
throw new BasicError("'" + name + "' was not a valid format for a new MathContext(String), try something " + throw new BasicError("'" + name + "' was not a valid format for a new MathContext(String), try something " +
"like 'precision=17 roundingMode=UP"); "like 'precision=17 roundingMode=UP', original exception:" + iae);
} }
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022 nosqlbench * Copyright (c) 2022-2023 nosqlbench
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@ public class CountryNames extends CSVSampler implements LongFunction<String> {
@Example("CountryNames()") @Example("CountryNames()")
public CountryNames() { public CountryNames() {
super("COUNTRY_NAME","n/a","name","countries.csv"); super("COUNTRY_NAME","n/a","name","data/countries.csv");
} }
} }

View File

@@ -29,7 +29,6 @@ import io.nosqlbench.virtdata.userlibs.apps.docsapp.fdocs.FDocFuncs;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@@ -73,48 +72,6 @@ public class VirtDataGenDocsApp implements Callable<Map<String, StringBuilder>>
public Map<String, StringBuilder> call() { public Map<String, StringBuilder> call() {
/*LinkedList<String> largs = new LinkedList<>(Arrays.asList(args));
if (args.length > 0 && args[0].contains("help")) {
System.out.println(
"usage:\n" +
"[basefile <name>] [basedir <dir>] [categories combined|split] [format json|markdown] " +
"[blurbsdirs <dir>[:...]]\n\n"
);
return result;
}
while (largs.peekFirst() != null) {
String argtype = largs.removeFirst();
if (largs.peekFirst() == null) {
throw new RuntimeException(VirtDataGenDocsApp.class + " expects args in param value couplets.");
}
String argval = largs.removeFirst().toLowerCase();
switch (argtype) {
case "basefile":
this.baseFileName = argval;
break;
case "basedir":
this.basedir = argval;
break;
case BLURBS_DIRS:
this.blurbsDirs = argval;
break;
case CATEGORIES:
if (!argval.equals(CATEGORIES_SPLIT) && !argval.equals(CATEGORIES_COMBINED)) {
throw new RuntimeException("categories must either be " + CATEGORIES_SPLIT + ", or " + CATEGORIES_COMBINED + ".");
}
this.categories = argval;
break;
case FORMAT:
if (!argval.equals(FORMAT_MARKDOWN) && !argval.equals(FORMAT_JSON)) {
throw new RuntimeException("format must either be " + FORMAT_MARKDOWN + ", or " + FORMAT_JSON + ".");
}
this.format = argval;
break;
default:
}
}*/
Optional<FDoc> docsinfo = loadAllDocs(); Optional<FDoc> docsinfo = loadAllDocs();
if (!docsinfo.isPresent()) { if (!docsinfo.isPresent()) {
@@ -180,6 +137,7 @@ public class VirtDataGenDocsApp implements Callable<Map<String, StringBuilder>>
logger.debug("writing blurb to " + outputname); logger.debug("writing blurb to " + outputname);
builder.append(blurb); builder.append(blurb);
break;
} }
} }
} }