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

[HOLD for payment 2024-07-10] [HOLD for payment 2024-07-02] LOW: [$500] Stop using reportAction.originalMessage or reportAction.message.text #39797

Closed
quinthar opened this issue Apr 6, 2024 · 73 comments
Assignees
Labels
Awaiting Payment Auto-added when associated PR is deployed to production Bug Something is broken. Auto assigns a BugZero manager. Improvement Item broken or needs improvement. Internal Requires API changes or must be handled by Expensify staff Weekly KSv2

Comments

@quinthar
Copy link
Contributor

quinthar commented Apr 6, 2024

Problem:

Each comment in the server database is stored in reportAction.message in HTML form. However, for some reason lost to time, when we send that same comment out as an Onyx update, we:

  1. Rename the original message in the database to reportAction.originalMessage in the update (which is confusing)
  2. Create a new message object that contains a copy of the html message, as well as a stripped text version.
  3. Put the message object inside a totally unnecessary one-element array

That means every comment is actually sent out three times (four, if you include the update to the report object, but that's out of scope for now). This is clearly wasteful in a number of ways:

  1. It requires postprocessing on the server to do this extraneous operation
  2. It increases network bandwidth by 3x
  3. It increases RAM use 3x
  4. It increases on-device storage 3x
  5. It's confusing AF

Additionally, it's particularly problematic when sending Onyx updates out via UrbanAirship, which is extremely limited in the payload sizes allowed -- with anything over a certain limit just dropped quietly and never delivered, causing "gaps" in our update stream (which require more network calls to "backfill" the Onyx data on app open, which makes things slow). Basically, this was just a mistake introduced for reasons we can't remember, but that we want to undo.

Solution:

To solve this, please:

  1. Phase 1 (External / clientside): Stop using originalMessage, start using array-message
    1. Update every instance of originalMessage.html to use message.html || message[0].html
    2. Update every instance of message.text to dynamically strip the text from message.html || message[0].html
    3. Update every key within originalMessage to use the original message
  2. Phase 2 (Internal / serverside): Once we've confirmed the client no longer uses originalMessage or message.text or any other key within originalMessage:
    1. Stop sending originalMessage
    2. Start sending message without an array
  3. Phase 3 (External / clientside): Remove checking for "array message"

This issue is for phase 1 and phase 3.

Upwork Automation - Do Not Edit
  • Upwork Job URL: https://www.upwork.com/jobs/~01856d1399295ef760
  • Upwork Job ID: 1776729925881405440
  • Last Price Increase: 2024-07-12
  • Automatic offers:
    • cubuspl42 | Reviewer | 0
Issue OwnerCurrent Issue Owner: @puneetlath
@quinthar quinthar converted this from a draft issue Apr 6, 2024
@quinthar quinthar added External Added to denote the issue can be worked on by a contributor Daily KSv2 Improvement Item broken or needs improvement. labels Apr 6, 2024
@melvin-bot melvin-bot bot changed the title HIGH: [Reliability] Remove text from the reportActions sent to the client to reduce payload size [$250] HIGH: [Reliability] Remove text from the reportActions sent to the client to reduce payload size Apr 6, 2024
Copy link

melvin-bot bot commented Apr 6, 2024

Job added to Upwork: https://www.upwork.com/jobs/~01856d1399295ef760

@melvin-bot melvin-bot bot added the Help Wanted Apply this label when an issue is open to proposals by contributors label Apr 6, 2024
Copy link

melvin-bot bot commented Apr 6, 2024

Triggered auto assignment to Contributor-plus team member for initial proposal review - @cubuspl42 (External)

@maxim-grin
Copy link

maxim-grin commented Apr 6, 2024

Hey I’m going to investigate why the payload is so big in Onyx storage. Possibly track what change exactly caused the problem. Then either revert that piece of change or use one of suggestions by @thienlnam

Contributor details
Your Expensify account email: [email protected]
Upwork Profile Link: https://www.upwork.com/freelancers/~01fb7b172c01252917

Copy link

melvin-bot bot commented Apr 6, 2024

📣 @maxim-grin! 📣
Hey, it seems we don’t have your contributor details yet! You'll only have to do this once, and this is how we'll hire you on Upwork.
Please follow these steps:

  1. Make sure you've read and understood the contributing guidelines.
  2. Get the email address used to login to your Expensify account. If you don't already have an Expensify account, create one here. If you have multiple accounts (e.g. one for testing), please use your main account email.
  3. Get the link to your Upwork profile. It's necessary because we only pay via Upwork. You can access it by logging in, and then clicking on your name. It'll look like this. If you don't already have an account, sign up for one here.
  4. Copy the format below and paste it in a comment on this issue. Replace the placeholder text with your actual details.
    Screen Shot 2022-11-16 at 4 42 54 PM
    Format:
Contributor details
Your Expensify account email: <REPLACE EMAIL HERE>
Upwork Profile Link: <REPLACE LINK HERE>

@maxim-grin
Copy link

Hey I’m going to investigate why the payload is so big in Onyx storage. Possibly track what change exactly caused the problem. Then either revert that piece of change or use one of suggestions by @thienlnam

Contributor details
Your Expensify account email: [email protected]
Upwork Profile Link: https://www.upwork.com/freelancers/~01fb7b172c01252917

Copy link

melvin-bot bot commented Apr 6, 2024

✅ Contributor details stored successfully. Thank you for contributing to Expensify!

@ShridharGoel
Copy link
Contributor

ShridharGoel commented Apr 7, 2024

Proposal

Please re-state the problem that we are trying to solve in this issue.

We don't need to use text from reportAction, it would be better to use originalMessage.html.

What is the root cause of that problem?

New change.

text from message in reportAction is being used at multiple places.

What changes do you think we should make in order to solve the problem?

We have text defined here:

/** The text content of the fragment. */
text: string;

Example usage:

const actionMessage = action.message?.[0]?.text ?? '';

We can change this to:

const parser = new ExpensiMark();
const actionMessage = parser.htmlToText(action.message?.[0]?.html ?? '');

Add the above in a common method getActionMessagePostParsing in ReportUtils.
Similarly, check all usages and update them to use the method mentioned above.

Finally, we can remove text.

There's one instance of originalMessage?.html in ReportUtils.ts which also needs to be updated to use the common method.

if (ReportActionsUtils.isWhisperAction(reportAction)) {
    // Allow flagging welcome message whispers as they can be set by any room creator
    if (report?.description && !isCurrentUserAction && isOriginalMessageHaveHtml && `getActionMessagePostParsing(reportAction)` === report.description) {
        return true;
    }

    // Disallow flagging the rest of whisper as they are sent by us
    return false;
}

@nkdengineer
Copy link
Contributor

nkdengineer commented Apr 8, 2024

Proposal

Please re-state the problem that we are trying to solve in this issue.

We want to remove the usage of text of reportAction in the payload sent to client side.
And also changes how we're using message.html

What is the root cause of that problem?

This is new feature request.

What changes do you think we should make in order to solve the problem?

  1. Define 2 common methods here, to get the report action html (with forward compatibility: message as single item), and to get the report action text dynamically by parsing the html:
function getReportActionHtml(reportAction: OnyxEntry<ReportAction>) {
    return reportAction?.message?.html || reportAction?.message?.[0]?.html;
}

function getReportActionText(reportAction: OnyxEntry<ReportAction>) {
    const html = getReportActionHtml(reportAction);
    const parser = new ExpensiMark();
    return html ? parser.htmlToText(html) : '';
}
  1. Update every instance of originalMessage.html to use message.html || message[0].html

In here, replace reportAction?.originalMessage?.html by getReportActionHtml(reportAction)

  1. Update every instance of message.text to dynamically strip the text from message.html || message[0].html

There're some places that are using message?.[0]?.text, examples: here, here, here, ... (There're more)
We can replace them by getReportActionText(reportAction).

  1. Phase 3 (External / clientside): Remove checking for "array message"

