Skip to content
This repository was archived by the owner on Nov 9, 2022. It is now read-only.

Commit 3336eda

Browse files
authored
Merge branch 'dev' into Issue-665
2 parents 62412bd + 618ddb2 commit 3336eda

File tree

5 files changed

+107
-19
lines changed

5 files changed

+107
-19
lines changed

deploy/default.properties

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,8 @@ http.retry-delay=15
265265
# Application configuration files
266266
#
267267
application-conf-file=src/app/config/config.xqy
268+
269+
# Verified restart config
270+
#
271+
verify_retry_max=5
272+
verify_retry_interval=10

deploy/lib/server_config.rb

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ def execute_query(query, properties = {})
533533
return r
534534
end
535535

536-
def restart
536+
def restart_basic
537537
@ml_username = @properties['ml.bootstrap-user'] || @properties['ml.user']
538538
if @ml_username == @properties['ml.bootstrap-user']
539539
@ml_password = @properties['ml.bootstrap-password']
@@ -569,6 +569,43 @@ def restart
569569
return true
570570
end
571571

572+
# implemented verified restart
573+
def restart
574+
verify = find_arg(['--verify'])
575+
if verify==='false'
576+
restart_basic
577+
else
578+
# defaults to verified restart
579+
old_timestamp = go(%Q{http://#{@properties["ml.server"]}:8001/admin/v1/timestamp}, "get").body
580+
restart_basic
581+
retry_count = 0
582+
retry_max = @properties["ml.verify_retry_max"].to_i
583+
retry_interval = @properties["ml.verify_retry_interval"].to_i
584+
new_timestamp = old_timestamp
585+
while retry_count < retry_max do
586+
begin
587+
new_timestamp = go(%Q{http://#{@properties["ml.server"]}:8001/admin/v1/timestamp}, "get").body
588+
rescue
589+
logger.info 'Verifying restart ...'
590+
logger.debug 'Retry attempt ' + retry_count.to_s + ' failed'
591+
end
592+
if new_timestamp != old_timestamp
593+
# indicates that restart is confirmed successful
594+
break
595+
end
596+
logger.debug "Verifying restart..."
597+
sleep retry_interval
598+
retry_count += 1
599+
end
600+
if new_timestamp == old_timestamp
601+
logger.warn "Could not verify restart"
602+
else
603+
logger.info 'Verified restart.'
604+
logger.debug "Verified restart new #{new_timestamp} old #{old_timestamp}"
605+
end
606+
end
607+
end
608+
572609
def merge
573610
what = ARGV.shift
574611
raise HelpException.new("merge", "Missing WHAT") unless what

deploy/lib/xquery/setup.xqy

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ declare variable $replicating-map-file := "/roxy/status/cleanup/replicating-map.
7272
declare variable $replicating-map-file-internal := "/roxy/status/cleanup/replicating-map-internal.xml";
7373
declare variable $replicating-map := map:map();
7474

75+
(: Several functions take an optional invalid-values parameter. Use this as the
76+
: default value when it's not provided.
77+
:)
78+
declare variable $default-invalid-values := "reject";
79+
7580
declare variable $group-settings :=
7681
<settings>
7782
<setting>list-cache-size</setting>
@@ -1170,9 +1175,9 @@ declare function setup:do-restart($group-name as xs:string?) as item()*
11701175
"Restarting hosts to make configuration changes take effect"),
11711176

11721177
if ($group-id) then
1173-
fn:concat("Group ", $group-name, " restarted")
1178+
fn:concat("Invoked group ", $group-name, " restart")
11741179
else
1175-
fn:concat("Cluster restarted")
1180+
fn:concat("Invoked cluster restart")
11761181
)
11771182
}
11781183
catch ($ex)
@@ -2258,7 +2263,7 @@ declare function setup:validated-range-element-indexes(
22582263
$index-config/db:localname/fn:string(.),
22592264
fn:string($index-config/db:collation[../db:scalar-type = 'string']),
22602265
($index-config/db:range-value-positions/xs:boolean(.), false())[1],
2261-
($index-config/db:invalid-values, "reject")[1]
2266+
($index-config/db:invalid-values, $default-invalid-values)[1]
22622267
)
22632268
else
22642269
xdmp:apply(
@@ -2320,7 +2325,7 @@ declare function setup:validated-range-element-attribute-indexes(
23202325
$index-config/db:localname/fn:string(.),
23212326
fn:string($index-config/db:collation[../db:scalar-type = 'string']),
23222327
($index-config/db:range-value-positions/xs:boolean(.), false())[1],
2323-
($index-config/db:invalid-values, "reject")[1]
2328+
($index-config/db:invalid-values, $default-invalid-values)[1]
23242329
)
23252330
else
23262331
xdmp:apply(
@@ -2449,7 +2454,7 @@ declare function setup:add-range-path-indexes(
24492454
$index/db:path-expression,
24502455
$index/db:collation,
24512456
$index/db:range-value-positions,
2452-
$index/db:invalid-values
2457+
($index/db:invalid-values, $default-invalid-values)[1]
24532458
)
24542459
)"
24552460
)
@@ -2478,16 +2483,18 @@ declare function setup:validate-range-path-indexes(
24782483
declare namespace db="http://marklogic.com/xdmp/database";
24792484
declare variable $database external;
24802485
declare variable $x external;
2486+
declare variable $default-invalid-values external;
24812487
24822488
admin:database-range-path-index(
24832489
$database,
24842490
$x/db:scalar-type,
24852491
$x/db:path-expression,
24862492
fn:string($x/db:collation[../db:scalar-type = "string"]),
24872493
$x/db:range-value-positions,
2488-
$x/db:invalid-values)',
2494+
($x/db:invalid-values, $default-invalid-values)[1])',
24892495
(xs:QName("database"), $database,
2490-
xs:QName("x"), $expected))
2496+
xs:QName("x"), $expected,
2497+
xs:QName("default-invalid-values"), $default-invalid-values))
24912498
return
24922499
if ($existing[fn:deep-equal(., $expected)]) then ()
24932500
else
@@ -2689,7 +2696,7 @@ declare function setup:add-range-field-indexes-helper(
26892696
$index/db:field-name,
26902697
($index/db:collation/fn:string(), "")[1], (: ML6 requires xs:string; later requires xs:string? :)
26912698
$index/db:range-value-positions,
2692-
$index/db:invalid-values
2699+
($index/db:invalid-values, $default-invalid-values)[1]
26932700
)
26942701
else
26952702
admin:database-range-field-index(
@@ -2738,7 +2745,7 @@ declare function setup:add-geospatial-element-indexes(
27382745
$index/db:coordinate-system,
27392746
$index/db:range-value-positions,
27402747
($index/db:point-format, "point")[1],
2741-
($index/db:invalid-values, "ignore")[1]
2748+
($index/db:invalid-values, $default-invalid-values)[1]
27422749
)
27432750
else
27442751
admin:database-geospatial-element-index(
@@ -2792,7 +2799,7 @@ declare function setup:add-geospatial-element-attribute-pair-indexes(
27922799
$index/db:longitude-localname,
27932800
$index/db:coordinate-system,
27942801
$index/db:range-value-positions,
2795-
($index/db:invalid-values, "ignore")[1]
2802+
($index/db:invalid-values, $default-invalid-values)[1]
27962803
)
27972804
else
27982805
admin:database-geospatial-element-attribute-pair-index(
@@ -2849,7 +2856,7 @@ declare function setup:add-geospatial-element-pair-indexes(
28492856
$index/db:longitude-localname,
28502857
$index/db:coordinate-system,
28512858
$index/db:range-value-positions,
2852-
($index/db:invalid-values, "ignore")[1]
2859+
($index/db:invalid-values, $default-invalid-values)[1]
28532860
)
28542861
else
28552862
admin:database-geospatial-element-pair-index(
@@ -2905,7 +2912,7 @@ declare function setup:add-geospatial-element-child-indexes(
29052912
$index/db:coordinate-system,
29062913
$index/db:range-value-positions,
29072914
($index/db:point-format, "point")[1],
2908-
($index/db:invalid-values, "ignore")[1]
2915+
($index/db:invalid-values, $default-invalid-values)[1]
29092916
)
29102917
else
29112918
admin:database-geospatial-element-child-index(
@@ -4742,6 +4749,9 @@ declare function setup:validate-external-security(
47424749
declare function setup:create-roles(
47434750
$import-config as element(configuration))
47444751
{
4752+
(: get the existing role names from the default security DB :)
4753+
let $existing-role-names := setup:get-existing-role-names()
4754+
47454755
(: Create all missing roles :)
47464756
for $role in $import-config/sec:roles/sec:role
47474757
let $role-name as xs:string := $role/sec:role-name
@@ -4754,7 +4764,7 @@ declare function setup:create-roles(
47544764
</options>
47554765
return
47564766
(: if the role exists, then don't create it :)
4757-
if (setup:get-roles(())/sec:role[sec:role-name = $role-name]) then ()
4767+
if ($existing-role-names[. = $role-name]) then ()
47584768
else
47594769
(
47604770
xdmp:eval(
@@ -4911,6 +4921,9 @@ declare function setup:create-roles(
49114921
declare function setup:validate-roles(
49124922
$import-config as element(configuration))
49134923
{
4924+
(: get the existing role names from the default security DB :)
4925+
let $existing-roles := setup:get-roles(())
4926+
49144927
for $role in $import-config/sec:roles/sec:role
49154928
let $role-name as xs:string := $role/sec:role-name
49164929
let $description as xs:string? := $role/sec:description
@@ -4921,7 +4934,7 @@ declare function setup:validate-roles(
49214934
let $privileges as element(sec:privilege)* := $role/sec:privileges/sec:privilege
49224935
let $amps as element(sec:amp)* := $role/sec:amps/*
49234936
let $external-names as xs:string* := $role/sec:external-names/sec:external-name
4924-
let $match := setup:get-roles(())/sec:role[sec:role-name = $role-name]
4937+
let $match := $existing-roles/sec:role[sec:role-name = $role-name]
49254938
return
49264939
if ($match) then
49274940
if ($match/sec:role-name != $role-name or
@@ -4964,6 +4977,10 @@ declare function setup:associate-users-with-roles($import-config as element(conf
49644977

49654978
declare function setup:create-users($import-config as element(configuration))
49664979
{
4980+
(: get the existing user names from the default security DB :)
4981+
let $existing-user-names := setup:get-existing-user-names()
4982+
4983+
(: Create all missing users :)
49674984
for $user in $import-config/sec:users/sec:user
49684985
let $user-name as xs:string := $user/sec:user-name
49694986
let $description as xs:string? := $user/sec:description
@@ -4978,7 +4995,7 @@ declare function setup:create-users($import-config as element(configuration))
49784995
<isolation>different-transaction</isolation>
49794996
</options>
49804997
return
4981-
if (setup:get-users(())/sec:user[sec:user-name = $user-name]) then
4998+
if ($existing-user-names[. = $user-name]) then
49824999
(
49835000
xdmp:eval(
49845001
'import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy";
@@ -5088,6 +5105,9 @@ declare function setup:create-users($import-config as element(configuration))
50885105

50895106
declare function setup:validate-users($import-config as element(configuration))
50905107
{
5108+
(: get the existing users from the default security DB :)
5109+
let $existing-users := setup:get-users(())
5110+
50915111
for $user in $import-config/sec:users/sec:user
50925112
let $user-name as xs:string := $user/sec:user-name
50935113
let $description as xs:string? := $user/sec:description
@@ -5096,7 +5116,7 @@ declare function setup:validate-users($import-config as element(configuration))
50965116
let $permissions as element(sec:permission)* := $user/sec:permissions/*
50975117
let $collections as xs:string* := $user/sec:collections/*
50985118
let $external-names as xs:string* := $user/sec:external-names/sec:external-name
5099-
let $match := setup:get-users(())/sec:user[sec:user-name = $user-name]
5119+
let $match := $existing-users/sec:user[sec:user-name = $user-name]
51005120
return
51015121
if ($match) then
51025122
if ($match/sec:description != $description or
@@ -5451,6 +5471,19 @@ declare function setup:get-privilege-by-name($name as xs:string) as element(sec:
54515471
</options>)
54525472
};
54535473

5474+
(: Gets the user names from the default security database :)
5475+
declare function setup:get-existing-user-names() as element(sec:user-name)* {
5476+
let $user-names :=
5477+
xdmp:eval(
5478+
'import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy";
5479+
/sec:user',
5480+
(),
5481+
<options xmlns="xdmp:eval">
5482+
<database>{$default-security}</database>
5483+
</options>)/sec:user-name
5484+
return $user-names
5485+
};
5486+
54545487
declare function setup:get-users-by-name($names as xs:string*) as element(sec:users)? {
54555488
let $ids :=
54565489
for $name in $names
@@ -5530,6 +5563,19 @@ declare function setup:get-user-id($user-name as xs:string) as xs:unsignedLong?
55305563
</options>)
55315564
};
55325565

5566+
(: Gets the role names from the default security database :)
5567+
declare function setup:get-existing-role-names() as element(sec:role-name)* {
5568+
let $role-names :=
5569+
xdmp:eval(
5570+
'import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy";
5571+
/sec:role',
5572+
(),
5573+
<options xmlns="xdmp:eval">
5574+
<database>{$default-security}</database>
5575+
</options>)/sec:role-name
5576+
return $role-names
5577+
};
5578+
55335579
declare function setup:get-roles-by-name($roles as xs:string*) as element(sec:roles)? {
55345580
let $ids :=
55355581
for $role in $roles

src/app/config/config.xqy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ declare variable $c:ROXY-ROUTES :=
6868
:
6969
: ***********************************************
7070
:)
71-
declare variable $c:CTRL-EXT := ("@ml.controller-ext", $def:CTRL-EXT)[1];
71+
declare variable $c:CTRL-EXT := ("@ml.controller-ext", $def:CTRL-EXT)[fn:not(. eq "@" || "ml.controller-ext")][1];
7272

7373
(:
7474
: ***********************************************

version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.7.5
1+
April-2017-dev

0 commit comments

Comments
 (0)