luci-base: cbi: atomically reorder uci sections

Since the switch to ubus uci operations we do not have a local application-
side cursor cache anymore, instead uci operations happen synchronously in
the rpcd backend server.

This may cause cbi section reorder operations involving multiple elements
to fail, because anonymous section hashes may change due to rehashing
between consecutive ubus uci reorder calls.

In order to avoid that problem, use the ubus uci batch reorder extension,
which allows to pass a complete (or partial) list of section ids in the
desired order in one call, bypassing the volatile section id problem.

Fixes #1844.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2018-05-31 15:39:43 +02:00
parent 660e4f5504
commit 2d352a9251

View file

@ -1226,13 +1226,14 @@ function TypedSection.parse(self, novld)
local stval = RESORT_PREFIX .. self.config .. "." .. self.sectiontype
local order = self.map:formvalue(stval)
if order and #order > 0 then
local sid
local num = 0
local sids, sid = { }, nil
for sid in util.imatch(order) do
self.map.uci:reorder(self.config, sid, num)
num = num + 1
sids[#sids+1] = sid
end
if #sids > 0 then
self.map.uci:reorder(self.config, sids)
self.changed = true
end
self.changed = (num > 0)
end
end