Aled, What I need is option 2. I need to explicitly create a top-level task to be executed independently of the poller. In this case the poller task should be considered complete as soon as it returns.
I think the way we treat transient currently is most natural - discard all children tasks as well, so Option 1 & 3 would be surprising. (1). would require all subtasks to be marked explicitly as transient which would be error-prone, (3) will create too much junk so better keep it hidden (or at least namespaced in a dummy task). What I miss sometimes is to be able to check the isRunning script from UI though, would be nice to have it. Svet. > On 16.03.2015 г., at 15:08, Aled Sage <[email protected]> wrote: > > Svet, > > I think we need a code-change in Brooklyn to avoid having to do that > Workaround. > > --- > Do you think we should: > 1. change `BrooklynGarbageCollector` so that a task will not be > GC'ed if any of its child-tasks are non-transient? > > Or do you think your use-case would be better met by either: > > 2. ensuring your task is top-level (as per your workaround); > e.g. something in the task-builder to mark it as top-level. > or > > 3. when GC'ing the parent task, promote non-transient child tasks to > become top-level tasks (i.e. delete the parent, but not the child)? > > I partly like (1), but it might be really ugly/confusing in the activities > view if some poller tasks are shown and others are not. > (e.g. someone thinks that was the last time it polled). > > Option (2) sounds good to support. I have a small worry it would get > confusing though - e.g. for determining when the original task is completed, > etc. > > Option (3) sounds potentially dangerous if the tasks hierarchy has > relationships between tasks. But all these tasks should have been completed; > it's just the historic record we're talking about. > > Thoughts? > > Aled > > > On 16/03/2015 12:40, Svetoslav Neykov wrote: >>> If the parent task is transient, then the parent can be GC'ed, which will >>> cause all its children to be GC'ed even if they are non-transient. >> Yes, that's the case - I am submitting the task from a ScheduledTask started >> by a poller, so it's transient. I can't find a (good) way to make it >> non-GCable. The solution which I came up with doesn't look too good at all: >> >> Task<?> currentTask = >> BasicExecutionManager.getPerThreadCurrentTask().get(); >> BasicExecutionManager.getPerThreadCurrentTask().set(null); >> try { >> Entities.submit(entity, updateService); >> } finally { >> BasicExecutionManager.getPerThreadCurrentTask().set(currentTask); >> } >> >> >> >> I can see the task at the right place while placing a breakpoint in it, but >> as soon as it completes it is GCed at >> BrooklynGarbageCollector.expireSubTasksWhoseSubmitterIsExpired(). >> >> Svet. >> >> >>> On 16.03.2015 г., at 14:11, Aled Sage <[email protected]> wrote: >>> >>> Svet, >>> >>> I couldn't reproduce this. I wrote the following test, which passed: >>> >>> @Test >>> public void testNonTransientTaskNotGced() throws Exception { >>> Task<String> task = TaskBuilder.<String>builder() >>> .body(Callables.returning("abc")) >>> .tag(BrooklynTaskTags.tagForContextEntity(app)) >>> .tag(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG) >>> .build(); >>> Entities.submit(app, task); >>> task.get(); >>> ((LocalManagementContext)mgmt).getGarbageCollector().gcIteration(); >>> >>> Set<Task<?>> alltasks = app.getExecutionContext().getTasks(); >>> assertTrue(alltasks.contains(task)); >>> } >>> >>> Could your task be not top-level perhaps? If the parent task is transient, >>> then the parent can be GC'ed, which will cause all its children to be GC'ed >>> even if they are non-transient. >>> >>> Or could there be a lot of other tasks (it will by default only keep a max >>> number of tasks per entity/tag, but it should delete the oldest tasks >>> first). >>> >>> Aled >>> >>> p.s. the relevant code is >>> `BrooklynGarbageCollector.shouldDeleteTaskImmediately`, which checks for >>> the presence of the tag `ManagementContextInternal.NON_TRANSIENT_TASK_TAG`. >>> >>> >>> On 16/03/2015 11:46, Svetoslav Neykov wrote: >>>> How do I create a top level task for an entity which remains after the >>>> current task completes? >>>> >>>> I have code running in a poller which starts a task in certain conditions. >>>> I want the task to remain in the task list of the entity, but it is GCed >>>> after the ScheduledTaskcompletes and I see no way to prevent it. >>>> I am starting the task as follows because I want it as a top-level task, >>>> instead of as a child of the current one. >>>> >>>> TaskBuilder.builder() >>>> .tag(BrooklynTaskTags.tagForContextEntity(entity)) >>>> .tag(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG) >>>> Entities.submit(entity, updateService); >>>> >>>> Svet. >> >
