Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Error: 13 INTERNAL: An internal error occurred" happened in firebase-function's trigger sometimes

This trigger is used for detecting sequence in schedule has been updated, and help to update the schedule's overview status and finished time.

But it didn't always work when an internal error was occurred as below:

Error: 13 INTERNAL: An internal error occurred. at Object.exports.createStatusError 
(/srv/node_modules/grpc/src/common.js:91:15) at Object.onReceiveStatus 
(/srv/node_modules/grpc/src/client_interceptors.js:1204:28) at InterceptingListener._callNext 
(/srv/node_modules/grpc/src/client_interceptors.js:568:42) at InterceptingListener.onReceiveStatus 
(/srv/node_modules/grpc/src/client_interceptors.js:618:8) at callback 
(/srv/node_modules/grpc/src/client_interceptors.js:845:24)

Here is my code:

export const calc_status = function.firestore.document("users/{userid}/schedule/{scheduledid}").onUpdate(async (change, context) => {
    // before error occurred ...
    const data = change.after.data();
    let curStatus = data.status;
    ...
    ...

    // after getting occurred ...
    if(data.status !== curStatus ) {
        data.status = curStatus;
        if(curStatus === 'finished') {
            data.finish_time = new Date().toISOString();
        }
        if(curStatus !== 'expired'){
            data.update_time = data.expired_time;
            data.finish_time = data.expired_time;
        } else {
            data.update_time = new Date().toISOString();
        }
        await change.after.ref.update(data);
        return Status.SUCCEEDED;
    }
    return Status.SUCCEEDED;
}

I'm very confused why the error occurred because this function works fine at most time.

Does anyone met the same problem as mine?

Why the error happened? And what's your solution?

Thank you.

like image 847
user3116459 Avatar asked Nov 20 '19 08:11

user3116459


1 Answers

This appears to be long standing framework bug github.com/firebase/firebase-functions/issues/536 with no resolution as of yet.

Though you can't get around the error which anecdotally and very intermittently happens on a cold start you can work around it by enabling retries for the function via the full console see Retry Cloud Functions for Firebase until it succeeds for instructions.

This assumes you handle internal errors in your code very well as it will retry for any failure but in my case the functions onCreate handler was just queuing up some later processing via PubSub so any failure meant it should retry.

Oct 2020 Update

Since v3.11 of firebase-functions you can now set the retry mode in your function code by setting failurePolicy to true

module.exports = functions.runWith({ failurePolicy: true }).firestore.document('collection/doc').onWrite(async (change, context) => {
  //do function stuff
});
like image 95
David Ewen Avatar answered Nov 04 '22 13:11

David Ewen