@@ -24,6 +24,9 @@ import { ApiResetSubscriptionFailedTasks } from "./api-reset-subscription-failed
24
24
import { RecoverCommitsFromDatePost } from "./commits-from-date/recover-commits-from-dates" ;
25
25
import { ResetFailedAndPendingDeploymentCursorPost } from "./commits-from-date/reset-failed-and-pending-deployment-cursors" ;
26
26
import { ApiRecryptPost } from "./api-recrypt-post" ;
27
+ import { GenerateOnceCoredumpGenerator } from "services/generate-once-coredump-generator" ;
28
+ import { GenerateOncePerNodeHeadumpGenerator } from "services/generate-once-per-node-headump-generator" ;
29
+
27
30
export const ApiRouter = Router ( ) ;
28
31
29
32
// TODO: remove this duplication because of the horrible way to do logs through requests
@@ -98,6 +101,59 @@ ApiRouter.post("/recrypt", ApiRecryptPost);
98
101
99
102
ApiRouter . post ( "/ping" , ApiPingPost ) ;
100
103
104
+ /**
105
+ * Workable parameters for ddev (250Mb heap):
106
+ *
107
+ * to occupy ~25% of mem and generate coredump:
108
+ * - ?arraySize=20000&nIter=400&pctThreshold=75
109
+ *
110
+ * to generate coredump straight away, without occupying any extra mem:
111
+ * - ?arraySize=1 &nIter=1&pcThreshold=100
112
+ *
113
+ * to generate heapdump:
114
+ * - ?arraySize=20000&nIter=400&pctThreshold=75&heap=true
115
+ *
116
+ * If you are generating heapdumps, you'll need to ssh to the instance and delete the lock file, because
117
+ * in production only one heapdump is allowed per node due to extremely high CPU/mem usage!
118
+ *
119
+ */
120
+ const FillMemAndGenerateCoreDump = ( req : Request , res : Response ) => {
121
+ const nIter = parseInt ( req . query ?. nIter ?. toString ( ) || "0" ) ;
122
+ const arraySize = parseInt ( req . query ?. arraySize ?. toString ( ) || "10" ) ;
123
+ const pctThreshold = parseInt ( req . query ?. pctThreshold ?. toString ( ) || "50" ) ;
124
+ const heap = ! ! req . query ?. heap ;
125
+ req . log . info ( {
126
+ nIter, arraySize, pctThreshold, heap
127
+ } , "FillMemAndGenerateCoreDump triggered" ) ;
128
+
129
+ const generator : GenerateOncePerNodeHeadumpGenerator | GenerateOnceCoredumpGenerator =
130
+ heap ? new GenerateOncePerNodeHeadumpGenerator ( {
131
+ logger : req . log ,
132
+ lowHeapAvailPct : pctThreshold
133
+ } ) : new GenerateOnceCoredumpGenerator ( {
134
+ logger : req . log ,
135
+ lowHeapAvailPct : pctThreshold
136
+ } ) ;
137
+
138
+ let dumpGenerated = false ;
139
+ const allocate = ( iter : number ) => {
140
+ if ( generator . maybeGenerateDump ( ) ) {
141
+ dumpGenerated = true ;
142
+ return [ ] ;
143
+ }
144
+ const arr = new Array ( arraySize ) . fill ( `${ Math . random ( ) } This is a test string. ${ Math . random ( ) } ` ) ;
145
+
146
+ if ( iter + 1 < nIter ) {
147
+ const anotherOne = allocate ( iter + 1 ) ;
148
+ return arr . concat ( anotherOne ) ;
149
+ }
150
+ return arr ;
151
+ } ;
152
+ res . json ( { allocated : allocate ( 0 ) . length , dumpGenerated : dumpGenerated } ) ;
153
+ } ;
154
+
155
+ ApiRouter . post ( "/fill-mem-and-generate-coredump" , FillMemAndGenerateCoreDump ) ;
156
+
101
157
// TODO: remove once move to DELETE /:installationId/:jiraHost
102
158
ApiRouter . delete (
103
159
"/deleteInstallation/:installationId/:jiraHost/github-app-id/:gitHubAppId" ,
0 commit comments