diff --git a/router-tests/bench/engine-modes/README.md b/router-tests/bench/engine-modes/README.md new file mode 100644 index 0000000000..124cdc4aea --- /dev/null +++ b/router-tests/bench/engine-modes/README.md @@ -0,0 +1,95 @@ +# Engine-modes benchmark suite + +Measures the router's three engine execution modes against each other from ONE +binary, selected by env flags: + +| label | `ENGINE_ENABLE_DATAFLOW` | `ENGINE_ENABLE_SCHEDULE_TREE` | +|---|---|---| +| cosmo-baseline | false | false | +| cosmo-dataflow | true | false | +| cosmo-scheduler | false | true | + +The suite is self-contained and cosmo-only. +It exists to prove two properties on every change to the engine execution path: + +1. The flags cost NOTHING when latency is uniform (regression gate). +2. Under skewed subgraph latency the dataflow executor and the schedule-tree + scheduler collapse the median to the dependency-graph critical path + (capability gate; reference: −37% vs baseline on the workload below). + +## Provisioning + +1. Router image (from this repo): + +```bash +cd router && CGO_ENABLED=0 GOOS=linux GOARCH=$(go env GOARCH) go build -ldflags '-s -w' -o /tmp/bench-router/cosmo ./cmd/router +printf 'FROM alpine:3.20\nRUN apk add --no-cache ca-certificates\nWORKDIR /app\nCOPY cosmo /app/cosmo\nENTRYPOINT ["/app/cosmo"]\n' > /tmp/bench-router/Dockerfile +docker build -t bench-cosmo:local /tmp/bench-router +``` + +2. Subgraphs image: any implementation of the standard federation example + subgraphs (accounts/products/reviews/inventory on one port, 4200), built as + `bench-subgraphs:latest`. The reference dataset used for the acceptance + numbers is the one from the graphql-hive/gateways-benchmark repository + (workload source only — this suite benchmarks no other gateways). + The canonical federated query (`QUERY_FILE`) is the benchmark's `MyQuery`; + against this dataset the full response is exactly 87,599 bytes + (`EXPECTED_BYTES`). + +3. lat-proxy (skew scenario only): + +```bash +docker build -t lat-proxy:local lat-proxy/ +``` + +4. Router config dirs (execution config + minimal yaml), one per topology: + `COSMO_CFG_DIR` for the uniform scenario routes subgraphs to + `http://bench-sg:4200/`, the skew variant to + `http://lat-proxy:8080/`. + +## Run + +```bash +export QUERY_FILE=/path/to/query.json EXPECTED_BYTES=87599 +export COSMO_CFG_DIR=/path/to/cfg ROUTER_IMAGE=bench-cosmo:local + +# Gate first — abort on any divergence: +bash byteid.sh + +# Then the matrices (macOS: under caffeinate -dimsu): +RES=/tmp/results/uniform.jsonl bash uniform_matrix.sh +COSMO_CFG_DIR=/path/to/cfg-proxy RES=/tmp/results/skew.jsonl bash skew_matrix.sh +``` + +Each run appends one JSON line: rps, success, min/med/p90/p95/p99.9, cpu +avg/max, mem max, valid_bytes, label, flags. Aggregate as median-of-3 per +(scenario, label) cell; a cell whose rep RPS spread exceeds 1.1x is re-run. + +## Acceptance thresholds + +Reference machine: Apple M4 Max, OrbStack, gateway pinned to 4 CPUs / 2 GB. + +- Byte identity: `BYTEID GATE: PASS` — one sha256 across all 4 modes + (baseline/dataflow/scheduler/both), 50 requests each, exact `EXPECTED_BYTES`. +- Skew (`accounts=20,products=20,reviews=20,inventory=150`; critical path + 210 ms): dataflow AND scheduler median ≤ 225 ms at 1 VU and 64 VU, RPS ≥ 265 + at 64 VU (reference floors: 218–219 ms / 274–275 RPS); baseline median in the + 340–360 ms band (the barrier anchor). Both new modes ≈ −37% vs baseline. +- Uniform ({0,10,50,100} ms, 64 VU): all three modes within 3% of each other on + median latency AND RPS at every delay; at 0 ms ≥ 19k RPS under conditions + that reproduce the reference anchors (absolute RPS is machine-sensitive — + when anchors don't reproduce, only the within-3% relative gate applies). +- `cosmo-both-SMOKE` rows ≈ the scheduler row (safe-degradation proof). + +## Methodology notes (encoded in the scripts) + +- netem on the SUBGRAPH container's egress with `limit 100000`, qdisc verified + present after adding; gateway CPU-pinned via `--cpuset-cpus` with + `GOMAXPROCS`/`GOMEMLIMIT`; subgraphs unpinned; k6 on the same docker network + (no host NAT); closed-loop constant VUs. +- A run starts only after a real federated response of the expected size is + observed; `valid_bytes` is recorded per row. +- k6 `setup()` warmup is capped at 8 requests (`vus*2` sequential warmup + poisons `http_reqs.rate` windowing at high latency). +- Tail latencies ≥ 10x the injected delay are the macOS host-sleep signature — + invalidate the rep. diff --git a/router-tests/bench/engine-modes/byteid.sh b/router-tests/bench/engine-modes/byteid.sh new file mode 100755 index 0000000000..a10f7099d8 --- /dev/null +++ b/router-tests/bench/engine-modes/byteid.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash +# Byte-identity gate: the SAME federated query must return the SAME bytes from +# ONE router image across all engine-flag modes, 25 sequential + 25 concurrent +# requests each. Aborts the benchmark protocol on any divergence. +# +# Modes: baseline(off,off) dataflow(on,off) scheduler(off,on) both(on,on). +# "both" asserts safe degradation: schedule-tree plans are nested, the dataflow +# executor structurally rejects nested plans and falls back — same bytes. +# +# Plumb-through preflight per mode (LOG_LEVEL=info): when dataflow is on the +# logs must contain "dataflow executor enabled"; when the scheduler is on, +# "schedule-tree planner enabled" — proving env -> config -> engine wiring. +# +# Success-path only by design: multi-error ordering determinism is covered +# in-engine by TestDataflowErrorOrderDeterminism. +set -uo pipefail +ROUTER_IMAGE="${ROUTER_IMAGE:-bench-cosmo:local}" +SUBGRAPHS_IMAGE="${SUBGRAPHS_IMAGE:-bench-subgraphs:latest}" +COSMO_CFG_DIR="${COSMO_CFG_DIR:?set COSMO_CFG_DIR (subgraph URLs -> http://bench-sg:4200)}" +QUERY_FILE="${QUERY_FILE:?set QUERY_FILE}" +EXPECTED_BYTES="${EXPECTED_BYTES:-87599}" +NET=bench-net; SG=bench-sg; GWC=bench-gw +WORK="${WORK:-$(mktemp -d)}" + +cleanup(){ docker rm -f "$GWC" "$SG" >/dev/null 2>&1; } +cleanup +docker network rm "$NET" >/dev/null 2>&1; sleep 1; docker network create "$NET" >/dev/null 2>&1 + +docker run -d --name "$SG" --network "$NET" "$SUBGRAPHS_IMAGE" >/dev/null 2>&1 +for i in $(seq 1 60); do + docker run --rm --network "$NET" curlimages/curl:latest -fsS --max-time 1 -X POST http://$SG:4200/products -H 'content-type: application/json' -d '{"query":"{topProducts{upc}}"}' >/dev/null 2>&1 && break + sleep 0.5 +done + +BASE_HASH="" +FAIL=0 + +run_mode(){ + local mode="$1" dataflow="$2" schedule="$3" + docker rm -f "$GWC" >/dev/null 2>&1 + docker run -d --name "$GWC" --network "$NET" \ + -e LISTEN_ADDR=0.0.0.0:4000 -e LOG_LEVEL=info \ + -e TRACING_ENABLED=false -e METRICS_ENABLED=false -e METRICS_OTLP_ENABLED=false \ + -e GRAPHQL_METRICS_ENABLED=false -e PROMETHEUS_ENABLED=false -e ACCESS_LOGS_ENABLED=false \ + -e ENGINE_ENABLE_DATAFLOW="$dataflow" -e ENGINE_ENABLE_SCHEDULE_TREE="$schedule" \ + -e ROUTER_CONFIG_PATH=/etc/cosmo/config.json -e CONFIG_PATH=/etc/cosmo/config.yaml \ + -v "$COSMO_CFG_DIR:/etc/cosmo:ro" "$ROUTER_IMAGE" >/dev/null 2>&1 + + local EP="http://$GWC:4000/graphql" up=0 + for i in $(seq 1 120); do + docker run --rm --network "$NET" curlimages/curl:latest -fsS --max-time 3 -X POST "$EP" -H 'content-type: application/json' -d '{"query":"{__typename}"}' >/dev/null 2>&1 && { up=1; break; } + sleep 0.5 + done + [ "$up" = 1 ] || { echo "BYTEID FAIL [$mode]: router did not come up"; docker logs "$GWC" 2>&1 | tail -5; FAIL=1; return; } + + local logs; logs=$(docker logs "$GWC" 2>&1) + if [ "$dataflow" = "true" ] && ! echo "$logs" | grep -q "dataflow executor enabled"; then + echo "BYTEID FAIL [$mode]: ENGINE_ENABLE_DATAFLOW not plumbed through"; FAIL=1; return + fi + if [ "$schedule" = "true" ] && ! echo "$logs" | grep -q "schedule-tree planner enabled"; then + echo "BYTEID FAIL [$mode]: ENGINE_ENABLE_SCHEDULE_TREE not plumbed through"; FAIL=1; return + fi + + local outdir="$WORK/byteid_$mode" + rm -rf "$outdir"; mkdir -p "$outdir" + for i in $(seq 1 25); do + docker run --rm --network "$NET" -v "$QUERY_FILE:/q.json:ro" curlimages/curl:latest \ + -fsS --max-time 30 -X POST "$EP" -H 'content-type: application/json' --data-binary @/q.json \ + >"$outdir/seq_$i.json" 2>/dev/null + done + # 25 concurrent. Helper script: the redirect must live INSIDE the spawned + # shell, and BSD xargs rejects long inline -I{} commands. + cat > "$WORK/byteid_curl.sh" < $outdir/conc_\$1.json 2>/dev/null +HELPER + chmod +x "$WORK/byteid_curl.sh" + seq 1 25 | xargs -P 25 -n 1 "$WORK/byteid_curl.sh" + + local hashes bytes nfiles + hashes=$(shasum -a 256 "$outdir"/*.json | awk '{print $1}' | sort -u) + bytes=$(wc -c < "$outdir/seq_1.json" | tr -d ' ') + nfiles=$(ls "$outdir"/*.json | wc -l | tr -d ' ') + # The gate is 25 sequential + 25 concurrent; a partial concurrent batch + # (xargs failure, curl errors) must not pass silently. + if [ "$nfiles" != 50 ]; then + echo "BYTEID FAIL [$mode]: expected 50 response files, got $nfiles"; FAIL=1; return + fi + local nhashes; nhashes=$(echo "$hashes" | grep -c .) + if [ "$nhashes" != 1 ]; then + echo "BYTEID FAIL [$mode]: $nhashes distinct hashes within mode ($nfiles files)"; FAIL=1; return + fi + if [ "$bytes" != "$EXPECTED_BYTES" ]; then + echo "BYTEID FAIL [$mode]: byte length $bytes != $EXPECTED_BYTES"; FAIL=1; return + fi + if [ -z "$BASE_HASH" ]; then + BASE_HASH="$hashes" + elif [ "$hashes" != "$BASE_HASH" ]; then + echo "BYTEID FAIL [$mode]: hash differs from baseline"; FAIL=1; return + fi + echo "BYTEID OK [$mode]: $nfiles/$nfiles identical, sha256=${hashes:0:16}..., bytes=$bytes" +} + +run_mode baseline false false +run_mode dataflow true false +run_mode scheduler false true +run_mode both true true + +cleanup; docker network rm "$NET" >/dev/null 2>&1 +if [ "$FAIL" != 0 ]; then echo "BYTEID GATE: FAIL"; exit 1; fi +echo "BYTEID GATE: PASS (all 4 modes byte-identical, $EXPECTED_BYTES bytes)" diff --git a/router-tests/bench/engine-modes/k6.js b/router-tests/bench/engine-modes/k6.js new file mode 100644 index 0000000000..26a4f23782 --- /dev/null +++ b/router-tests/bench/engine-modes/k6.js @@ -0,0 +1,2579 @@ +import http from "k6/http"; +import { check } from "k6"; +import { Rate } from "k6/metrics"; +import { textSummary } from "https://jslib.k6.io/k6-summary/0.0.1/index.js"; +import { randomString } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js'; + +const endpoint = __ENV.GATEWAY_ENDPOINT || "http://0.0.0.0:4000/graphql"; +const mode = __ENV.MODE || "constant"; +const isConstant = mode === "constant"; +const vus = __ENV.BENCH_VUS ? parseInt(__ENV.BENCH_VUS) : isConstant ? 50 : 500; +const duration = __ENV.BENCH_OVER_TIME || "60s"; + +const successRate = new Rate("success_rate"); + +const summaryTrendStats = [ + "avg", + "min", + "med", + "max", + "p(90)", + "p(95)", + "p(99.9)", +]; + +export const options = isConstant + ? { + duration, + vus, + summaryTrendStats, + } + : { + scenarios: { + stress: { + executor: "ramping-vus", + startVUs: 0, + stages: [ + { duration: "5s", target: 50 }, + { duration: "40s", target: vus }, + { duration: "5s", target: 50 }, + ], + gracefulRampDown: "1s", + gracefulStop: "0s", + }, + }, + summaryTrendStats, + }; + +export function setup() { + for (let i = 0; i < 8; i++) { + sendGraphQLRequest(); + } +} + +export default function () { + makeGraphQLRequest(); +} + +export function handleSummary(data) { + return handleBenchmarkSummary(data, { vus, duration }); +} + +let printIdentifiersMap = {}; +let runIdentifiersMap = {}; + +function printOnce(identifier, ...args) { + if (printIdentifiersMap[identifier]) { + return; + } + + console.log(...args); + printIdentifiersMap[identifier] = true; +} + +function runOnce(identifier, cb) { + if (runIdentifiersMap[identifier]) { + return true; + } + + runIdentifiersMap[identifier] = true; + return cb(); +} + +const generateRandomID = () => { + // generate a random 10 character string + //return randomString(10, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') + return "MyQuery" +} + +const graphqlRequest = (name) => ({ + payload: JSON.stringify({ + operationName: name, + query: `fragment User on User { + id + username + name + } + + fragment Review on Review { + id + body + } + + fragment Product on Product { + inStock + name + price + shippingEstimate + upc + weight + } + + query ${name} { + users { + ...User + reviews { + ...Review + product { + ...Product + reviews { + ...Review + author { + ...User + reviews { + ...Review + product { + ...Product + } + } + } + } + } + } + } + topProducts { + ...Product + reviews { + ...Review + author { + ...User + reviews { + ...Review + product { + ...Product + } + } + } + } + } + }`, + }), + params: { + headers: { + "Content-Type": "application/json", + }, + }, +}); + +function handleBenchmarkSummary(data, additionalContext = {}) { + const out = { + stdout: textSummary(data, { indent: " ", enableColors: true }), + }; + + if (__ENV.SUMMARY_PATH) { + out[`${__ENV.SUMMARY_PATH}/k6_summary.json`] = JSON.stringify( + Object.assign(data, additionalContext) + ); + out[`${__ENV.SUMMARY_PATH}/k6_summary.txt`] = textSummary(data, { + indent: " ", + enableColors: false, + }); + } + + return out; +} + +function sendGraphQLRequest() { + const gql = graphqlRequest(generateRandomID()); + const res = http.post( + endpoint, + gql.payload, + gql.params, + ); + + return res; +} + +function makeGraphQLRequest() { + const res = sendGraphQLRequest(); + const ok = check(res, { + "response code was 200": (res) => res.status == 200, + "no graphql errors": (resp) => { + let has_errors = !!resp.body && resp.body.includes(`"errors"`); + if (has_errors && __ENV.PRINT_ONCE) { + printOnce( + "graphql_errors", + `‼️ Got GraphQL errors, here's a sample:`, + res.json.errors + ); + } + + return !has_errors; + }, + "valid response structure": (resp) => { + return runOnce("valid response structure", () => { + const json = resp.json(); + + let isValid = checkResponseStructure(json); + + if (!isValid && __ENV.PRINT_ONCE) { + printOnce( + "response_strcuture", + `‼️ Got invalid structure, here's a sample:`, + res.body + ); + } + + return isValid; + }); + }, + }); + + successRate.add(ok); +} + +function checkResponseStructure(x) { + function checkRecursive(obj, structure) { + if (obj == null) { + return false; + } + for (var key in structure) { + if ( + !obj.hasOwnProperty(key) || + typeof obj[key] !== typeof structure[key] + ) { + return false; + } + if (typeof structure[key] === "object" && structure[key] !== null) { + if (!checkRecursive(obj[key], structure[key])) { + return false; + } + } + } + return true; + } + + const expectedStructure = { + data: { + users: [ + { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + { + id: "2", + username: "dotansimha", + name: "Dotan Simha", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + { + id: "3", + username: "kamilkisiela", + name: "Kamil Kisiela", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + { + id: "4", + username: "ardatan", + name: "Arda Tanrikulu", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + { + id: "5", + username: "gilgardosh", + name: "Gil Gardosh", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + { + id: "6", + username: "laurin", + name: "Laurin Quast", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + ], + topProducts: [ + { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "3", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "4", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + { + inStock: false, + name: "Couch", + price: 1299, + shippingEstimate: null, + upc: "2", + weight: 1000, + reviews: [ + { + id: "5", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "6", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "7", + body: "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "8", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + { + inStock: false, + name: "Glass", + price: 15, + shippingEstimate: null, + upc: "3", + weight: 20, + reviews: [ + { + id: "9", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + { + inStock: false, + name: "Chair", + price: 499, + shippingEstimate: null, + upc: "4", + weight: 100, + reviews: [ + { + id: "10", + body: "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + { + id: "11", + body: "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.", + author: { + id: "1", + username: "urigo", + name: "Uri Goldshtein", + reviews: [ + { + id: "1", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + { + id: "2", + body: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", + product: { + inStock: true, + name: "Table", + price: 899, + shippingEstimate: null, + upc: "1", + weight: 100, + }, + }, + ], + }, + }, + ], + }, + { + inStock: true, + name: "TV", + price: 1299, + shippingEstimate: null, + upc: "5", + weight: 1000, + reviews: [], + }, + ], + }, + }; + return checkRecursive(x, expectedStructure); +} diff --git a/router-tests/bench/engine-modes/lat-proxy/Dockerfile b/router-tests/bench/engine-modes/lat-proxy/Dockerfile new file mode 100644 index 0000000000..28fc255391 --- /dev/null +++ b/router-tests/bench/engine-modes/lat-proxy/Dockerfile @@ -0,0 +1,8 @@ +FROM golang:1.25-alpine AS build +WORKDIR /src +COPY main.go . +RUN go mod init lat-proxy && CGO_ENABLED=0 go build -ldflags '-s -w' -o /lat-proxy . + +FROM alpine:3.20 +COPY --from=build /lat-proxy /lat-proxy +ENTRYPOINT ["/lat-proxy"] diff --git a/router-tests/bench/engine-modes/lat-proxy/main.go b/router-tests/bench/engine-modes/lat-proxy/main.go new file mode 100644 index 0000000000..1ad4024ccf --- /dev/null +++ b/router-tests/bench/engine-modes/lat-proxy/main.go @@ -0,0 +1,73 @@ +// lat-proxy injects a per-subgraph artificial latency in front of a single +// upstream that serves all subgraphs on distinct path prefixes +// (/accounts /products /reviews /inventory). The delay is applied to the RESPONSE (after the upstream call +// returns), matching the semantics of netem egress delay on the subgraph +// container used by the uniform benchmark. +// +// Env: +// +// UPSTREAM upstream base URL, e.g. http://bench-sg:4200 +// DELAYS per-path-prefix delays, e.g. "accounts=20,products=20,reviews=20,inventory=150" +// LISTEN listen address (default :8080) +package main + +import ( + "log" + "net/http" + "net/http/httputil" + "net/url" + "os" + "strconv" + "strings" + "time" +) + +func main() { + upstream := os.Getenv("UPSTREAM") + if upstream == "" { + log.Fatal("UPSTREAM is required") + } + target, err := url.Parse(upstream) + if err != nil { + log.Fatalf("invalid UPSTREAM: %v", err) + } + + delays := map[string]time.Duration{} + for pair := range strings.SplitSeq(os.Getenv("DELAYS"), ",") { + name, ms, ok := strings.Cut(strings.TrimSpace(pair), "=") + if !ok || name == "" { + continue + } + n, err := strconv.Atoi(ms) + if err != nil { + log.Fatalf("invalid delay %q: %v", pair, err) + } + delays[name] = time.Duration(n) * time.Millisecond + } + + proxy := httputil.NewSingleHostReverseProxy(target) + // The benchmark fans out aggressively; default transports throttle at + // 2 idle conns per host, which fabricates failures under load. + proxy.Transport = &http.Transport{ + MaxIdleConns: 4096, + MaxIdleConnsPerHost: 4096, + IdleConnTimeout: 90 * time.Second, + } + proxy.ModifyResponse = func(resp *http.Response) error { + seg := strings.TrimPrefix(resp.Request.URL.Path, "/") + if i := strings.IndexByte(seg, '/'); i >= 0 { + seg = seg[:i] + } + if d, ok := delays[seg]; ok && d > 0 { + time.Sleep(d) + } + return nil + } + + listen := os.Getenv("LISTEN") + if listen == "" { + listen = ":8080" + } + log.Printf("lat-proxy listening on %s -> %s, delays=%v", listen, upstream, delays) + log.Fatal(http.ListenAndServe(listen, proxy)) +} diff --git a/router-tests/bench/engine-modes/skew_bench.sh b/router-tests/bench/engine-modes/skew_bench.sh new file mode 100755 index 0000000000..6472ba8b17 --- /dev/null +++ b/router-tests/bench/engine-modes/skew_bench.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# Skewed per-subgraph latency benchmark for ONE cosmo engine mode: the lat-proxy +# injects a DIFFERENT delay per subgraph path, then forwards to the subgraph +# container. This exposes the per-wave-barrier slack that uniform latency hides +# — the regime where the dataflow executor and the schedule-tree scheduler earn +# their keep. +# +# Usage: DELAYS="accounts=20,products=20,reviews=20,inventory=150" skew_bench.sh +# Env: ROUTER_IMAGE SUBGRAPHS_IMAGE LAT_PROXY_IMAGE COSMO_CFG_DIR (subgraph +# URLs -> http://lat-proxy:8080) QUERY_FILE EXPECTED_BYTES LABEL +# DATAFLOW SCHEDULE_TREE REP VUS DUR RES +set -uo pipefail +CPUS="$1"; MEMG="$2"; REP="${REP:-1}"; MEM="${MEMG}g" +VUS="${VUS:-1}"; DUR="${DUR:-20s}"; DELAYS="${DELAYS:-accounts=20,products=20,reviews=20,inventory=150}" +LABEL="${LABEL:-cosmo-baseline}" +ROUTER_IMAGE="${ROUTER_IMAGE:-bench-cosmo:local}" +SUBGRAPHS_IMAGE="${SUBGRAPHS_IMAGE:-bench-subgraphs:latest}" +LAT_PROXY_IMAGE="${LAT_PROXY_IMAGE:-lat-proxy:local}" +COSMO_CFG_DIR="${COSMO_CFG_DIR:?set COSMO_CFG_DIR to the dir with config.json + config.yaml (subgraph URLs -> http://lat-proxy:8080)}" +QUERY_FILE="${QUERY_FILE:?set QUERY_FILE to the federated query JSON body}" +EXPECTED_BYTES="${EXPECTED_BYTES:-87599}" +K6JS="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/k6.js" +RES="${RES:?set RES to the results jsonl path}" +GOMEM_MIB="$(( MEMG * 1024 * 80 / 100 ))MiB" +CPUSET="0-$((CPUS-1))"; [ "$CPUS" = "1" ] && CPUSET="0" +NET=bench-net; SG=bench-sg; PX=lat-proxy; GWC=bench-gw +mkdir -p "$(dirname "$RES")" +cleanup(){ pkill -9 -f "docker stats" >/dev/null 2>&1; docker rm -f "$GWC" "$SG" "$PX" bench-k6 >/dev/null 2>&1; } +cleanup +for i in $(seq 1 30); do docker ps -aq --filter "name=$GWC" --filter "name=$SG" --filter "name=$PX" | grep -q . || break; sleep 0.5; done +docker network rm "$NET" >/dev/null 2>&1; sleep 1; docker network create "$NET" >/dev/null 2>&1 + +docker run -d --name "$SG" --network "$NET" "$SUBGRAPHS_IMAGE" >/dev/null 2>&1 +for i in $(seq 1 60); do docker run --rm --network "$NET" curlimages/curl:latest -fsS --max-time 1 -X POST http://$SG:4200/products -H 'content-type: application/json' -d '{"query":"{topProducts{upc}}"}' >/dev/null 2>&1 && break; sleep 0.5; done +# latency proxy in front of the subgraphs +docker run -d --name "$PX" --network "$NET" -e UPSTREAM="http://$SG:4200" -e DELAYS="$DELAYS" "$LAT_PROXY_IMAGE" >/dev/null 2>&1 +for i in $(seq 1 30); do docker run --rm --network "$NET" curlimages/curl:latest -fsS --max-time 2 -X POST http://$PX:8080/products -H 'content-type: application/json' -d '{"query":"{topProducts{upc}}"}' >/dev/null 2>&1 && break; sleep 0.5; done + +docker run -d --name "$GWC" --network "$NET" --cpuset-cpus="$CPUSET" --memory="$MEM" \ + -e GOMAXPROCS="$CPUS" -e GOMEMLIMIT="$GOMEM_MIB" -e LISTEN_ADDR=0.0.0.0:4000 -e LOG_LEVEL=fatal \ + -e TRACING_ENABLED=false -e METRICS_ENABLED=false -e METRICS_OTLP_ENABLED=false \ + -e GRAPHQL_METRICS_ENABLED=false -e PROMETHEUS_ENABLED=false -e ACCESS_LOGS_ENABLED=false \ + -e ENGINE_ENABLE_DATAFLOW="${DATAFLOW:-false}" -e ENGINE_ENABLE_SCHEDULE_TREE="${SCHEDULE_TREE:-false}" \ + -e ROUTER_CONFIG_PATH=/etc/cosmo/config.json -e CONFIG_PATH=/etc/cosmo/config.yaml \ + -v "$COSMO_CFG_DIR:/etc/cosmo:ro" "$ROUTER_IMAGE" >/dev/null 2>&1 + +EP="http://$GWC:4000/graphql" +up=0 +for i in $(seq 1 120); do docker run --rm --network "$NET" curlimages/curl:latest -fsS --max-time 3 -X POST "$EP" -H 'content-type: application/json' -d '{"query":"{__typename}"}' >/dev/null 2>&1 && { up=1; break; }; docker ps --filter "name=$GWC" --filter status=running -q | grep -q . || { sleep 0.5; continue; }; sleep 0.5; done +if [ "$up" != 1 ]; then echo "{\"rep\":$REP,\"label\":\"$LABEL\",\"delays\":\"$DELAYS\",\"error\":\"no up\"}" | tee -a "$RES"; cleanup; exit 1; fi +ready=0 +for i in $(seq 1 30); do rb=$(docker run --rm --network "$NET" -v "$QUERY_FILE:/q.json:ro" curlimages/curl:latest -fsS --max-time 20 -X POST "$EP" -H 'content-type: application/json' --data-binary @/q.json 2>/dev/null | wc -c | tr -d ' '); [ "${rb:-0}" -ge $(( EXPECTED_BYTES * 99 / 100 )) ] && { ready=1; break; }; sleep 0.5; done +if [ "$ready" != 1 ]; then echo "{\"rep\":$REP,\"label\":\"$LABEL\",\"delays\":\"$DELAYS\",\"error\":\"not federating\"}" | tee -a "$RES"; cleanup; exit 1; fi +VB=$(docker run --rm --network "$NET" -v "$QUERY_FILE:/q.json:ro" curlimages/curl:latest -fsS --max-time 20 -X POST "$EP" -H 'content-type: application/json' --data-binary @/q.json 2>/dev/null | wc -c | tr -d ' ') + +STATF=$(mktemp); : > "$STATF" +docker stats --format '{{.CPUPerc}}|{{.MemUsage}}' "$GWC" >>"$STATF" 2>/dev/null & SAMP=$! + +K6OUT=$(mktemp -d); rm -f "$K6OUT/k6_summary.json" +docker run --rm --network "$NET" -v "$K6JS:/k6.js:ro" -v "$K6OUT:/out" \ + -e GATEWAY_ENDPOINT="$EP" -e MODE=constant -e BENCH_VUS="$VUS" -e BENCH_OVER_TIME="$DUR" -e SUMMARY_PATH=/out -e K6_SETUP_TIMEOUT=600s \ + grafana/k6:latest run /k6.js >/dev/null 2>&1 +kill -9 "$SAMP" >/dev/null 2>&1; wait "$SAMP" 2>/dev/null +J="$K6OUT/k6_summary.json" +RPS=$(jq -r '.metrics.http_reqs.values.rate|floor' "$J" 2>/dev/null); SUCC=$(jq -r '.metrics.success_rate.values.rate' "$J" 2>/dev/null) +MIN=$(jq -r '.metrics.http_req_duration.values.min' "$J" 2>/dev/null); MED=$(jq -r '.metrics.http_req_duration.values.med' "$J" 2>/dev/null) +P90=$(jq -r '.metrics.http_req_duration.values["p(90)"]' "$J" 2>/dev/null); P999=$(jq -r '.metrics.http_req_duration.values["p(99.9)"]' "$J" 2>/dev/null) +P95=$(jq -r '.metrics.http_req_duration.values["p(95)"]' "$J" 2>/dev/null) +read CPUAVG CPUMAX MEMMAX <<<"$(tr -d '\r' < "$STATF" | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' | awk -F'|' '{gsub(/%/,"",$1);c=$1+0;if(c>cm)cm=c;cs+=c;n++;split($2,a,"/");m=a[1];gsub(/[^0-9.A-Za-z]/,"",m);v=m+0;if(m~/GiB/)v*=1024;if(m~/KiB/)v/=1024;if(v>mm)mm=v} END{if(n)printf "%.0f %.0f %.0f",cs/n,cm,mm;else print "0 0 0"}')" +rm -rf "$STATF" "$K6OUT" +echo "{\"rep\":$REP,\"label\":\"$LABEL\",\"dataflow\":\"${DATAFLOW:-false}\",\"schedule_tree\":\"${SCHEDULE_TREE:-false}\",\"delays\":\"$DELAYS\",\"vus\":$VUS,\"rps\":${RPS:-0},\"success\":${SUCC:-0},\"min_ms\":${MIN:-0},\"med_ms\":${MED:-0},\"p90_ms\":${P90:-0},\"p95_ms\":${P95:-0},\"p999_ms\":${P999:-0},\"cpu_avg_pct\":${CPUAVG:-0},\"cpu_max_pct\":${CPUMAX:-0},\"mem_max_mib\":${MEMMAX:-0},\"valid_bytes\":${VB:-0}}" | tee -a "$RES" +cleanup diff --git a/router-tests/bench/engine-modes/skew_matrix.sh b/router-tests/bench/engine-modes/skew_matrix.sh new file mode 100755 index 0000000000..9570bb53ba --- /dev/null +++ b/router-tests/bench/engine-modes/skew_matrix.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Skew matrix: 3 cosmo engine modes x {1 VU, 64 VU} x 3 reps with one slow +# subgraph (inventory=150ms vs 20ms) — the regime where the executors differ. +# Modes interleaved per cell; plus 2 cosmo-both-SMOKE footnote rows asserting +# the safe degradation of running BOTH flags (nested schedule-tree plans make +# the dataflow executor fall back; expect ~cosmo-scheduler numbers). +set -uo pipefail +D="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +RES="${RES:?set RES to the results jsonl path}" +: > "$RES" +CPUS="${CPUS:-4}"; MEMG="${MEMG:-2}" +DELAYS="${DELAYS:-accounts=20,products=20,reviews=20,inventory=150}" +# run