After phase 2 is done, we can just change the implementation of getReportActionHtml to

function getReportActionHtml(reportAction: OnyxEntry<ReportAction>) {
    return reportAction?.message?.html;
}
  1. There're other places that use originalMessage, but not its html field, like here

We might need to replace them with getReportActionMessage(reportAction)

Where getReportActionMessage will be the following:

function getReportActionMessage(reportAction: OnyxEntry<ReportAction>) {
    return reportAction?.message || reportAction?.message?.[0];
}

To be compatible with both current format of message (as array) and new message format later (single item). The reportAction?.message?.[0] part can be removed after Phase 2 is done.

What alternative solutions did you explore? (Optional)

NA

@cubuspl42
Copy link
Contributor

@ShridharGoel

Similarly, check all usages and update them

Are you saying to literally repeat this code snippet in all places? Couldn't we refactor the code to avoid this repetition?

As the scope of the issue is well-defined and rather narrow, I believe this part of the plan can be a part of the proposal.

@nkdengineer

Aren't you quoting browser-specific local notifications code? 🤔 As I understand it, the ultimate goal is to optimize the payload size of remote push notifications.

@nkdengineer
Copy link
Contributor

nkdengineer commented Apr 9, 2024

Aren't you quoting browser-specific local notifications code? 🤔 As I understand it, the ultimate goal is to optimize the payload size of remote push notifications.

