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

fix on_startup operator not executing on startup #4125

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/packages/operators/src/OperatorCore.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import OperatorBrowser from "./OperatorBrowser";
import OperatorInvocationRequestExecutor from "./OperatorInvocationRequestExecutor";
import OperatorPrompt, { OperatorViewModal } from "./OperatorPrompt";
import StartupOperatorExecutor from "./StartupOperatorExecutor";

export default function OperatorCore() {
return (
<>
<OperatorBrowser />
<OperatorInvocationRequestExecutor />
<StartupOperatorExecutor />
<OperatorPrompt />
<OperatorViewModal />
</>
Expand Down
15 changes: 15 additions & 0 deletions app/packages/operators/src/StartupOperatorExecutor.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { useEffect } from "react";
import { executeStartupOperators } from "./operators";

let startupOperatorsExecuted = false;

export default function StartupOperatorExecutor() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems like a workaround to the actual problem. How can we make the following possible regardless of where or when it happens:

const queue = getInvocationRequestQueue();
queue.add(new InvocationRequest());

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are alternate ways to go about solving this by notifying the subscriber on add or subscriber checking the queue when adding itself as a subscriber to the queue.

This

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Its important that executeOperator() is essentially possible from any state, thats why we introduced the queue in the first place.

useEffect(() => {
if (!startupOperatorsExecuted) {
executeStartupOperators();
startupOperatorsExecuted = true;
}
}, []);

return null;
}
11 changes: 2 additions & 9 deletions app/packages/operators/src/loader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,19 @@ import { useEffect, useState } from "react";
import { useRecoilValue, useSetRecoilState } from "recoil";
import { registerBuiltInOperators } from "./built-in-operators";
import { useOperatorPlacementsResolver } from "./hooks";
import { executeStartupOperators, loadOperatorsFromServer } from "./operators";
import { loadOperatorsFromServer } from "./operators";
import {
availableOperatorsRefreshCount,
operatorsInitializedAtom,
} from "./state";

let startupOperatorsExecuted = false;

async function loadOperators(datasetName: string) {
registerBuiltInOperators();
await loadOperatorsFromServer(datasetName);
if (!startupOperatorsExecuted) {
executeStartupOperators();
startupOperatorsExecuted = true;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe the doc string below is incorrect now? OperatorCore now queues start-up operators?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yah, good point. I will update the doc string below.

}

/**
* Load built-in and installed JavaScript and Python operators and queue all
* start-up operators for execution.
* Load built-in and installed JavaScript and Python operators and initialize
*/
export function useOperators(datasetLess?: boolean) {
const [ready, setReady] = useState(false);
Expand Down
Loading