From 2d352a9251f99628162ac6bccf13c0fd5d9a71f8 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 31 May 2018 15:39:43 +0200 Subject: [PATCH] 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 --- modules/luci-base/luasrc/cbi.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/luci-base/luasrc/cbi.lua b/modules/luci-base/luasrc/cbi.lua index 472864211..4800d2aa7 100644 --- a/modules/luci-base/luasrc/cbi.lua +++ b/modules/luci-base/luasrc/cbi.lua @@ -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 -- 2.25.1