@cubuspl42 In the OP it's mentioned

@thienlnam thinks we added text for notifications

So I'm quoting the place that we're showing notification based on text, so it's clear where it's used.

It's only 1 part of the proposal though, what do you think about the rest of my proposal?

Are you saying to literally repeat this code snippet in all places? Couldn't we refactor the code to avoid this repetition?

@cubuspl42 My alternative solution achieves this

@ShridharGoel
Copy link
Contributor

Proposal

Updated. @cubuspl42 We can add a method in ReportUtils, updated the proposal.

@cubuspl42
Copy link
Contributor

@quinthar

Would you summarize the Expensify notifications architecture in a few sentences so that we can be more confident with proposal preparation and review?

As I understand that most (if not all?) notification processing on mobile Native is server-side (push-based), and we're talking about optimizing the pushed payload size. But I'm not 100% confident how that relates to the Onyx schema.

Also, there were some doubts about the scope...

I'm assuming here that we're only omitting the text from reportActions in urban airship native updates, if we're going to remove text in Pusher update too, then we need to populate the text in the Pusher report actions updates by htmlToText.

Would you clarify this too? My intuition was that we wanted to nuke all usage of the text property client-side, also removing it from the typing. But it would be good to be sure about it.

@quinthar quinthar changed the title [$250] HIGH: [Reliability] Remove text from the reportActions sent to the client to reduce payload size [$250] HIGH: [Reliability] Stop using reportAction.message and only use reportAction.originalMessage Apr 9, 2024
@quinthar
Copy link
Contributor Author

quinthar commented Apr 9, 2024

Great question. I've updated the original post with a more detailed description of the problem and solutions. Thanks!

@quinthar quinthar changed the title [$250] HIGH: [Reliability] Stop using reportAction.message and only use reportAction.originalMessage [$250] HIGH: [Reliability] Stop using reportAction.originalMessage or reportAction.message.text Apr 9, 2024
@ShridharGoel
Copy link
Contributor

Proposal

Updated

@quinthar
Copy link
Contributor Author

quinthar commented Apr 9, 2024

Updated the proposal again (sorry!!!) in light of message being in this weird one-element array. Thanks for your understanding and help in cleaning up this mess!

@nkdengineer
Copy link
Contributor

Proposal updated after latest requirements update

@cubuspl42
Copy link
Contributor

@nkdengineer I think your proposal shows more preparation. How is your capacity, though? Would you be able to start working on this within 24-48 hours?

@nkdengineer
Copy link
Contributor

Would you be able to start working on this within 24-48 hours?

@cubuspl42 Yes, I definitely can

@cubuspl42
Copy link
Contributor

I approve the proposal by @nkdengineer

C+ reviewed 🎀 👀 🎀

Copy link

melvin-bot bot commented Apr 11, 2024

Triggered auto assignment to @thienlnam, see https://stackoverflow.com/c/expensify/questions/7972 for more details.

Copy link

melvin-bot bot commented Jun 25, 2024

The solution for this issue has been 🚀 deployed to production 🚀 in version 9.0.1-19 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:

If no regressions arise, payment will be issued on 2024-07-02. 🎊

For reference, here are some details about the assignees on this issue:

  • @c3024 requires payment (Needs manual offer from BZ)
  • @nkdengineer requires payment (Needs manual offer from BZ)

Copy link

melvin-bot bot commented Jun 25, 2024

BugZero Checklist: The PR fixing this issue has been merged! The following checklist (instructions) will need to be completed before the issue can be closed:

  • [@c3024] The PR that introduced the bug has been identified. Link to the PR:
  • [@c3024] The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake. Link to comment:
  • [@c3024] A discussion in #expensify-bugs has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner. Link to discussion:
  • [@c3024] Determine if we should create a regression test for this bug.
  • [@c3024] If we decide to create a regression test for the bug, please propose the regression test steps to ensure the same bug will not reach production again.
  • [@puneetlath] Link the GH issue for creating/updating the regression test once above steps have been agreed upon:

Copy link

melvin-bot bot commented Jul 2, 2024

Payment Summary

Upwork Job

  • ROLE: @c3024 paid $(AMOUNT) via Upwork (LINK)
  • ROLE: @nkdengineer paid $(AMOUNT) via Upwork (LINK)

