A
chore in IBM Cognos TM1 server is a container for a group of one or
more Turbo Integrator (TI) Processes. It defines the sequence in which
the processes are executed. These processes inside of a chore are
executed sequentially – in other words, the 2nd process in a chore is
executed after the 1st one finishes; 3rd process is executed after the
completion of the 2nd one … and so on.
Chores
can also be used to run the same process multiple times – in such
scenarios, the parameters passed to the process will be different.
- Chores once activated (enabled) run periodically on the set schedule. When the chore is run from a schedule, it runs on its own thread.
- Alternately, you could right click on the chore and run it on demand
Irrespective
of how the chore is run, all the TI processes are embedded in one
transaction. This means that any locks acquired by the 1st process are
held onto, until the last process is completed. Therefore any data
updates done by the group of TIs in the chore are committed, only when
the last process is completed. This is the default behavior of Cognos
TM1 server.
Starting
from 10.1, we now have a provision to commit each TI in a chore as and
when it is processed. In such scenarios, the locks are not
held onto, until the last process is completed. Therefore, the data
modified by a TI in chore is committed and locks are released, when its
execution within the chore is complete.
Let’s
look at an example, which demonstrates the difference between the 2
options – Single Commit versus Multiple Commit. To illustrate this, I
will use a simple cube, 3 TI processes and 2 chores.
1st TI Process – All it does is increment the value by 10 in the 1st intersection of the cube
vi_Value = CellGetN (vs_CubeName, ‘A’, ‘E1’, ‘zDim_03’);
AsciiOutput (GetProcessErrorFileDirectory | ‘sk03.txt’, ‘Before: ‘ | NumberToString (vi_Value) );
AsciiOutput (GetProcessErrorFileDirectory | ‘sk03.txt’, ‘Before: ‘ | NumberToString (vi_Value) );
CellIncrementN (10, vs_CubeName, ‘A’, ‘E1’, ‘zDim_03’);
vi_Value = CellGetN (vs_CubeName, ‘A’, ‘E1’, ‘zDim_03’);
AsciiOutput (GetProcessErrorFileDirectory | ‘sk03.txt’, ‘After: ‘ | NumberToString (vi_Value) );
AsciiOutput (GetProcessErrorFileDirectory | ‘sk03.txt’, ‘After: ‘ | NumberToString (vi_Value) );
vi_SimplyWaitCounter = 10000000 * 2;
WHILE (vi_SimplyWaitCounter > 0);
vi_SimplyWaitCounter = vi_SimplyWaitCounter – 1;
END;
WHILE (vi_SimplyWaitCounter > 0);
vi_SimplyWaitCounter = vi_SimplyWaitCounter – 1;
END;
val = CellGetN (vs_CubeName, ‘A’, ‘E1’, ‘zDim_03’);
AsciiOutput (GetProcessErrorFileDirectory | ‘sk01.txt’, ‘Before: ‘ | NumberToString (val) );
AsciiOutput (GetProcessErrorFileDirectory | ‘sk01.txt’, ‘Before: ‘ | NumberToString (val) );
CellIncrementN (10, vs_CubeName, ‘A’, ‘E1’, ‘zDim_03’);
val = CellGetN (vs_CubeName, ‘A’, ‘E1’, ‘zDim_03’);
AsciiOutput (GetProcessErrorFileDirectory | ‘sk01.txt’, ‘After: ‘ | NumberToString (val) );
AsciiOutput (GetProcessErrorFileDirectory | ‘sk01.txt’, ‘After: ‘ | NumberToString (val) );
1st chore: Comprises of Process 1 and Process 2
2nd Chore: Comprises of Process 3 alone
Scenario 1 – Single Commit
Run Chore 1 on demand (from one session). Run Chore 2 on demand (from another session). If you open the cube, the value will be 20. Here’s chart showing what transpired.- 1st TI process in Chore 1 (named Process 1) executes and puts value of 10 in the cube. This happens in a fraction of second. By this time the 2nd TI in the chore 1 (named Process 2) is already running and doing its wait.
- Now the 1st TI from Chore 2 (named Process 3) is executed.
- When it reads the value from the cube, it reads it as 0. Although the process 1 from chore 1 is completed, we have used Single Committ, so the committed value is not visible outside of the chore (i.e. in process 3 of chore 2).
Scenario 2 – Multiple Commit
Clear the value in the cube. Then run Chore 1 on demand (from one session). Run Chore 2 on demand (from another session). If you open the cube, the value will be 25. Here’s chart showing what transpired.- 1st TI process in Chore 1 (named Process 1) executes and puts value of 10 in the cube. This happens in a fraction of second. After this the data is committed and the locks are released. By this time the 2nd TI in the chore 1 (named Process 2) is already running and doing its wait.
- Now the 1st TI from Chore 2 (named Process 3) is executed.
- When it reads the value from the cube, it reads it as 10 (instead of 0). This is because of multi commit
- After few seconds, when the Process 2 in Chore 2 reads the value, it shows 15 (10 + 5). It then adds 10 more to it, totaling the result to 25
Well explained. Keep updating Cognos TM1 online Course Bangalore
ReplyDelete