Megatest

Diff
Login

Differences From Artifact [bb562bf1d7]:

To Artifact [ddafffe733]:


223
224
225
226
227
228
229
230

231


232

233
234
235

236
237
238
239

240

241


242
243
244




245
246
247
248
249
250
251
252
253
254
255
256
257

258




259

260
261
262
263


264
265
266
267
268
269
270
223
224
225
226
227
228
229

230
231
232
233

234
235


236
237
238


239
240
241

242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262

263
264
265
266
267
268

269




270
271
272
273
274
275
276
277
278







-
+

+
+
-
+

-
-
+


-
-
+

+
-
+
+



+
+
+
+












-
+

+
+
+
+
-
+
-
-
-
-
+
+







			 (if (null? tal)
			     (if (> tot 10)
				 (cons newmax-cmd currmax)
				 (cons 'none 0))
			     (loop (car tal)(cdr tal) newmax-cmd currmax)))))))
    (mutex-unlock! *db-stats-mutex*)
    res))
	  

(define (rmt:open-qry-close-locally cmd run-id params #!key (remretries 5))
  (let* ((qry-is-write   (not (member cmd api:read-only-queries)))
	 (dbdir          (db:dbfile-path #f))
  (let* ((dbstruct-local (if *dbstruct-db*
	 (dbstruct-local (if *dbstruct-db*
			     *dbstruct-db*
			     (let* ((dbdir (db:dbfile-path #f)) ;;  (conc    (configf:lookup *configdat* "setup" "linktree") "/.db"))
				    (db (make-dbr:dbstruct path:  dbdir local: #t)))
			     (let* ((db (make-dbr:dbstruct path:  dbdir local: #t)))
			       (set! *dbstruct-db* db)
			       db)))
	 (db-file-path   (db:dbfile-path 0))
	 ;; (read-only      (not (file-read-access? db-file-path)))
	 (read-only      (not (file-write-access? dbdir)))
	 (start          (current-milliseconds))
	 (resdat         (if (not (and read-only qry-is-write))
	 (resdat         (api:execute-requests dbstruct-local (vector (symbol->string cmd) params)))
			     (api:execute-requests dbstruct-local (vector (symbol->string cmd) params))
			     (vector #t '())))
	 (success        (vector-ref resdat 0))
	 (res            (vector-ref resdat 1))
	 (duration       (- (current-milliseconds) start)))
    (if (and read-only qry-is-write)
	(begin
	  (debug:print 0 *default-log-port* "ERROR: attempt to write to read-only database ignored. cmd=" cmd)
	  ))
    (if (not success)
	(if (> remretries 0)
	    (begin
	      (debug:print-error 0 *default-log-port* "local query failed. Trying again.")
	      (thread-sleep! (/ (random 5000) 1000)) ;; some random delay 
	      (rmt:open-qry-close-locally cmd run-id params remretries: (- remretries 1)))
	    (begin
	      (debug:print-error 0 *default-log-port* "too many retries in rmt:open-qry-close-locally, giving up")
	      #f))
	(begin
	  ;; (rmt:update-db-stats run-id cmd params duration)
	  ;; mark this run as dirty if this was a write
	  (if (not (member cmd api:read-only-queries))
	  (if qry-is-write
	      (let ((start-time (current-seconds)))
		(if (not (or (common:legacy-sync-required)
			     (common:legacy-sync-recommended))) ;; no sync being done
		    (common:sync-to-megatest.db 'timestamps)  ;; forced full sync based on timestamps
		    (begin
		(mutex-lock! *db-multi-sync-mutex*)
		      (mutex-lock! *db-multi-sync-mutex*)
		;; (if (not (hash-table-ref/default *db-local-sync* run-id #f))
		;; just set it every time. Is a write more expensive than a read and does it matter?
		(hash-table-set! *db-local-sync* (or run-id 0) start-time) ;; the oldest "write"
		(mutex-unlock! *db-multi-sync-mutex*)))
		      (hash-table-set! *db-local-sync* (or run-id 0) start-time) ;; the oldest "write"
		      (mutex-unlock! *db-multi-sync-mutex*)))))
	  res))))

(define (rmt:send-receive-no-auto-client-setup connection-info cmd run-id params)
  (let* ((run-id   (if run-id run-id 0))
	 ;; (jparams  (db:obj->string params)) ;; (rmt:dat->json-str params))
	 (res  	   (handle-exceptions
		    exn
345
346
347
348
349
350
351

352



353



354

355



356
357
358
359
360
361
362
353
354
355
356
357
358
359
360

361
362
363
364
365
366
367
368
369

370
371
372
373
374
375
376
377
378
379







+
-
+
+
+

+
+
+

+
-
+
+
+








;; These require run-id because the values come from the run!
;;
(define (rmt:get-key-val-pairs run-id)
  (rmt:send-receive 'get-key-val-pairs run-id (list run-id)))

(define (rmt:get-keys)
  (if *db-keys* *db-keys* 
  (rmt:send-receive 'get-keys #f '()))
     (let ((res (rmt:send-receive 'get-keys #f '())))
       (set! *db-keys* res)
       res)))

;; we don't reuse run-id's (except possibly *after* a db cleanup) so it is safe
;; to cache the resuls in a hash
;;
(define (rmt:get-key-vals run-id)
  (or (hash-table-ref/default *keyvals* run-id #f)
  (rmt:send-receive 'get-key-vals #f (list run-id)))
      (let ((res (rmt:send-receive 'get-key-vals #f (list run-id))))
        (hash-table-set! *keyvals* run-id res)
        res)))

(define (rmt:get-targets)
  (rmt:send-receive 'get-targets #f '()))

(define (rmt:get-target run-id)
  (rmt:send-receive 'get-target run-id (list run-id)))