BugZero Checklist (@puneetlath)

  • I have verified the correct assignees and roles are listed above and updated the neccesary manual offers
  • I have verified that there are no duplicate or incorrect contracts on Upwork for this job (https://www.upwork.com/ab/applicants/1776729925881405440/hired)
  • I have paid out the Upwork contracts or cancelled the ones that are incorrect
  • I have verified the payment summary above is correct

@puneetlath
Copy link
Contributor

@c3024 bump on the checklist so we can pay you. Can you also link me your Upwork profile so I can send you a job?

@nkdengineer Upwork offer here: https://www.upwork.com/nx/wm/offer/102963265. Ping me on the issue when you've accepted.

@c3024
Copy link
Contributor

c3024 commented Jul 3, 2024

BugZero Checklist: The PR fixing this issue has been merged! The following checklist (instructions) will need to be completed before the issue can be closed:

  • [@c3024] The PR that introduced the bug has been identified. Link to the PR: This is an improvement and not a bug.
  • [@c3024] The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake. Link to comment: NA
  • [@c3024] A discussion in #expensify-bugs has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner. Link to discussion: No since this is not a bug.
  • [@c3024] Determine if we should create a regression test for this bug. No, this touches several parts of the repo. There are individual regression tests for individual cases.
  • [@c3024] If we decide to create a regression test for the bug, please propose the regression test steps to ensure the same bug will not reach production again. NA

@c3024
Copy link
Contributor

c3024 commented Jul 3, 2024

bump on the checklist so we can pay you.

Done

Can you also link me your Upwork profile so I can send you a job?

Here it is - https://www.upwork.com/freelancers/~0105555e2f227dbf47

Can the pay be bumped up here? This is a large PR touching many files and there were some big revisions as well. Thanks!

@melvin-bot melvin-bot bot added Weekly KSv2 and removed Daily KSv2 labels Jul 3, 2024
@melvin-bot melvin-bot bot changed the title [HOLD for payment 2024-07-02] LOW: [$250] Stop using reportAction.originalMessage or reportAction.message.text [HOLD for payment 2024-07-10] [HOLD for payment 2024-07-02] LOW: [$250] Stop using reportAction.originalMessage or reportAction.message.text Jul 3, 2024
Copy link

melvin-bot bot commented Jul 3, 2024

The solution for this issue has been 🚀 deployed to production 🚀 in version 9.0.3-7 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:

If no regressions arise, payment will be issued on 2024-07-10. 🎊

For reference, here are some details about the assignees on this issue:

  • @c3024 requires payment (Needs manual offer from BZ)
  • @nkdengineer requires payment (Needs manual offer from BZ)

This comment was marked as duplicate.

Copy link

melvin-bot bot commented Jul 10, 2024

Payment Summary

Upwork Job

  • ROLE: @c3024 paid $(AMOUNT) via Upwork (LINK)
  • ROLE: @nkdengineer paid $(AMOUNT) via Upwork (LINK)

BugZero Checklist (@puneetlath)

  • I have verified the correct assignees and roles are listed above and updated the neccesary manual offers
  • I have verified that there are no duplicate or incorrect contracts on Upwork for this job (https://www.upwork.com/ab/applicants/1776729925881405440/hired)
  • I have paid out the Upwork contracts or cancelled the ones that are incorrect
  • I have verified the payment summary above is correct

@puneetlath puneetlath changed the title [HOLD for payment 2024-07-10] [HOLD for payment 2024-07-02] LOW: [$250] Stop using reportAction.originalMessage or reportAction.message.text [HOLD for payment 2024-07-10] [HOLD for payment 2024-07-02] LOW: [$500] Stop using reportAction.originalMessage or reportAction.message.text Jul 12, 2024
@melvin-bot melvin-bot bot added the Overdue label Jul 12, 2024
Copy link

melvin-bot bot commented Jul 12, 2024

Upwork job price has been updated to $500

@puneetlath
Copy link
Contributor

@nkdengineer please accept offer here: https://www.upwork.com/nx/wm/offer/103096930
@c3024 please accept offer here: https://www.upwork.com/nx/wm/offer/103096934

Both of you, please ping me on this issue when you've accepted.

@melvin-bot melvin-bot bot removed the Overdue label Jul 12, 2024
@c3024
Copy link
Contributor

c3024 commented Jul 12, 2024

@puneetlath thanks, accepted!

@puneetlath
Copy link
Contributor

@c3024 has been paid. Just waiting for you now @nkdengineer.

@nkdengineer
Copy link
Contributor

@puneetlath Accepted thanks 🙇

@puneetlath
Copy link
Contributor

All paid. Thanks everyone!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Awaiting Payment Auto-added when associated PR is deployed to production Bug Something is broken. Auto assigns a BugZero manager. Improvement Item broken or needs improvement. Internal Requires API changes or must be handled by Expensify staff Weekly KSv2
Projects
Status: Done
Development

No branches or pull requests