From 13b47a11870fe9d112cdcb048e43099a29436fa4 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Thu, 11 Nov 2021 14:48:30 +1000 Subject: [PATCH 01/14] Use Prisma's Node-API query engine --- packages/keystone/src/lib/core/prisma-schema.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/keystone/src/lib/core/prisma-schema.ts b/packages/keystone/src/lib/core/prisma-schema.ts index da43a150b7d..377e6ba9457 100644 --- a/packages/keystone/src/lib/core/prisma-schema.ts +++ b/packages/keystone/src/lib/core/prisma-schema.ts @@ -211,7 +211,6 @@ datasource ${provider} { generator client { provider = "prisma-client-js" output = "node_modules/.prisma/client"${prismaFlags} - engineType = "binary" } \n`; for (const [listKey, { resolvedDbFields }] of Object.entries(lists)) { From 7454b8f995277bcea8dbcaa2fcf77f9162d3ceac Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Thu, 11 Nov 2021 14:59:42 +1000 Subject: [PATCH 02/14] Update schemas --- examples-staging/assets-cloud/schema.prisma | 5 ++--- examples-staging/assets-local/schema.prisma | 5 ++--- examples-staging/auth/schema.prisma | 5 ++--- examples-staging/basic/schema.prisma | 5 ++--- examples-staging/ecommerce/schema.prisma | 5 ++--- examples-staging/embedded-nextjs/schema.prisma | 5 ++--- examples-staging/graphql-api-endpoint/schema.prisma | 5 ++--- examples-staging/roles/schema.prisma | 5 ++--- examples-staging/sandbox/schema.prisma | 5 ++--- examples/blog/schema.prisma | 5 ++--- examples/custom-admin-ui-logo/schema.prisma | 5 ++--- examples/custom-admin-ui-navigation/schema.prisma | 5 ++--- examples/custom-admin-ui-pages/schema.prisma | 5 ++--- examples/custom-field-view/schema.prisma | 5 ++--- examples/custom-field/schema.prisma | 5 ++--- examples/default-values/schema.prisma | 5 ++--- examples/document-field/schema.prisma | 5 ++--- examples/extend-graphql-schema-graphql-ts/schema.prisma | 5 ++--- examples/extend-graphql-schema/schema.prisma | 5 ++--- examples/json/schema.prisma | 5 ++--- examples/rest-api/schema.prisma | 5 ++--- examples/task-manager/schema.prisma | 5 ++--- examples/testing/schema.prisma | 5 ++--- examples/virtual-field/schema.prisma | 5 ++--- examples/with-auth/schema.prisma | 5 ++--- tests/test-projects/basic/schema.prisma | 5 ++--- tests/test-projects/crud-notifications/schema.prisma | 5 ++--- tests/test-projects/live-reloading/schema.prisma | 5 ++--- 28 files changed, 56 insertions(+), 84 deletions(-) diff --git a/examples-staging/assets-cloud/schema.prisma b/examples-staging/assets-cloud/schema.prisma index fa2202dc8f8..cd3cc01a666 100644 --- a/examples-staging/assets-cloud/schema.prisma +++ b/examples-staging/assets-cloud/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { diff --git a/examples-staging/assets-local/schema.prisma b/examples-staging/assets-local/schema.prisma index 19520cff0a8..66f6bde0551 100644 --- a/examples-staging/assets-local/schema.prisma +++ b/examples-staging/assets-local/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { diff --git a/examples-staging/auth/schema.prisma b/examples-staging/auth/schema.prisma index 010f4b244b5..23955d3c60b 100644 --- a/examples-staging/auth/schema.prisma +++ b/examples-staging/auth/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model User { diff --git a/examples-staging/basic/schema.prisma b/examples-staging/basic/schema.prisma index 818f7049960..236f81c69c0 100644 --- a/examples-staging/basic/schema.prisma +++ b/examples-staging/basic/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model User { diff --git a/examples-staging/ecommerce/schema.prisma b/examples-staging/ecommerce/schema.prisma index 4ac377ec39d..81d8769bc77 100644 --- a/examples-staging/ecommerce/schema.prisma +++ b/examples-staging/ecommerce/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model User { diff --git a/examples-staging/embedded-nextjs/schema.prisma b/examples-staging/embedded-nextjs/schema.prisma index 7034342dccf..ac2a52e6717 100644 --- a/examples-staging/embedded-nextjs/schema.prisma +++ b/examples-staging/embedded-nextjs/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { diff --git a/examples-staging/graphql-api-endpoint/schema.prisma b/examples-staging/graphql-api-endpoint/schema.prisma index 93657eb7c2e..86431d10314 100644 --- a/examples-staging/graphql-api-endpoint/schema.prisma +++ b/examples-staging/graphql-api-endpoint/schema.prisma @@ -7,9 +7,8 @@ datasource postgresql { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model User { diff --git a/examples-staging/roles/schema.prisma b/examples-staging/roles/schema.prisma index c5d17a441dc..852a49c680d 100644 --- a/examples-staging/roles/schema.prisma +++ b/examples-staging/roles/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Todo { diff --git a/examples-staging/sandbox/schema.prisma b/examples-staging/sandbox/schema.prisma index 49d7bda66f2..2b41a40ec89 100644 --- a/examples-staging/sandbox/schema.prisma +++ b/examples-staging/sandbox/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Todo { diff --git a/examples/blog/schema.prisma b/examples/blog/schema.prisma index 169b647328a..d65fa0ffa13 100644 --- a/examples/blog/schema.prisma +++ b/examples/blog/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { diff --git a/examples/custom-admin-ui-logo/schema.prisma b/examples/custom-admin-ui-logo/schema.prisma index ca297ff42e9..3fb898c1727 100644 --- a/examples/custom-admin-ui-logo/schema.prisma +++ b/examples/custom-admin-ui-logo/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/examples/custom-admin-ui-navigation/schema.prisma b/examples/custom-admin-ui-navigation/schema.prisma index ca297ff42e9..3fb898c1727 100644 --- a/examples/custom-admin-ui-navigation/schema.prisma +++ b/examples/custom-admin-ui-navigation/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/examples/custom-admin-ui-pages/schema.prisma b/examples/custom-admin-ui-pages/schema.prisma index ca297ff42e9..3fb898c1727 100644 --- a/examples/custom-admin-ui-pages/schema.prisma +++ b/examples/custom-admin-ui-pages/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/examples/custom-field-view/schema.prisma b/examples/custom-field-view/schema.prisma index ef70a7838be..0dea81d85d6 100644 --- a/examples/custom-field-view/schema.prisma +++ b/examples/custom-field-view/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/examples/custom-field/schema.prisma b/examples/custom-field/schema.prisma index 3bbdf1d51fa..2750da2f582 100644 --- a/examples/custom-field/schema.prisma +++ b/examples/custom-field/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { diff --git a/examples/default-values/schema.prisma b/examples/default-values/schema.prisma index ca297ff42e9..3fb898c1727 100644 --- a/examples/default-values/schema.prisma +++ b/examples/default-values/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/examples/document-field/schema.prisma b/examples/document-field/schema.prisma index f4aeacaf829..bb85ff81824 100644 --- a/examples/document-field/schema.prisma +++ b/examples/document-field/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { diff --git a/examples/extend-graphql-schema-graphql-ts/schema.prisma b/examples/extend-graphql-schema-graphql-ts/schema.prisma index 169b647328a..d65fa0ffa13 100644 --- a/examples/extend-graphql-schema-graphql-ts/schema.prisma +++ b/examples/extend-graphql-schema-graphql-ts/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { diff --git a/examples/extend-graphql-schema/schema.prisma b/examples/extend-graphql-schema/schema.prisma index 169b647328a..d65fa0ffa13 100644 --- a/examples/extend-graphql-schema/schema.prisma +++ b/examples/extend-graphql-schema/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { diff --git a/examples/json/schema.prisma b/examples/json/schema.prisma index 2b6d8883d8f..4c4d0abf844 100644 --- a/examples/json/schema.prisma +++ b/examples/json/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Package { diff --git a/examples/rest-api/schema.prisma b/examples/rest-api/schema.prisma index ca297ff42e9..3fb898c1727 100644 --- a/examples/rest-api/schema.prisma +++ b/examples/rest-api/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/examples/task-manager/schema.prisma b/examples/task-manager/schema.prisma index ca297ff42e9..3fb898c1727 100644 --- a/examples/task-manager/schema.prisma +++ b/examples/task-manager/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/examples/testing/schema.prisma b/examples/testing/schema.prisma index 8350007c09d..cd559af5282 100644 --- a/examples/testing/schema.prisma +++ b/examples/testing/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/examples/virtual-field/schema.prisma b/examples/virtual-field/schema.prisma index 169b647328a..d65fa0ffa13 100644 --- a/examples/virtual-field/schema.prisma +++ b/examples/virtual-field/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { diff --git a/examples/with-auth/schema.prisma b/examples/with-auth/schema.prisma index 8350007c09d..cd559af5282 100644 --- a/examples/with-auth/schema.prisma +++ b/examples/with-auth/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/tests/test-projects/basic/schema.prisma b/tests/test-projects/basic/schema.prisma index b2347005241..ba6c3147961 100644 --- a/tests/test-projects/basic/schema.prisma +++ b/tests/test-projects/basic/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/tests/test-projects/crud-notifications/schema.prisma b/tests/test-projects/crud-notifications/schema.prisma index ca297ff42e9..3fb898c1727 100644 --- a/tests/test-projects/crud-notifications/schema.prisma +++ b/tests/test-projects/crud-notifications/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Task { diff --git a/tests/test-projects/live-reloading/schema.prisma b/tests/test-projects/live-reloading/schema.prisma index ac941ea861d..b898d5c098f 100644 --- a/tests/test-projects/live-reloading/schema.prisma +++ b/tests/test-projects/live-reloading/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Something { From e51135dcb1375a0261b7ab3a7c8588dca58c63b1 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Thu, 11 Nov 2021 15:14:28 +1000 Subject: [PATCH 03/14] Fix a thing --- .../src/scripts/tests/fixtures/basic-project/schema.prisma | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/keystone/src/scripts/tests/fixtures/basic-project/schema.prisma b/packages/keystone/src/scripts/tests/fixtures/basic-project/schema.prisma index 9ad06b6df6e..e1b52de6edb 100644 --- a/packages/keystone/src/scripts/tests/fixtures/basic-project/schema.prisma +++ b/packages/keystone/src/scripts/tests/fixtures/basic-project/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Todo { From cedb385292a566dc0c179ae91016729f580f3520 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Fri, 12 Nov 2021 11:12:26 +1000 Subject: [PATCH 04/14] Try a thing --- tests/admin-ui-tests/utils.ts | 6 +++++- tests/examples-smoke-tests/utils.ts | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/admin-ui-tests/utils.ts b/tests/admin-ui-tests/utils.ts index 20db5f21740..25a85315621 100644 --- a/tests/admin-ui-tests/utils.ts +++ b/tests/admin-ui-tests/utils.ts @@ -76,7 +76,11 @@ export const deleteAllData: (projectDir: string) => Promise = async (proje let prisma = new PrismaClient(); - await Promise.all(Object.values(prisma).map((x: any) => x?.deleteMany?.({}))); + await prisma.$transaction( + Object.values(prisma) + .filter((x: any) => x?.deleteMany) + .map((x: any) => x?.deleteMany?.({})) + ); await prisma.$disconnect(); } finally { diff --git a/tests/examples-smoke-tests/utils.ts b/tests/examples-smoke-tests/utils.ts index 48270ec6175..82970dc07e5 100644 --- a/tests/examples-smoke-tests/utils.ts +++ b/tests/examples-smoke-tests/utils.ts @@ -33,7 +33,11 @@ async function deleteAllData(projectDir: string) { let prisma = new PrismaClient(); - await Promise.all(Object.values(prisma).map((x: any) => x?.deleteMany?.({}))); + await prisma.$transaction( + Object.values(prisma) + .filter((x: any) => x?.deleteMany) + .map((x: any) => x?.deleteMany?.({})) + ); await prisma.$disconnect(); } finally { From 4a853c8ddd7a5e17e4c2b8445b12278ea837de86 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Fri, 12 Nov 2021 11:13:01 +1000 Subject: [PATCH 05/14] Try another thing --- packages/keystone/src/lib/core/graphql-errors.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/keystone/src/lib/core/graphql-errors.ts b/packages/keystone/src/lib/core/graphql-errors.ts index bcb521f9724..4ceb49b4a11 100644 --- a/packages/keystone/src/lib/core/graphql-errors.ts +++ b/packages/keystone/src/lib/core/graphql-errors.ts @@ -50,7 +50,10 @@ export const resolverError = (things: { error: Error; tag: string }[]) => { }; export const relationshipError = (things: { error: Error; tag: string }[]) => { - const s = things.map(t => ` - ${t.tag}: ${t.error.message}`).join('\n'); + const s = things + .map(t => ` - ${t.tag}: ${t.error.message}`) + .sort() + .join('\n'); return new ApolloError( `An error occured while resolving relationship fields.\n${s}`, 'KS_RELATIONSHIP_ERROR', From f701132782d002f03ace3ebae750027f2487189f Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Fri, 12 Nov 2021 11:17:13 +1000 Subject: [PATCH 06/14] Fix things --- .../extend-graphql-schema-nexus/schema.prisma | 7 +++---- tests/api-tests/db-map.test.ts | 10 ++++------ .../relationships/foreign-key.test.ts | 20 ++++++++----------- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/examples/extend-graphql-schema-nexus/schema.prisma b/examples/extend-graphql-schema-nexus/schema.prisma index 169b647328a..d9051f85d33 100644 --- a/examples/extend-graphql-schema-nexus/schema.prisma +++ b/examples/extend-graphql-schema-nexus/schema.prisma @@ -7,9 +7,8 @@ datasource sqlite { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model Post { @@ -29,4 +28,4 @@ model Author { name String @default("") email String @unique @default("") posts Post[] @relation("Post_author") -} \ No newline at end of file +} diff --git a/tests/api-tests/db-map.test.ts b/tests/api-tests/db-map.test.ts index b5d17c5a177..c6e0fd7973c 100644 --- a/tests/api-tests/db-map.test.ts +++ b/tests/api-tests/db-map.test.ts @@ -28,9 +28,8 @@ datasource ${dbProvider} { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model SomeList { @@ -102,9 +101,8 @@ datasource ${dbProvider} { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model SomeList { diff --git a/tests/api-tests/relationships/foreign-key.test.ts b/tests/api-tests/relationships/foreign-key.test.ts index cde4e41dccc..b2561962788 100644 --- a/tests/api-tests/relationships/foreign-key.test.ts +++ b/tests/api-tests/relationships/foreign-key.test.ts @@ -29,9 +29,8 @@ datasource ${dbProvider} { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model A { @@ -73,9 +72,8 @@ datasource ${dbProvider} { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model A { @@ -117,9 +115,8 @@ datasource ${dbProvider} { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model A { @@ -234,9 +231,8 @@ datasource ${dbProvider} { } generator client { - provider = "prisma-client-js" - output = "node_modules/.prisma/client" - engineType = "binary" + provider = "prisma-client-js" + output = "node_modules/.prisma/client" } model A { From 26fa6d97edbfc88bc8683449d6b57f4a0cbb013b Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Fri, 12 Nov 2021 11:40:53 +1000 Subject: [PATCH 07/14] Try a thing --- .../keystone/src/lib/core/graphql-errors.ts | 2 +- .../keystone/src/lib/core/graphql-schema.ts | 4 +- .../src/lib/core/mutations/create-update.ts | 57 +++++-------------- .../keystone/src/lib/core/mutations/delete.ts | 19 +++---- .../keystone/src/lib/core/mutations/index.ts | 10 ++-- packages/keystone/src/lib/core/utils.ts | 15 +++++ .../keystone/src/lib/createGraphQLSchema.ts | 2 +- packages/keystone/src/lib/createSystem.ts | 3 + 8 files changed, 49 insertions(+), 63 deletions(-) diff --git a/packages/keystone/src/lib/core/graphql-errors.ts b/packages/keystone/src/lib/core/graphql-errors.ts index 4ceb49b4a11..79c9c4f9600 100644 --- a/packages/keystone/src/lib/core/graphql-errors.ts +++ b/packages/keystone/src/lib/core/graphql-errors.ts @@ -8,7 +8,7 @@ export const accessDeniedError = (msg: string) => export const prismaError = (err: Error) => { if ((err as any).code === undefined) { - return new ApolloError(`Prisma error`, 'KS_PRISMA_ERROR', { + return new ApolloError(`Prisma error: ${err.message}`, 'KS_PRISMA_ERROR', { debug: { message: err.message, }, diff --git a/packages/keystone/src/lib/core/graphql-schema.ts b/packages/keystone/src/lib/core/graphql-schema.ts index 5beb1b7e1b5..f1c917bcbf0 100644 --- a/packages/keystone/src/lib/core/graphql-schema.ts +++ b/packages/keystone/src/lib/core/graphql-schema.ts @@ -1,5 +1,4 @@ import { GraphQLNamedType, GraphQLSchema } from 'graphql'; -import { DatabaseProvider } from '../../types'; import { graphql } from '../..'; import { InitialisedList } from './types-for-lists'; @@ -8,7 +7,6 @@ import { getQueriesForList } from './queries'; export function getGraphQLSchema( lists: Record, - provider: DatabaseProvider, extraFields: { mutation: Record>; query: Record>; @@ -30,7 +28,7 @@ export function getGraphQLSchema( fields: Object.assign( {}, ...Object.values(lists).map(list => { - const { mutations, updateManyInput } = getMutationsForList(list, provider); + const { mutations, updateManyInput } = getMutationsForList(list); updateManyByList[list.listKey] = updateManyInput; return mutations; }), diff --git a/packages/keystone/src/lib/core/mutations/create-update.ts b/packages/keystone/src/lib/core/mutations/create-update.ts index b62e7d291f6..33bfa7b1c25 100644 --- a/packages/keystone/src/lib/core/mutations/create-update.ts +++ b/packages/keystone/src/lib/core/mutations/create-update.ts @@ -1,5 +1,4 @@ -import pLimit, { Limit } from 'p-limit'; -import { KeystoneContext, DatabaseProvider, ItemRootValue } from '../../../types'; +import { KeystoneContext, ItemRootValue } from '../../../types'; import { ResolvedDBField } from '../resolve-relationships'; import { InitialisedList } from '../types-for-lists'; import { @@ -7,6 +6,7 @@ import { getDBFieldKeyForFieldOnMultiField, IdType, runWithPrisma, + getWriteLimit, } from '../utils'; import { InputFilter, resolveUniqueWhereInput, UniqueInputFilter } from '../where-inputs'; import { @@ -34,8 +34,7 @@ async function createSingle( { data: rawData }: { data: Record }, list: InitialisedList, context: KeystoneContext, - operationAccess: boolean, - writeLimit: Limit + operationAccess: boolean ) { // Operation level access control if (!operationAccess) { @@ -54,6 +53,8 @@ async function createSingle( undefined ); + const writeLimit = getWriteLimit(context.prisma); + const item = await writeLimit(() => runWithPrisma(context, list, model => model.create({ data })) ); @@ -69,18 +70,11 @@ export class NestedMutationState { } async create(data: Record, list: InitialisedList) { const context = this.#context; - const writeLimit = pLimit(1); // Check operation permission to pass into single operation const operationAccess = await getOperationAccess(list, context, 'create'); - const { item, afterOperation } = await createSingle( - { data }, - list, - context, - operationAccess, - writeLimit - ); + const { item, afterOperation } = await createSingle({ data }, list, context, operationAccess); this.#afterOperations.push(() => afterOperation(item)); return { id: item.id as IdType }; @@ -96,18 +90,10 @@ export async function createOne( list: InitialisedList, context: KeystoneContext ) { - const writeLimit = pLimit(1); - // Check operation permission to pass into single operation const operationAccess = await getOperationAccess(list, context, 'create'); - const { item, afterOperation } = await createSingle( - createInput, - list, - context, - operationAccess, - writeLimit - ); + const { item, afterOperation } = await createSingle(createInput, list, context, operationAccess); await afterOperation(item); @@ -117,22 +103,13 @@ export async function createOne( export async function createMany( createInputs: { data: Record[] }, list: InitialisedList, - context: KeystoneContext, - provider: DatabaseProvider + context: KeystoneContext ) { - const writeLimit = pLimit(provider === 'sqlite' ? 1 : Infinity); - // Check operation permission to pass into single operation const operationAccess = await getOperationAccess(list, context, 'create'); return createInputs.data.map(async data => { - const { item, afterOperation } = await createSingle( - { data }, - list, - context, - operationAccess, - writeLimit - ); + const { item, afterOperation } = await createSingle({ data }, list, context, operationAccess); await afterOperation(item); @@ -145,8 +122,7 @@ async function updateSingle( list: InitialisedList, context: KeystoneContext, accessFilters: boolean | InputFilter, - operationAccess: boolean, - writeLimit: Limit + operationAccess: boolean ) { // Operation level access control if (!operationAccess) { @@ -179,6 +155,8 @@ async function updateSingle( item ); + const writeLimit = getWriteLimit(context.prisma); + const updatedItem = await writeLimit(() => runWithPrisma(context, list, model => model.update({ where: { id: item.id }, data })) ); @@ -193,25 +171,20 @@ export async function updateOne( list: InitialisedList, context: KeystoneContext ) { - const writeLimit = pLimit(1); - // Check operation permission to pass into single operation const operationAccess = await getOperationAccess(list, context, 'update'); // Get list-level access control filters const accessFilters = await getAccessFilters(list, context, 'update'); - return updateSingle(updateInput, list, context, accessFilters, operationAccess, writeLimit); + return updateSingle(updateInput, list, context, accessFilters, operationAccess); } export async function updateMany( { data }: { data: { where: UniqueInputFilter; data: Record }[] }, list: InitialisedList, - context: KeystoneContext, - provider: DatabaseProvider + context: KeystoneContext ) { - const writeLimit = pLimit(provider === 'sqlite' ? 1 : Infinity); - // Check operation permission to pass into single operation const operationAccess = await getOperationAccess(list, context, 'update'); @@ -219,7 +192,7 @@ export async function updateMany( const accessFilters = await getAccessFilters(list, context, 'update'); return data.map(async updateInput => - updateSingle(updateInput, list, context, accessFilters, operationAccess, writeLimit) + updateSingle(updateInput, list, context, accessFilters, operationAccess) ); } diff --git a/packages/keystone/src/lib/core/mutations/delete.ts b/packages/keystone/src/lib/core/mutations/delete.ts index 16bfdf1a4c6..ea39ac64914 100644 --- a/packages/keystone/src/lib/core/mutations/delete.ts +++ b/packages/keystone/src/lib/core/mutations/delete.ts @@ -1,10 +1,9 @@ -import pLimit, { Limit } from 'p-limit'; -import { DatabaseProvider, KeystoneContext } from '../../../types'; +import { KeystoneContext } from '../../../types'; import { getOperationAccess, getAccessFilters } from '../access-control'; import { checkFilterOrderAccess } from '../filter-order-access'; import { accessDeniedError } from '../graphql-errors'; import { InitialisedList } from '../types-for-lists'; -import { runWithPrisma } from '../utils'; +import { getWriteLimit as getWriteLimit, runWithPrisma } from '../utils'; import { InputFilter, resolveUniqueWhereInput, UniqueInputFilter } from '../where-inputs'; import { getAccessControlledItemForDelete } from './access-control'; import { runSideEffectOnlyHook } from './hooks'; @@ -15,8 +14,7 @@ async function deleteSingle( list: InitialisedList, context: KeystoneContext, accessFilters: boolean | InputFilter, - operationAccess: boolean, - writeLimit: Limit + operationAccess: boolean ) { // Operation level access control if (!operationAccess) { @@ -50,6 +48,8 @@ async function deleteSingle( // Before operation await runSideEffectOnlyHook(list, 'beforeOperation', hookArgs); + const writeLimit = getWriteLimit(context); + const newItem = await writeLimit(() => runWithPrisma(context, list, model => model.delete({ where: { id: item.id } })) ); @@ -66,11 +66,8 @@ async function deleteSingle( export async function deleteMany( uniqueInputs: UniqueInputFilter[], list: InitialisedList, - context: KeystoneContext, - provider: DatabaseProvider + context: KeystoneContext ) { - const writeLimit = pLimit(provider === 'sqlite' ? 1 : Infinity); - // Check operation permission to pass into single operation const operationAccess = await getOperationAccess(list, context, 'delete'); @@ -78,7 +75,7 @@ export async function deleteMany( const accessFilters = await getAccessFilters(list, context, 'delete'); return uniqueInputs.map(async uniqueInput => - deleteSingle(uniqueInput, list, context, accessFilters, operationAccess, writeLimit) + deleteSingle(uniqueInput, list, context, accessFilters, operationAccess) ); } @@ -93,5 +90,5 @@ export async function deleteOne( // Check filter permission to pass into single operation const accessFilters = await getAccessFilters(list, context, 'delete'); - return deleteSingle(uniqueInput, list, context, accessFilters, operationAccess, pLimit(1)); + return deleteSingle(uniqueInput, list, context, accessFilters, operationAccess); } diff --git a/packages/keystone/src/lib/core/mutations/index.ts b/packages/keystone/src/lib/core/mutations/index.ts index 865697cd565..27ce88d6f62 100644 --- a/packages/keystone/src/lib/core/mutations/index.ts +++ b/packages/keystone/src/lib/core/mutations/index.ts @@ -1,4 +1,4 @@ -import { DatabaseProvider, getGqlNames } from '../../../types'; +import { getGqlNames } from '../../../types'; import { graphql } from '../../..'; import { InitialisedList } from '../types-for-lists'; import * as createAndUpdate from './create-update'; @@ -20,7 +20,7 @@ function promisesButSettledWhenAllSettledAndInOrder[] }) as T; } -export function getMutationsForList(list: InitialisedList, provider: DatabaseProvider) { +export function getMutationsForList(list: InitialisedList) { const names = getGqlNames(list); const createOne = graphql.field({ @@ -40,7 +40,7 @@ export function getMutationsForList(list: InitialisedList, provider: DatabasePro }, async resolve(_rootVal, args, context) { return promisesButSettledWhenAllSettledAndInOrder( - await createAndUpdate.createMany(args, list, context, provider) + await createAndUpdate.createMany(args, list, context) ); }, }); @@ -70,7 +70,7 @@ export function getMutationsForList(list: InitialisedList, provider: DatabasePro }, async resolve(_rootVal, args, context) { return promisesButSettledWhenAllSettledAndInOrder( - await createAndUpdate.updateMany(args, list, context, provider) + await createAndUpdate.updateMany(args, list, context) ); }, }); @@ -92,7 +92,7 @@ export function getMutationsForList(list: InitialisedList, provider: DatabasePro }, async resolve(rootVal, { where }, context) { return promisesButSettledWhenAllSettledAndInOrder( - await deletes.deleteMany(where, list, context, provider) + await deletes.deleteMany(where, list, context) ); }, }); diff --git a/packages/keystone/src/lib/core/utils.ts b/packages/keystone/src/lib/core/utils.ts index d14f714387b..6fe700b2ae1 100644 --- a/packages/keystone/src/lib/core/utils.ts +++ b/packages/keystone/src/lib/core/utils.ts @@ -1,3 +1,4 @@ +import { Limit } from 'p-limit'; import pluralize from 'pluralize'; import { ItemRootValue, KeystoneConfig, KeystoneContext } from '../../types'; import { humanize } from '../utils'; @@ -169,3 +170,17 @@ const labelToClass = (str: string) => str.replace(/\s+/g, ''); export function getDBFieldKeyForFieldOnMultiField(fieldKey: string, subField: string) { return `${fieldKey}_${subField}`; } + +const writeLimits = new WeakMap(); + +export const setWriteLimit = (prismaClient: object, limit: Limit) => { + writeLimits.set(prismaClient, limit); +}; + +export const getWriteLimit = (context: KeystoneContext) => { + const limit = writeLimits.get(context.prisma); + if (limit === undefined) { + throw new Error('unexpected write limit not set for prisma client'); + } + return limit; +}; diff --git a/packages/keystone/src/lib/createGraphQLSchema.ts b/packages/keystone/src/lib/createGraphQLSchema.ts index 1d19781a374..556ffb4156b 100644 --- a/packages/keystone/src/lib/createGraphQLSchema.ts +++ b/packages/keystone/src/lib/createGraphQLSchema.ts @@ -9,7 +9,7 @@ export function createGraphQLSchema( adminMeta: AdminMetaRootVal ) { // Start with the core keystone graphQL schema - let graphQLSchema = getGraphQLSchema(lists, config.db.provider, { + let graphQLSchema = getGraphQLSchema(lists, { mutation: config.session ? { endSession: graphql.field({ diff --git a/packages/keystone/src/lib/createSystem.ts b/packages/keystone/src/lib/createSystem.ts index 3ce63c28a73..ed984e05b3d 100644 --- a/packages/keystone/src/lib/createSystem.ts +++ b/packages/keystone/src/lib/createSystem.ts @@ -1,3 +1,4 @@ +import pLimit from 'p-limit'; import { FieldData, KeystoneConfig, DatabaseProvider, getGqlNames } from '../types'; import { createAdminMeta } from '../admin-ui/system/createAdminMeta'; @@ -5,6 +6,7 @@ import { createGraphQLSchema } from './createGraphQLSchema'; import { makeCreateContext } from './context/createContext'; import { initialiseLists } from './core/types-for-lists'; import { CloudAssetsAPI, getCloudAssetsAPI } from './cloud/assets'; +import { setWriteLimit } from './core/utils'; function getSudoGraphQLSchema(config: KeystoneConfig, provider: DatabaseProvider) { // This function creates a GraphQLSchema based on a modified version of the provided config. @@ -72,6 +74,7 @@ export function createSystem(config: KeystoneConfig, isLiveReload?: boolean) { log: config.db.enableLogging && ['query'], datasources: { [config.db.provider]: { url: config.db.url } }, }); + setWriteLimit(prismaClient, pLimit(config.db.provider === 'sqlite' ? 1 : Infinity)); prismaClient.$on('beforeExit', async () => { // Prisma is failing to properly clean up its child processes // https://github.com/keystonejs/keystone/issues/5477 From 041e83a7a0681429498d4f9e613df71f1b5603ff Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Fri, 12 Nov 2021 11:41:40 +1000 Subject: [PATCH 08/14] Fix a thing --- packages/keystone/src/lib/core/mutations/create-update.ts | 4 ++-- packages/keystone/src/lib/core/mutations/delete.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/keystone/src/lib/core/mutations/create-update.ts b/packages/keystone/src/lib/core/mutations/create-update.ts index 33bfa7b1c25..f144a9eb986 100644 --- a/packages/keystone/src/lib/core/mutations/create-update.ts +++ b/packages/keystone/src/lib/core/mutations/create-update.ts @@ -53,7 +53,7 @@ async function createSingle( undefined ); - const writeLimit = getWriteLimit(context.prisma); + const writeLimit = getWriteLimit(context); const item = await writeLimit(() => runWithPrisma(context, list, model => model.create({ data })) @@ -155,7 +155,7 @@ async function updateSingle( item ); - const writeLimit = getWriteLimit(context.prisma); + const writeLimit = getWriteLimit(context); const updatedItem = await writeLimit(() => runWithPrisma(context, list, model => model.update({ where: { id: item.id }, data })) diff --git a/packages/keystone/src/lib/core/mutations/delete.ts b/packages/keystone/src/lib/core/mutations/delete.ts index ea39ac64914..dd412f86ba2 100644 --- a/packages/keystone/src/lib/core/mutations/delete.ts +++ b/packages/keystone/src/lib/core/mutations/delete.ts @@ -3,7 +3,7 @@ import { getOperationAccess, getAccessFilters } from '../access-control'; import { checkFilterOrderAccess } from '../filter-order-access'; import { accessDeniedError } from '../graphql-errors'; import { InitialisedList } from '../types-for-lists'; -import { getWriteLimit as getWriteLimit, runWithPrisma } from '../utils'; +import { getWriteLimit, runWithPrisma } from '../utils'; import { InputFilter, resolveUniqueWhereInput, UniqueInputFilter } from '../where-inputs'; import { getAccessControlledItemForDelete } from './access-control'; import { runSideEffectOnlyHook } from './hooks'; From 9f84214949b600d18e9efe02538453228f2af879 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Fri, 12 Nov 2021 11:49:50 +1000 Subject: [PATCH 09/14] Fix things --- examples/extend-graphql-schema-nexus/schema.prisma | 2 +- packages/keystone/src/lib/core/graphql-errors.ts | 2 +- tests/api-tests/queries/limits.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/extend-graphql-schema-nexus/schema.prisma b/examples/extend-graphql-schema-nexus/schema.prisma index d9051f85d33..d65fa0ffa13 100644 --- a/examples/extend-graphql-schema-nexus/schema.prisma +++ b/examples/extend-graphql-schema-nexus/schema.prisma @@ -28,4 +28,4 @@ model Author { name String @default("") email String @unique @default("") posts Post[] @relation("Post_author") -} +} \ No newline at end of file diff --git a/packages/keystone/src/lib/core/graphql-errors.ts b/packages/keystone/src/lib/core/graphql-errors.ts index 79c9c4f9600..4ceb49b4a11 100644 --- a/packages/keystone/src/lib/core/graphql-errors.ts +++ b/packages/keystone/src/lib/core/graphql-errors.ts @@ -8,7 +8,7 @@ export const accessDeniedError = (msg: string) => export const prismaError = (err: Error) => { if ((err as any).code === undefined) { - return new ApolloError(`Prisma error: ${err.message}`, 'KS_PRISMA_ERROR', { + return new ApolloError(`Prisma error`, 'KS_PRISMA_ERROR', { debug: { message: err.message, }, diff --git a/tests/api-tests/queries/limits.test.ts b/tests/api-tests/queries/limits.test.ts index a7b5f14870f..fadf4224923 100644 --- a/tests/api-tests/queries/limits.test.ts +++ b/tests/api-tests/queries/limits.test.ts @@ -262,7 +262,7 @@ describe('maxResults Limit', () => { posts(where: { title: { equals: "Two authors" } }) { title author { - posts { + posts(orderBy: { title: asc }) { title } } From 99429f2c7293f550a24d1c928af1560da89627c4 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Fri, 12 Nov 2021 11:57:27 +1000 Subject: [PATCH 10/14] Fix a thing --- tests/api-tests/queries/limits.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/api-tests/queries/limits.test.ts b/tests/api-tests/queries/limits.test.ts index fadf4224923..425ed40c2a6 100644 --- a/tests/api-tests/queries/limits.test.ts +++ b/tests/api-tests/queries/limits.test.ts @@ -262,7 +262,7 @@ describe('maxResults Limit', () => { posts(where: { title: { equals: "Two authors" } }) { title author { - posts(orderBy: { title: asc }) { + posts { title } } @@ -271,7 +271,9 @@ describe('maxResults Limit', () => { `, })); - expectLimitsExceededError(errors, [{ path: ['posts', 0, 'author', 1, 'posts'] }]); + expectLimitsExceededError(errors, [ + { path: ['posts', 0, 'author', expect.any(Number), 'posts'] }, + ]); }) ); }); From b31658e2e48d0da71b693b7b94c2f7d05095d101 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Fri, 12 Nov 2021 12:49:12 +1000 Subject: [PATCH 11/14] Add parallel test --- tests/api-tests/parallel.test.ts | 67 ++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 tests/api-tests/parallel.test.ts diff --git a/tests/api-tests/parallel.test.ts b/tests/api-tests/parallel.test.ts new file mode 100644 index 00000000000..d8b6a6e9a5c --- /dev/null +++ b/tests/api-tests/parallel.test.ts @@ -0,0 +1,67 @@ +import { text } from '@keystone-next/keystone/fields'; +import { list } from '@keystone-next/keystone'; +import { setupTestRunner } from '@keystone-next/keystone/testing'; +import { apiTestConfig } from './utils'; + +const runner = setupTestRunner({ + config: apiTestConfig({ + lists: { + Post: list({ + fields: { + title: text(), + }, + }), + }, + }), +}); + +test( + 'creating a lot of items with createOne in parallel', + runner(async ({ context }) => { + const data = Array.from({ length: 100 }).map((_, i) => { + return { title: `Post ${i}` }; + }); + const posts = await Promise.all( + data.map(data => context.query.Post.createOne({ data, query: 'title' })) + ); + expect(posts).toEqual(data); + }) +); +test( + 'updating a lot of items with updateOne in parallel', + runner(async ({ context }) => { + const data = Array.from({ length: 100 }).map((_, i) => { + return { title: `Post ${i}` }; + }); + const initialPosts = await context.query.Post.createMany({ data, query: 'id' }); + const posts = await Promise.all( + initialPosts.map((where, i) => + context.query.Post.updateOne({ + where, + data: { title: `Post ${i} updated` }, + query: 'title', + }) + ) + ); + expect(posts).toEqual(initialPosts.map((_, i) => ({ title: `Post ${i} updated` }))); + }) +); + +test( + 'deleting a lot of items with deleteOne in parallel', + runner(async ({ context }) => { + const data = Array.from({ length: 100 }).map((_, i) => { + return { title: `Post ${i}` }; + }); + const initialPosts = await context.query.Post.createMany({ data, query: 'id' }); + const posts = await Promise.all( + initialPosts.map(where => + context.query.Post.deleteOne({ + where, + query: 'title', + }) + ) + ); + expect(posts).toEqual(data); + }) +); From e82ba005aac71f98c3142e0e8a777546ff130f43 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Fri, 12 Nov 2021 15:09:10 +1000 Subject: [PATCH 12/14] Changesets --- .changeset/short-berries-shout.md | 5 +++++ .changeset/ten-bags-arrive.md | 5 +++++ packages/keystone/src/lib/core/utils.ts | 6 ++++++ tests/api-tests/parallel.test.ts | 6 +++--- 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 .changeset/short-berries-shout.md create mode 100644 .changeset/ten-bags-arrive.md diff --git a/.changeset/short-berries-shout.md b/.changeset/short-berries-shout.md new file mode 100644 index 00000000000..c21365a8bc7 --- /dev/null +++ b/.changeset/short-berries-shout.md @@ -0,0 +1,5 @@ +--- +'@keystone-next/keystone': major +--- + +Keystone now uses Prisma's Node-API Query Engine instead of the Binary Query Engine. This should improve the performance of operations using Prisma. See https://www.prisma.io/docs/concepts/components/prisma-engines/query-engine for more details. \ No newline at end of file diff --git a/.changeset/ten-bags-arrive.md b/.changeset/ten-bags-arrive.md new file mode 100644 index 00000000000..6789dfdfeaa --- /dev/null +++ b/.changeset/ten-bags-arrive.md @@ -0,0 +1,5 @@ +--- +'@keystone-next/keystone': patch +--- + +Fixed doing multiple writes at the same time on SQLite causing an timeout immediately. diff --git a/packages/keystone/src/lib/core/utils.ts b/packages/keystone/src/lib/core/utils.ts index 6fe700b2ae1..084b2cffb67 100644 --- a/packages/keystone/src/lib/core/utils.ts +++ b/packages/keystone/src/lib/core/utils.ts @@ -171,12 +171,18 @@ export function getDBFieldKeyForFieldOnMultiField(fieldKey: string, subField: st return `${fieldKey}_${subField}`; } +// this whole thing exists because Prisma doesn't handle doing multiple writes on SQLite well +// https://github.com/prisma/prisma/issues/2955 +// note this is keyed by the prisma client instance, not the context +// because even across requests, we want to apply the limit on SQLite const writeLimits = new WeakMap(); export const setWriteLimit = (prismaClient: object, limit: Limit) => { writeLimits.set(prismaClient, limit); }; +// this accepts the context instead of the prisma client because the prisma client on context is `any` +// so by accepting the context, it'll be less likely the wrong thing will be passed. export const getWriteLimit = (context: KeystoneContext) => { const limit = writeLimits.get(context.prisma); if (limit === undefined) { diff --git a/tests/api-tests/parallel.test.ts b/tests/api-tests/parallel.test.ts index d8b6a6e9a5c..106182d59d1 100644 --- a/tests/api-tests/parallel.test.ts +++ b/tests/api-tests/parallel.test.ts @@ -18,7 +18,7 @@ const runner = setupTestRunner({ test( 'creating a lot of items with createOne in parallel', runner(async ({ context }) => { - const data = Array.from({ length: 100 }).map((_, i) => { + const data = Array.from({ length: 500 }).map((_, i) => { return { title: `Post ${i}` }; }); const posts = await Promise.all( @@ -30,7 +30,7 @@ test( test( 'updating a lot of items with updateOne in parallel', runner(async ({ context }) => { - const data = Array.from({ length: 100 }).map((_, i) => { + const data = Array.from({ length: 500 }).map((_, i) => { return { title: `Post ${i}` }; }); const initialPosts = await context.query.Post.createMany({ data, query: 'id' }); @@ -50,7 +50,7 @@ test( test( 'deleting a lot of items with deleteOne in parallel', runner(async ({ context }) => { - const data = Array.from({ length: 100 }).map((_, i) => { + const data = Array.from({ length: 500 }).map((_, i) => { return { title: `Post ${i}` }; }); const initialPosts = await context.query.Post.createMany({ data, query: 'id' }); From 7a7ad6a2d0a859c9517ac069d7ec14bfd8663680 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Mon, 15 Nov 2021 09:11:55 +1000 Subject: [PATCH 13/14] Try a thing to make CI fail --- packages/keystone/src/lib/createSystem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/keystone/src/lib/createSystem.ts b/packages/keystone/src/lib/createSystem.ts index ed984e05b3d..0d10cb494f8 100644 --- a/packages/keystone/src/lib/createSystem.ts +++ b/packages/keystone/src/lib/createSystem.ts @@ -74,7 +74,7 @@ export function createSystem(config: KeystoneConfig, isLiveReload?: boolean) { log: config.db.enableLogging && ['query'], datasources: { [config.db.provider]: { url: config.db.url } }, }); - setWriteLimit(prismaClient, pLimit(config.db.provider === 'sqlite' ? 1 : Infinity)); + setWriteLimit(prismaClient, pLimit(config.db.provider === 'sqlite' ? Infinity : Infinity)); prismaClient.$on('beforeExit', async () => { // Prisma is failing to properly clean up its child processes // https://github.com/keystonejs/keystone/issues/5477 From ae05af548aa1634c581b5ea34262978f3c289107 Mon Sep 17 00:00:00 2001 From: mitchellhamilton Date: Mon, 15 Nov 2021 09:13:59 +1000 Subject: [PATCH 14/14] Revert "Try a thing to make CI fail" This reverts commit 7a7ad6a2d0a859c9517ac069d7ec14bfd8663680. --- packages/keystone/src/lib/createSystem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/keystone/src/lib/createSystem.ts b/packages/keystone/src/lib/createSystem.ts index 0d10cb494f8..ed984e05b3d 100644 --- a/packages/keystone/src/lib/createSystem.ts +++ b/packages/keystone/src/lib/createSystem.ts @@ -74,7 +74,7 @@ export function createSystem(config: KeystoneConfig, isLiveReload?: boolean) { log: config.db.enableLogging && ['query'], datasources: { [config.db.provider]: { url: config.db.url } }, }); - setWriteLimit(prismaClient, pLimit(config.db.provider === 'sqlite' ? Infinity : Infinity)); + setWriteLimit(prismaClient, pLimit(config.db.provider === 'sqlite' ? 1 : Infinity)); prismaClient.$on('beforeExit', async () => { // Prisma is failing to properly clean up its child processes // https://github.com/keystonejs/keystone/issues/5477