Слишком много операций LockService с одним и тем же сценарием - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть общедоступная надстройка, которая использует службу блокировки скриптов Google Apps для предотвращения чтения электронных таблиц перед выполнением записи.

var lock = LockService.getDocumentLock();
var success = lock.tryLock(240000); // 4 minutes
if (!success) {
console.warn('Could not obtain lock after 4 minutes.');
return;
}
//perform some function then release lock
lock.releaseLock();

Я продолжаю получать сообщение об ошибке:

Слишком много операций LockService с одним и тем же сценарием.

Первоначально я думал, что эта ошибка была "основана на пользователях", и потенциально было определенное количество против числа операций службы блокировки впользователь , однако в последнее время я стал чаще видеть его у 30+ пользователей за последние несколько дней.

Существует ли ограничение на число операций LockService на пользователя или за сценарий ?

Если да, то каков предел?

Я не вижу никакой ссылки на квотув пределах Квоты скрипта Служб Google

Также я не вижу ссылок на квоту в документации LockService

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Я не знаю ответа на вопрос (поэтому я не буду отмечать этот ответ как принятый), но вот мой обходной путь.

Не самое элегантное решение, поскольку оно не защищает от всех случаев (триггеры, работающие в быстрой последовательности и триггеры, порой выходящие из последовательности), поэтому приветствуются любые рекомендации от более опытных.

try{

  for(var i=1; i<11; i++){ //attempt 10 times, then run and hope for the best
    var documentLock = PropertiesService.getDocumentProperties().getProperty('documentLock');
    if(documentLock){
    Utilities.sleep(20000); //if locked, sleep for 20 seconds
    console.log('Wait ' + i + ' for documentLock to be released.');
    }else{break;}
  }

  PropertiesService.getDocumentProperties().setProperty('documentLock', true);

  runSomeFunction()

}
catch(err){

  console.error(err);
  console.error(err["stack"]);

}
finally{

  PropertiesService.getDocumentProperties().deleteProperty('documentLock');

}
0 голосов
/ 20 апреля 2019

Есть сообщение об этом: https://issuetracker.google.com/issues/112384851

Похоже, это может происходить спорадически.Сотрудник Google ответил следующим образом:

Просто чтобы обновить это: команда сценариев Apps рекомендует:

1) Использовать блок try / catch вокруг вызова LockService,и предположим, что ошибка означает «блокировка не была получена» (что бы это ни значило для логики, которую пытается выполнить скрипт).

2) Если «блокировка не была получена» означает, что «скрипт должен повторить попытку»,затем переведите в режим ожидания несколько секунд (возможно, даже экспоненциальный откат) перед повторной попыткой операции LockService.

В настоящее время у нас нет другого решения для этого и может быть обновление после внесения определенных измененийв скрипт приложения.

0 голосов
/ 13 ноября 2018

Это, вероятно, происходит, когда несколько триггеров пытаются одновременно получить доступ к одному и тому же Листу Google. Страница квоты Google нигде не описывает точные ограничения, но попробуйте уменьшить количество триггеров, связанных с листом, и это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...