Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Auth blocking function beforeUserCreated doesn't return within 7 seconds #1599

Open
tzappia opened this issue Aug 21, 2024 · 6 comments
Open

Comments

@tzappia
Copy link

tzappia commented Aug 21, 2024

Related issues

None

[REQUIRED] Version info

node: v22.6.0

firebase-functions: 5.0.1

firebase-tools: 13.15.2

firebase-admin: 12.3.1

[REQUIRED] Test case

Create blocking function:

export const beforeCreated = beforeUserCreated({
  region: 'us-west2',
}, async (event) => {
  const firestore = getFirestore();

  const newUser = {
    email: event.data.email,
    uid: event.data.uid,
  };

  const userDocRef = firestore.collection('users').doc();
  await userDocRef.create(newUser)
    .catch((error) => {
      return `Failed adding new user with email ${newUser.email}: '${error}'`;
    });

  return {
    customClaims: { fs_user_id: userDocRef.id },
  };
});

Create a new user in an app:

createUserWithEmailAndPassword(firebaseAuth, email, password);

[REQUIRED] Steps to reproduce

After deploying the blocking function, create a new user.

[REQUIRED] Expected behavior

Expect the user to be created.

[REQUIRED] Actual behavior

Auth user fails to create
Error: Firebase: Cloud function deadline exceeded. (auth/internal-error).

According to the documentation, beforeUserCreated must return within 7 seconds, otherwise the error above will be encountered. My functions code doesn't have anything in global scope that would slow down cold starts. Functions and Firestore are in the same region. I suspect the fact that I am trying to write a Firestore document during beforeUserCreated may be slowing things down (perhaps the very first usage of Firestore is slow?) Subsequent requests are usually successful (once the cold start is complete.)

If there were a way to extend the 7 seconds that would avoid the error (better, but still not a great user experience because that is slow!) I could probably re-architect the solution to avoid the Firestore write inside beforeUserCreated if I were able to pass some custom properties either in the AuthBlockingEvent that beforeUserCreated receives or in what the function returns.

Note: the document that I'm writing to Firestore is actually written, so beforeUserCreated does complete successfully, just not within the required 7 seconds.

Were you able to successfully deploy your functions?

Yes

@google-oss-bot
Copy link
Collaborator

I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.

@exaby73
Copy link
Contributor

exaby73 commented Aug 29, 2024

Hey @tzappia. Were you able to figure out whether the actual function takes that long or if there is a line of code in your function that hangs?

@exaby73 exaby73 added Needs: Author Feedback Issues awaiting author feedback and removed needs-triage labels Aug 29, 2024
@tzappia
Copy link
Author

tzappia commented Aug 29, 2024

@exaby73 it does not appear to be either my code or the function. As a workaround, I added in a fake call to createUserWithEmailAndPassword when a user arrives on my sign up page. It takes them a moment to fill out their details, then the real call to createUserWithEmailAndPassword is done and is successful. I see this as a cold start problem, my function is not able to start from cold and respond within the required 7 seconds.

FYI this is what my beforeUserCreated function does now to include my workaround:

  if (event.data?.email === 'wake@coldstart.com') {
    throw new HttpsError('internal', 'coldstart');
  }

Then in my app I just silently discard the error.

@google-oss-bot google-oss-bot added Needs: Attention and removed Needs: Author Feedback Issues awaiting author feedback labels Aug 29, 2024
@ahanusek
Copy link

I have two projects that use Google Cloud Functions (Firebase), and today I noticed enormous cold starts without any changes in the source code, which reach almost 15-30s 🤯. In one project, I'm using Cloud Run functions (1st gen), and in the second one, Cloud Run functions (2nd gen).

Cold start:
Zrzut ekranu 2024-08-29 o 22 06 16

Then:
Zrzut ekranu 2024-08-29 o 22 06 41

@exaby73
Copy link
Contributor

exaby73 commented Sep 9, 2024

This doesn't seem like an issue with the SDK. Might I suggest you contact Firebase support so that they can look at project

@tzappia
Copy link
Author

tzappia commented Sep 9, 2024

@exaby73 I can contact support, however I also believe this to be SDK related as the 7 second requirement does not come from my project but is a requirement of the core library. It seems pretty common (based on others' comments) that a function may not start from cold within 7 seconds, independent of the project code.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants