Dynamic computation

hi all,
i need to compute the result given a formula that is extracted from a table with character field. sort of converting the text into a numeric formula. i've been trying to use macro, compute and class but to no avail as it always produce dump due to conversion (char to numeric). my last recourse would be to dynamically create a program. is there an easier way? your help/input would be greatly appreciated.
ex.
table: ztab.
field: fld1(120).
ztab-fld1 = ( PRICE_AMT / 0.1 ) * 0.98
the PRICE_AMT is to replaced with a corresponding value.
Thanks,
emcc

Hi emcc
Here is a snippet of code which I roughly wrote. I hope it satisfies your requirement. It still needs some optimization. Here, the program replaces all occurences of <b>'&'</b> with the input <b>"ip_par1"</b> in the formula input via the parameter <b>"ip_form"</b>. Then it generates a subroutine-pool to calculate the formula. You may extend it to support more than one parameter. As I remember, in 4.7+ there is a new statement as <b>"REPLACE ALL OCCURRENCES OF <str> IN <str> WITH <str>"</b> which may replace the DO-loop .
<b>REPORT dynamic_calculate .
DATA: BEGIN OF gt_itab OCCURS 1 ,
        line(80) TYPE c ,
      END OF gt_itab .
PARAMETERS: ip_form(120) .
PARAMETERS: ip_par1(10) .
START-OF-SELECTION .
  DATA gv_result TYPE i .
  DATA gv_name(30) TYPE c .
  DATA gv_err(120) TYPE c .
  DATA gv_index LIKE sy-fdpos .
  DATA gv_fore(30) TYPE c .
  DATA gv_back(30) TYPE c .
  DATA gv_formula(120) TYPE c .
  gv_formula = ip_form .
  gt_itab-line = 'REPORT generated_forms.' .
  APPEND gt_itab .
  gt_itab-line = 'FORM calculate CHANGING ep_result TYPE i . ' .
  APPEND gt_itab .
  DO .
    REPLACE  '&' WITH ip_par1 INTO gv_formula .
    IF sy-subrc NE 0 .
      EXIT .
    ENDIF .
  ENDDO .
  CONCATENATE 'ep_result =' gv_formula '.'
   INTO gt_itab-line SEPARATED BY space .
  APPEND gt_itab .
  gt_itab-line = 'ENDFORM.' .
  APPEND gt_itab .
  GENERATE SUBROUTINE POOL gt_itab NAME gv_name MESSAGE gv_err .
  PERFORM calculate IN PROGRAM (gv_name) CHANGING gv_result
                 IF FOUND .
  WRITE:/ gv_err .
  WRITE:/ gv_result .</b>
*--Serdar

Similar Messages

  • Dynamic Computation / Formula

    Hi experts,
    I want to know is it possible dynamic compute in ABAP.
    Ex:
    p_amt = computation
    where computation = 1000 / 0.12
    this is same logic with dynamic sql where in you have the option to put the table and condition dynamically. thanks

    Hi Kiran thanks for reply but i am not using the dynamic computation in sql, the reason i am doing these because the computation will just be fetch in maintenance table and i'll just replacing the value please see some sample code:
    data: c_val(20) type c value 'amount / 0.12',
          p_amt(16) type p decimals 2,
          p_amt1(16) type p decimals 2 value '1000'.
    data: command type string,
           com1(16) type p.
    concatenate  'p_amt1' '/' '0.12'
    into command separated by space.
    compute p_amt = (command).  "--> unable to interpret expression (command).

  • Can you provide descriptions for a Windows Computer in SCOM 2012?

    I have a customer who uses a very generic naming scheme for their desktops which makes it hard to know which machine is which.  The naming scheme basically uses a 3 letter acronym for the departments followed by a set of 4 numbers.  So it looks
    something like this COM-0103 and when you have a long list of hundreds of machines like that it makes it difficult to know where you need to go and/or who you need to contact when a machine is throwing alerts.
    So my question is whether or not there is a way to provide a description for a computer that will have the owner's name or the location of the machine.  Obviously renaming all of the computers would solve the issue, but that's out of the question.  Also
    the customer has access to SCOM through a Read-Only Profile and they are only able to see the Monitoring section through the console.
    Any ideas or suggestions on how to better identify machines in SCOM, if their names aren't helpful, would be very useful to me and my team.  Thank you in advance!
    Jake

    Hi Jakob,
    Please look at this post, instead of support level you can use your company data, an object can be used in SCOM Monitoring views to sort:
    http://blogs.technet.com/b/kevinholman/archive/2009/06/10/creating-custom-dynamic-computer-groups-based-on-registry-keys-on-agents.aspx
    Natalya
    ### If my post helped you, please take a moment to Vote as Helpful and\or Mark as an Answer

  • Dynamic group spark with scroller

    Hi,
    I am creating a dynamic group(mygrp) spark and adding elements using addElement function. I need to add a scroller to the main group object dynamically. I tried with same method [myScroller.addElement(mygrp)]. But that is not working. Please help me to resolve this issue. Basically I have a main contaner group object. Insided that some other group object, label, buttons using for loop. I need to give scroller for main group object.
    Many Thanks in advance

    Hi Shailendra, the articles below should provide some guidance on how to go about this:
    http://www.systemcentercentral.com/creating-dynamic-computer-groups-using-regular-expressions-in-opsmgr/
    http://social.technet.microsoft.com/wiki/contents/articles/7205.operations-manager-dynamic-group-examples.aspx
    https://technet.microsoft.com/library/hh212842.aspx
    If you've found this post helpful,  please click "Vote As Helpful" and if it answered your question, please click "Mark As Answer"
    MrChiyo | My blog: Technical | Twitter: MrChiyo

  • MDT Database - Auto Computer Name Using MAC Address

    I am trying to build a MDT server which will auto name any computer by using the MAC Address of the Network Card, I have read lots of articles and there isn't a definitive answer but I am looking for a simple answer which will work. I have tried all sorts
    of things customising the Customsettings.ini and the unattend.ini and the database.
    These are the settings I am looking at .
    Can anyone please advise me how to get MDT to query the database and output the computer name using one of these variables.
    %OSDComputername%
    %Computername%
    Can you please help.

    Hi Walkermescc,
    Since it is related to SQL database, our help might be limited. I suggest you refer to this article and it might be helpful.
    http://blogs.technet.com/b/deploymentguys/archive/2011/08/05/dynamic-computer-naming-in-zti-deployments-using-mdt-and-configmgr.aspx
    If you need more support about MDT and Database, you could post your issue to the MDT forum and there might be more suggestion for you. 
    MDT server forum:
    https://social.technet.microsoft.com/Forums/en-US/home?forum=mdt
    Regards

  • How to create a group and add class instances to that group using VSAE

    how can i create a group in VSAE and add the objects to the group that too instances of a class.
    should i use the ID of the object or some other rule to add members to that group
    Thanks & Regards, Suresh Gaddam

    Hi,
    The below links should be helpful for you to create group in VSAE:
    Computer and Instance Group Fragments in VSAE
    http://blog.scomskills.com/create-a-computer-or-instance-group/
    Create a Group of Health Service Watcher Objects Using VSAE
    http://blog.scomskills.com/create-a-group-of-health-service-watcher-objects-using-vsae/
    SCOM VSAE – Custom Dynamic Computer Groups Based On Server Registry Keys
    Regards,
    Yan Li
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. If you have feedback for TechNet Subscriber Support, contact [email protected]

  • Answer for the Interview Questions

    Hello Experts,
            Below is the list of questions from DP and SNP which I took it from APO Interview Questions thread. Please provide us the answers for the questions. It will be really helpful for the beginners like me. If every one in the forum contributes then it will be very great.
    Thanks for your reply.
    Best Regards,
    Raj.
    Where do you define Info-objects?
    Info-objects comprise of?
    What is Administrator Workbench is used to create and manage?
    What are the different types of data in liveCache?
    what is the difference between Storage Bucket Profile and Planning Bucket Profile?
    How can you setup two grids in the Planning Book / Data View?
    What can be sources of data in the timeseries keyfigure?
    What is the use of ex-post forecast in Univariate Statistical Forecasting?
    What are the types of Keyfigure aggregation in terms of characteristics/Calc Type?
    What are the types of Keyfigure aggregation in terms of time?
    Where do you maintain keyfigure aggregation?
    What are aggregates?
    What is the difference between planning characteristic and navigational attribute?
    What are selection profiles used for?
    What are the different ways of creating CVCs?
    How many levels does a macro have?
    What are the different types of standard macros?
    When is the exit and default macro executed?
    What is process chain and how is it used in Demand Planning?
    what is an Infospoke? Where do you find the configuration in BW Admin Workbench?
    what is the basis of creation of planning books and data views considering background job performance?
    Where do you set the level at which a DP background job activity has to execute?
    How can you setup custom alert types for DP and SNP?
    what is the difference between Dynamic and Database alerts?
    Where are database alerts stored (table name)?
    What is realignment and explain the process?
    What is cannibalization group?
    What are the different forecast error measures and which is most preferred?
    What are the different types of keyfigures you can use in a Planning Book?
    What is planning version and planning area initialisation?
    What is the master data in APO Demand Planning?
    what is meant by Release of Demand Plan to SNP?
    How do you create proportional factors? What is the standard keyfigure for Proportional Factor?
    1. What is the difference between order series and time series data. How does different types of transaction data get mapped to Interactive Planning keyfigures?
    2. What are the different methods of doing Supply Network Planning namely Heuristic, Optimiser, Multi-Level Demand Supply Match (CTM)?
    3. What are aggregates and how are they used in SNP.
    4. What is SNP Stock Transfer Horizon? What is the relation with Planning Time Fence?
    5. What is SNP Horizon? What is the relation with PPDS Horizon?
    6. What is the key difference in planning with SNP vs PPDS?
    7. What is the master data required for planning in SNP?
    8. How are SNP Plans different from PPDs Plans.
    9. How can capacity constraints considered in SNP.
    10. What are Quota Arrangements and how are they used?
    11. How do you get forecast in SNP? What is forecast consumption?
    12. How does the different transaction data aggregate and show up in different keyfigures in Interactive SNP?
    13. What are the different types of SNP Heuristics possible?
    14. What are the different Safety Stock calculation methods that can be sued in SNP?
    15. What is Netting and Forecast Consumption? Explain Backward and Forward Consumption?
    16. Are requirements and receipts in SNP pegged? How is it different from PPDS?
    17. What is the relationship between SNP Horizon and PPDS Horizon?
    18. Briefly describe the different ways of managing safety stock in SNP
    19. What is the difference between a model and a version
    20. In what scenario Capable-to-Match is applicable.
    21. Briefly explain how SNP optimiser can be setup and used.

    Dear Raj,
      you  can go through the following questions and answers which will help you.
    How can a planning version be frozen and unfrozen?
    A Planning Version can be frozen and unfrozen using Function Module /SAPAPO/TS_PAREA_VERSIO_FREEZE so that no further changes to the planning version can be done.
    What is Release Profile?
    Release Profile is used to release timeseries data from DP to SNP/PPDS. You need to define the DP Planning Area and timeseries keyfigure the data in which is released and the SNP Category Type (typically FA) to which data is released. You may maintain a Daily Buckets Profile it will define the number of working days (working days determined based on Shipping Calendar maintained for the location master) starting on and from the From Date if released online/ interactively or that many workdays of the planning horizon when release is carried out in background. The Period Split (blank, 1 and 2) field in the SNP2 tab of location-product master determines how demand plan is released to SNP from DP (how bucketed data is disaggregated to the workdays).
    What is the usage of Period Factor?
    Period Factor maintained in the SNP PPM or Transportation Lane determines the Availability Date of a Receipt element within a time bucket (period). The system determines the exact availability date/time of the receipt elements within a period, by adding a time interval (that it gets by multiplying the period factor with the period length) to the start time of the period. You can enter a factor between 0 and 1, where 0 is the start of the period, 0.5 the middle, and 1 the end of the period. When calculating the availability date/time, the system takes into consideration all weekdays, meaning that it does not take into consideration any days that have been defined as non-workdays in the calendars.
    Period Factor used is .71 = 7x0.71 = 4.97 or 5 days from ptimizer of weekly bucket resulting in a Friday.
    If Period Factor is not maintained in PPM or Transportation Lane then the User Period Factor indicator and the Period Factor value maintained in the Lot Size tab of the location-product combination is used. If this is not maintained a default value of 0.5 is used.
    What determines stock categories displayed in Stock on Hand keyfigure?
    The categories defined in Category Group ST1 (can be maintained in table /SAPAPO/APOCGC) determine the stock categories that are displayed in the Initial bucket in the Stock on Hand keyfigure. Subsequent buckets are dynamically computed.
    Does dynamic alerts show up in Alert Monitor?
    Dynamic Alerts do not show up in the stand-alone alert monitor. Network alerts are to show pegging relationships.
    What is the report to execute MASSD?
    The report for executing MassD in background job is MASSBACK.
    What is the shortcut to change location type in APO?
    Report /SAPAPO/CHECK_LOCATION_TYPE can be used to change location type (say from 1001 to 1002 or vice-versa) of existing locations in APO. The table to refer is /SAPAPO/LOCMAP. SAP does not recommend this process.
    How can a transaction be executed even when no authorization?
    SE93 - Transaction code for Transaction Code E.g. CRC1 Create Resource has txn code CRAH. So if you do not have authorization to create resource you can use SE93 and enter txn CRAH and then Test F8 button to go to the txn.
    How to copy a Process Chain?
    To copy a process chain to another process chain, goto the Process Chain you want to copy and then type copy in the tool tar and hit enter. It will allow you to copy the Process Chain to another Process Chain that can be modified as per user's requirement, saved, activated and used.
    What is the process to copy planning versions in R/3?
    Use OLIX to first delete previous MRP planning versions. Then use MCB& to create the new MRP planning versions by choosing the appropriate version you want to create as ICO Version. The info structure in this case is S094.
    How to use create planning book with two tables?
    To use two tables on one screen of Planning Book/Data View - select indicator next to second page title and give name. Additional tab page is displayed in Planning Book Maintenance wizard to define the keyfigures for the second table.
    What is Master Data in DP?
    Master Data in Demand Planning primarily is Charcateristic Value Combinations commonly termed CVCs. CVCs are the planning combinations against which data is stored in keyfigures.
    What is the behaviour of Procurement Type X?
    Procurement Type X - source selection is based on matching due date then priority then cost. If both In-house Production and External Procuremnet is possible then In-house Production (PPM) is chosen as source of supply.
    What is PPDS Fixing Horizon?
    PP/DS fixing Horizon defines the PP/DS time Fence - within that period if heuristic is run no orders get changed.
    What is the reuse mode in Product Heuristic?
    Reuse mode in Product Heuristic - makes the system to reuse orders already present in the heuristic run i.e. orders are not deleted and recreated.
    What is Planning Procedure?
    Planning Procedure in Product Master (PP/DS) defines that when you convert a planned order to process order it is in Deallocated state and not Scheduled state and more.
    <u><i><b>Award me if helpful</b></i></u>
    Regards
    Srikanth

  • Election problem after repeated split-brains with two nodes

    Hi
    I'm using a customized source based on BDB-5.1.19 (excxx_repquote)
    with two site one - MASTER and the other SLAVE...
    nsite=2
    ack=quorum
    - the master is writing to quotedb at a rate of 10 txn per sec
    - the test consist to isolate the client from the master (split brain) and reconnect it after a random time include from 1sec to 10sec
    the test run well about 10 times but at a moment the process slave receive DB_EVENT_REP_ELECTION_FAILED
    and the master enter in election mode and never exit from the CLIENT mode. I must say that to freeze the client I decide to kill me (kill -9 my pid) when I receive such event...
    here is the verbose log on the master...
    [1307872770:871621][6510/47655809107168] MASTER: rep_send_function returned: 110
    [1307872770:973655][6510/47655809107168] MASTER: bulk_msg: Send buffer after copy due to PERM
    [1307872770:973667][6510/47655809107168] MASTER: send_bulk: Send 266 (0x10a) bulk buffer bytes
    [1307872770:973672][6510/47655809107168] MASTER: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 68 eid -1, type bulk_log, LSN [21][986648] perm
    [1307872770:973693][6510/47655809107168] MASTER: will await acknowledgement: need 1
    [1307872771:26623][6510/47655809107168] MASTER: rep_send_function returned: 110
    [1307872771:126380][6510/1162996032] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 70 eid 0, type log, LSN [21][946345]
    [1307872771:126407][6510/1162996032] MASTER: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 68 eid -1, type dupmaster, LSN [0][0] nobuf
    [1307872771:126695][6510/1162996032] MASTER: rep_start: Found old version log 17
    [1307872771:126753][6510/1162996032] CLIENT: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 68 eid -1, type newclient, LSN [0][0] nobuf
    [1307872771:126833][6510/1183975744] CLIENT: starting election thread
    [1307872771:126876][6510/1183975744] CLIENT: Start election nsites 2, ack 1, priority 100
    [1307872771:126890][6510/1183975744] CLIENT: Election thread owns egen 69
    [1307872771:127423][6510/1173485888] CLIENT: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 70 eid 0, type newclient, LSN [0][0]
    [1307872771:130079][6510/1183975744] CLIENT: Tallying VOTE1[0] (2147483647, 69)
    [1307872771:130113][6510/1183975744] CLIENT: Beginning an election
    [1307872771:130134][6510/1183975744] CLIENT: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 68 eid -1, type vote1, LSN [21][986728] nobuf
    [1307872771:130147][6510/1173485888] CLIENT: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 68 eid -1, type master_req, LSN [0][0] nobuf
    [1307872771:130438][6510/1152506176] CLIENT: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 70 eid 0, type vote1, LSN [21][946437]
    [1307872771:130460][6510/1162996032] CLIENT: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 70 eid 0, type alive, LSN [21][986728]
    [1307872771:130467][6510/1152506176] CLIENT: Updating gen from 68 to 70
    [1307872771:130482][6510/1162996032] CLIENT: Received ALIVE egen of 71, mine 69
    [1307872771:130503][6510/1162996032] CLIENT: Election finished in 0.003602000 sec
    [1307872771:130515][6510/1162996032] CLIENT: Election done; egen 70
    [1307872771:130534][6510/1152506176] CLIENT: Received vote1 egen 71, egen 71
    [1307872771:130581][6510/1152506176] CLIENT: Tallying VOTE1[0] (0, 71)
    [1307872771:130593][6510/1089075520] CLIENT: starting election thread
    [1307872771:130619][6510/1152506176] CLIENT: Incoming vote: (eid)0 (pri)100 ELECTABLE (gen)70 (egen)71 [21,946437]
    [1307872771:130642][6510/1152506176] CLIENT: Not in election, but received vote1 0x282c 0x8
    [1307872771:130674][6510/1089075520] CLIENT: Start election nsites 2, ack 1, priority 100
    [1307872771:130692][6510/1089075520] CLIENT: Election thread owns egen 71
    [1307872771:130704][6510/1194465600] CLIENT: starting election thread
    [1307872771:130733][6510/1194465600] CLIENT: Start election nsites 2, ack 1, priority 100
    [1307872771:132922][6510/1089075520] CLIENT: Tallying VOTE1[1] (2147483647, 71)
    [1307872771:132949][6510/1089075520] CLIENT: Accepting new vote
    [1307872771:132958][6510/1089075520] CLIENT: Beginning an election
    [1307872771:132973][6510/1089075520] CLIENT: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 70 eid -1, type vote1, LSN [21][986728] nobuf
    [1307872771:132985][6510/1194465600] CLIENT: election thread is exiting
    [1307872771:133012][6510/1089075520] CLIENT: Tallying VOTE2[0] (2147483647, 71)
    [1307872771:133037][6510/1089075520] CLIENT: Counted my vote 1
    [1307872771:133048][6510/1089075520] CLIENT: Skipping phase2 wait: already got 1 votes
    [1307872771:133060][6510/1089075520] CLIENT: Got enough votes to win; election done; (prev) gen 70
    [1307872771:133071][6510/1089075520] CLIENT: Election finished in 0.002367000 sec
    [1307872771:133084][6510/1089075520] CLIENT: Election done; egen 72
    [1307872771:133111][6510/1089075520] CLIENT: Ended election with 0, e_th 1, egen 72, flag 0x2a2c, e_fl 0x0, lo_fl 0x6
    [1307872771:133170][6510/1173485888] CLIENT: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 70 eid 0, type alive, LSN [0][0]
    [1307872771:133187][6510/1173485888] CLIENT: Racing replication msg lockout, ignore message.
    [1307872771:173744][6510/1162996032] CLIENT: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 70 eid 0, type vote2, LSN [0][0]
    [1307872771:173769][6510/1162996032] CLIENT: Racing replication msg lockout, ignore message.
    [1307872771:231593][6510/1183975744] CLIENT: Ended election with 0, e_th 0, egen 72, flag 0x2a2c, e_fl 0x0, lo_fl 0x1c
    [1307872771:231629][6510/1183975744] CLIENT: election thread is exiting
    [1307872777:443794][6510/1131526464] CLIENT: init connection to site 2.0.0.210:12345 with result 115
    [1307872971:644194][6510/1131526464] CLIENT: init connection to site 2.0.0.210:12345 with result 115
    [1307873165:844583][6510/1131526464] CLIENT: init connection to site 2.0.0.210:12345 with result 115
    [1307873360:44955][6510/1131526464] CLIENT: init connection to site 2.0.0.210:12345 with result 115
    [1307873554:245347][6510/1131526464] CLIENT: init connection to site 2.0.0.210:12345 with result 115
    [1307873748:445736][6510/1131526464] CLIENT: init connection to site 2.0.0.210:12345 with result 115
    [1307873942:646117][6510/1131526464] CLIENT: init connection to site 2.0.0.210:12345 with result 115
    [1307874136:846509][6510/1131526464] CLIENT: init connection to site 2.0.0.210:12345 with result 115
    .... and infinite stay to this situation
    My question is why the Master is suddenly transformed into CLIENT and why it's never returning to the MASTER
    Thanks in advance ...
    here is the log for the client
    [1307872315:455113][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type log, LSN [21][984396]
    [1307872315:455134][1282/1160603968] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type log, LSN [21][984483] perm
    [1307872315:609962][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type bulk_log, LSN [21][984733] perm
    [1307872315:764958][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type bulk_log, LSN [21][984986] perm
    [1307872315:919962][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type bulk_log, LSN [21][985238] perm
    [1307872316:75018][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type bulk_log, LSN [21][985491] perm
    [1307872316:229959][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type bulk_log, LSN [21][985741] perm
    [1307872316:384949][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type bulk_log, LSN [21][985993] perm
    [1307872316:499899][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type bulk_log, LSN [21][986141] perm
    [1307872316:539895][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type log, LSN [21][986221]
    [1307872316:540078][1282/1171093824] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type log, LSN [21][986307]
    [1307872316:540100][1282/1160603968] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type log, LSN [21][986394] perm
    [1307872316:694950][1282/1171093824] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type bulk_log, LSN [21][986648] perm
    [1307872316:847349][1282/1129134400] MASTER: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 70 eid -1, type log, LSN [21][946345]
    [1307872316:847698][1282/1171093824] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type dupmaster, LSN [0][0]
    [1307872316:847999][1282/1181583680] MASTER: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type newclient, LSN [0][0]
    [1307872316:848168][1282/1171093824] MASTER: rep_start: Found old version log 17
    [1307872316:848222][1282/1181583680] CLIENT: Racing replication msg lockout, ignore message.
    [1307872316:848398][1282/1171093824] CLIENT: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 70 eid -1, type newclient, LSN [0][0] nobuf
    [1307872316:848504][1282/1192073536] CLIENT: starting election thread
    [1307872316:848542][1282/1192073536] CLIENT: Start election nsites 2, ack 1, priority 100
    [1307872316:848566][1282/1192073536] CLIENT: Election thread owns egen 71
    [1307872316:849634][1282/1192073536] CLIENT: Tallying VOTE1[0] (2147483647, 71)
    [1307872316:849654][1282/1192073536] CLIENT: Beginning an election
    [1307872316:849680][1282/1192073536] CLIENT: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 70 eid -1, type vote1, LSN [21][946437] nobuf
    [1307872316:851403][1282/1160603968] CLIENT: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type vote1, LSN [21][986728]
    [1307872316:851448][1282/1160603968] CLIENT: Received vote1 egen 69, egen 71
    [1307872316:851470][1282/1160603968] CLIENT: Received old vote 69, egen 71, ignoring vote1
    [1307872316:851481][1282/1160603968] CLIENT: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 70 eid 0, type alive, LSN [21][986728] nobuf
    [1307872316:851538][1282/1171093824] CLIENT: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 68 eid 0, type master_req, LSN [0][0]
    [1307872316:851558][1282/1171093824] CLIENT: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 70 eid 0, type alive, LSN [0][0] nobuf
    [1307872316:854254][1282/1160603968] CLIENT: /opt/bdb/ rep_process_message: msgv = 5 logv 17 gen = 70 eid 0, type vote1, LSN [21][986728]
    [1307872316:854275][1282/1160603968] CLIENT: Received vote1 egen 71, egen 71
    [1307872316:854317][1282/1160603968] CLIENT: Tallying VOTE1[1] (0, 71)
    [1307872316:854339][1282/1160603968] CLIENT: Incoming vote: (eid)0 (pri)100 ELECTABLE (gen)70 (egen)71 [21,986728]
    [1307872316:854353][1282/1160603968] CLIENT: Existing vote: (eid)2147483647 (pri)100 (gen)70 (sites)2 [21,946437]
    [1307872316:854369][1282/1160603968] CLIENT: Accepting new vote
    [1307872316:854379][1282/1160603968] CLIENT: Phase1 election done
    [1307872316:854395][1282/1160603968] CLIENT: Voting for 0
    [1307872316:854407][1282/1160603968] CLIENT: /opt/bdb/ rep_send_message: msgv = 5 logv 17 gen = 70 eid 0, type vote2, LSN [0][0] nobuf
    [1307872317:960344][1282/1192073536] CLIENT: After phase 2: votes 0, nvotes 1, nsites 2
    [1307872317:960389][1282/1192073536] CLIENT: Election finished in 1.111809000 sec
    [1307872317:960401][1282/1192073536] CLIENT: Election done; egen 72
    [1307872317:960412][1282/1192073536] CLIENT: Ended election with -30974, e_th 0, egen 72, flag 0x282c, e_fl 0x0, lo_fl 0x0
    Kill me !!
    --- my source
    on the master I run manually :
    txn_rate 1
    loop_rate 10
    loop 1 20000
    * See the file LICENSE for redistribution information.
    * Copyright (c) 2001, 2010 Oracle and/or its affiliates. All rights reserved.
    * $Id$
    * In this application, we specify all communication via the command line. In
    * a real application, we would expect that information about the other sites
    * in the system would be maintained in some sort of configuration file. The
    * critical part of this interface is that we assume at startup that we can
    * find out
    *      1) what our Berkeley DB home environment is,
    *      2) what host/port we wish to listen on for connections; and
    *      3) an optional list of other sites we should attempt to connect to.
    * These pieces of information are expressed by the following flags.
    * -h home (required; h stands for home directory)
    * -l host:port (required; l stands for local)
    * -C or -M (optional; start up as client or master)
    * -r host:port (optional; r stands for remote; any number of these may be
    *     specified)
    * -R host:port (optional; R stands for remote peer; only one of these may
    * be specified)
    * -a all|quorum (optional; a stands for ack policy)
    * -b (optional; b stands for bulk)
    * -n nsites (optional; number of sites in replication group; defaults to 0
    *     to try to dynamically compute nsites)
    * -p priority (optional; defaults to 100)
    * -v (optional; v stands for verbose)
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <sys/types.h>
    #include <signal.h>
    #include <db_cxx.h>
    #include "RepConfigInfo.h"
    #include "dbc_auto.h"
    using std::cout;
    using std::cin;
    using std::cerr;
    using std::endl;
    using std::ends;
    using std::flush;
    using std::istream;
    using std::istringstream;
    using std::ostringstream;
    using std::string;
    using std::getline;
    #include <stdio.h>
    #include <readline/readline.h>
    #include <readline/history.h>
    #define     CACHESIZE     (10 * 1024 * 1024)
    #define     DATABASE     "quote.db"
    #define     DATABASE2     "quote2.db"
    const char *progname = "excxx_repquote";
    #include <errno.h>
    #ifdef _WIN32
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #define     snprintf          _snprintf
    #define     sleep(s)          Sleep(1000 * (s))
    extern "C" {
    extern int getopt(int, char * const *, const char *);
    extern char *optarg;
    typedef HANDLE thread_t;
    typedef DWORD thread_exit_status_t;
    #define     thread_create(thrp, attr, func, arg)                    \
    (((*(thrp) = CreateThread(NULL, 0,                         \
         (LPTHREAD_START_ROUTINE)(func), (arg), 0, NULL)) == NULL) ? -1 : 0)
    #define     thread_join(thr, statusp)                         \
    ((WaitForSingleObject((thr), INFINITE) == WAIT_OBJECT_0) &&          \
    GetExitCodeThread((thr), (LPDWORD)(statusp)) ? 0 : -1)
    #else /* !_WIN32 */
    #include <pthread.h>
    typedef pthread_t thread_t;
    typedef void* thread_exit_status_t;
    #define     thread_create(thrp, attr, func, arg)                    \
    pthread_create((thrp), (attr), (func), (arg))
    #define     thread_join(thr, statusp) pthread_join((thr), (statusp))
    #endif
    // Struct used to store information in Db app_private field.
    typedef struct {
         bool app_finished;
         bool in_client_sync;
         bool is_master;
         bool no_dummy_wr;
    } APP_DATA;
    static void log(const char *);
    void checkpoint_thread (void );
    void log_archive_thread (void );
    void dummy_write_thread (void );
    class RepQuoteExample {
    public:
         RepQuoteExample();
         void init(RepConfigInfo* config);
         void doloop();
         int terminate();
         static void event_callback(DbEnv* dbenv, u_int32_t which, void *info);
         void print_stocks_size(Db *dbp);
    private:
         // disable copy constructor.
         RepQuoteExample(const RepQuoteExample &);
         void operator = (const RepQuoteExample &);
         // internal data members.
         APP_DATA          app_data;
         RepConfigInfo *app_config;
         DbEnv          cur_env;
         thread_t ckp_thr;
         thread_t lga_thr;
         thread_t dmy_thr;
         // private methods.
         void print_stocks(Db *dbp);
         void print_env(DbEnv *dbenv);
         void prompt();
    RepQuoteExample *g_runner=NULL;
    RepConfigInfo *g_config=NULL;
    class DbHolder {
    public:
         DbHolder(DbEnv env, const char _dbname) : env(env)
              dbp = 0;
              if (_dbname) dbname=_dbname;
              else dbname=DATABASE;
         ~DbHolder() {
         try {
              close();
         } catch (...) {
              // Ignore: this may mean another exception is pending
         bool ensure_open(bool creating) {
         if (dbp)
              return (true);
         dbp = new Db(env, 0);
         u_int32_t flags = DB_AUTO_COMMIT;
         if (creating)
              flags |= DB_CREATE;
         try {
              //dbp->open(NULL, DATABASE, NULL, DB_BTREE, flags, 0);
              //dbp->open(NULL, dbname, NULL, DB_BTREE, flags, 0);
              dbp->open(NULL, NULL, dbname, DB_BTREE, flags, 0);
              return (true);
         } catch (DbDeadlockException e) {
         } catch (DbRepHandleDeadException e) {
         } catch (DbException e) {
              if (e.get_errno() == DB_REP_LOCKOUT) {
              // Just fall through.
              } else if (e.get_errno() == ENOENT && !creating) {
              // Provide a bit of extra explanation.
              log("Stock DB does not yet exist");
              } else
              throw;
         // (All retryable errors fall through to here.)
         log("please retry the operation");
         close();
         return (false);
         void close() {
         if (dbp) {
              try {
              dbp->close(0);
              delete dbp;
              dbp = 0;
              } catch (...) {
              delete dbp;
              dbp = 0;
              throw;
         operator Db *() {
         return dbp;
         Db *operator->() {
         return dbp;
    private:
         Db *dbp;
         DbEnv *env;
         const char *dbname;
    class StringDbt : public Dbt {
    public:
    #define GET_STRING_OK 0
    #define GET_STRING_INVALID_PARAM 1
    #define GET_STRING_SMALL_BUFFER 2
    #define GET_STRING_EMPTY_DATA 3
         int get_string(char **buf, size_t buf_len)
              size_t copy_len;
              int ret = GET_STRING_OK;
              if (buf == NULL) {
                   cerr << "Invalid input buffer to get_string" << endl;
                   return GET_STRING_INVALID_PARAM;
              // make sure the string is null terminated.
              memset(*buf, 0, buf_len);
              // if there is no string, just return.
              if (get_data() == NULL || get_size() == 0)
                   return GET_STRING_OK;
              if (get_size() >= buf_len) {
                   ret = GET_STRING_SMALL_BUFFER;
                   copy_len = buf_len - 1; // save room for a terminator.
              } else
                   copy_len = get_size();
              memcpy(*buf, get_data(), copy_len);
              return ret;
         size_t get_string_length()
              if (get_size() == 0)
                   return 0;
              return strlen((char *)get_data());
         void set_string(char *string)
              set_data(string);
              set_size((u_int32_t)strlen(string));
         StringDbt(char *string) :
         Dbt(string, (u_int32_t)strlen(string)) {};
         StringDbt() : Dbt() {};
         ~StringDbt() {};
         // Don't add extra data to this sub-class since we want it to remain
         // compatible with Dbt objects created internally by Berkeley DB.
    Db *g_repquote=NULL;
    RepQuoteExample::RepQuoteExample() : app_config(0), cur_env(0) {
         app_data.app_finished = 0;
         app_data.in_client_sync = 0;
         app_data.is_master = 0; // assume I start out as client
         app_data.no_dummy_wr = 0 ; //prevent to run dummy write
    int (*old_rep_process_message)
              __P((DB_ENV *, DBT *, DBT *, int, DB_LSN *));
    int my_rep_process_message __P((DB_ENV arg1, DBT arg2, DBT arg3, int arg4, DB_LSN arg5))
         printf("EZ->>> my_rep_process_message:%p\n",arg5);
         old_rep_process_message(arg1,arg2,arg3,arg4,arg5);
    void RepQuoteExample::init(RepConfigInfo *config) {
         app_config = config;
         cur_env.set_app_private(&app_data);
         cur_env.set_errfile(stderr);
         app_data.no_dummy_wr=config->no_dummy_wr;
         if (app_data.no_dummy_wr)
              printf("No dummy !!!\n");
         //EZ->cur_env.set_errpfx(progname);
         cur_env.set_event_notify(event_callback);
         // Configure bulk transfer to send groups of records to clients
         // in a single network transfer. This is useful for master sites
         // and clients participating in client-to-client synchronization.
         if (app_config->bulk)
              cur_env.rep_set_config(DB_REP_CONF_BULK, 1);
         // Set the total number of sites in the replication group.
         // This is used by repmgr internal election processing.
         if (app_config->totalsites > 0)
              cur_env.rep_set_nsites(app_config->totalsites);
         // Turn on debugging and informational output if requested.
         if (app_config->verbose)
              cur_env.set_verbose(DB_VERB_REPLICATION, 1);
         cur_env.set_verbose(DB_VERB_REPMGR_MISC, 1);
         cur_env.set_verbose(DB_VERB_RECOVERY, 1);
         cur_env.set_verbose(DB_VERB_REPLICATION, 1);
         cur_env.set_verbose(DB_VERB_REP_ELECT, 1);
         cur_env.set_verbose(DB_VERB_REP_LEASE, 1);
         cur_env.set_verbose(DB_VERB_REP_SYNC, 1);
         cur_env.set_verbose(DB_VERB_REPMGR_MISC, 1);
         // Set replication group election priority for this environment.
         // An election first selects the site with the most recent log
         // records as the new master. If multiple sites have the most
         // recent log records, the site with the highest priority value
         // is selected as master.
         cur_env.rep_set_priority(app_config->priority);
         // Set the policy that determines how master and client sites
         // handle acknowledgement of replication messages needed for
         // permanent records. The default policy of "quorum" requires only
         // a quorum of electable peers sufficient to ensure a permanent
         // record remains durable if an election is held. The "all" option
         // requires all clients to acknowledge a permanent replication
         // message instead.
         cur_env.repmgr_set_ack_policy(app_config->ack_policy);
         // Set the threshold for the minimum and maximum time the client
         // waits before requesting retransmission of a missing message.
         // Base these values on the performance and load characteristics
         // of the master and client host platforms as well as the round
         // trip message time.
         cur_env.rep_set_request(20000, 500000);
         // Configure deadlock detection to ensure that any deadlocks
         // are broken by having one of the conflicting lock requests
         // rejected. DB_LOCK_DEFAULT uses the lock policy specified
         // at environment creation time or DB_LOCK_RANDOM if none was
         // specified.
         cur_env.set_lk_detect(DB_LOCK_DEFAULT);
         // The following base replication features may also be useful to your
         // application. See Berkeley DB documentation for more details.
         // - Master leases: Provide stricter consistency for data reads
         // on a master site.
         // - Timeouts: Customize the amount of time Berkeley DB waits
         // for such things as an election to be concluded or a master
         // lease to be granted.
         // - Delayed client synchronization: Manage the master site's
         // resources by spreading out resource-intensive client
         // synchronizations.
         // - Blocked client operations: Return immediately with an error
         // instead of waiting indefinitely if a client operation is
         // blocked by an ongoing client synchronization.
         cur_env.repmgr_set_local_site(app_config->this_host.host,
         app_config->this_host.port, 0);
         for ( REP_HOST_INFO *cur = app_config->other_hosts; cur != NULL;
              cur = cur->next) {
              cur_env.repmgr_add_remote_site(cur->host, cur->port,
              NULL, cur->peer ? DB_REPMGR_PEER : 0);
         // Configure heartbeat timeouts so that repmgr monitors the
         // health of the TCP connection. Master sites broadcast a heartbeat
         // at the frequency specified by the DB_REP_HEARTBEAT_SEND timeout.
         // Client sites wait for message activity the length of the
         // DB_REP_HEARTBEAT_MONITOR timeout before concluding that the
         // connection to the master is lost. The DB_REP_HEARTBEAT_MONITOR
         // timeout should be longer than the DB_REP_HEARTBEAT_SEND timeout.
         cur_env.rep_set_timeout(DB_REP_HEARTBEAT_SEND, 5000000);
         cur_env.rep_set_timeout(DB_REP_HEARTBEAT_MONITOR, 10000000);
         // The following repmgr features may also be useful to your
         // application. See Berkeley DB documentation for more details.
         // - Two-site strict majority rule - In a two-site replication
         // group, require both sites to be available to elect a new
         // master.
         // - Timeouts - Customize the amount of time repmgr waits
         // for such things as waiting for acknowledgements or attempting
         // to reconnect to other sites.
         // - Site list - return a list of sites currently known to repmgr.
         // We can now open our environment, although we're not ready to
         // begin replicating. However, we want to have a dbenv around
         // so that we can send it into any of our message handlers.
         cur_env.set_cachesize(0, CACHESIZE, 0);
         cur_env.set_flags(DB_REP_PERMANENT, 1);
         //cur_env.set_flags(DB_TXN_WRITE_NOSYNC, 1);
    /*     u_int32_t maxlocks=300000;
         if (maxlocks != 0)
              cur_env.set_lk_max_locks(maxlocks);
         u_int32_t maxlocks_o=300000;
         if (maxlocks_o != 0)
              cur_env.set_lk_max_objects(maxlocks_o);
         u_int32_t maxmutex=300000;
         if (maxmutex != 0)
              cur_env.mutex_set_max(maxmutex);
         DbEnv          *m_env=&cur_env;
         m_env->set_flags(DB_TXN_NOSYNC, 1);
         m_env->set_lk_max_lockers(60000);
         m_env->set_lk_max_objects(60000);
         m_env->set_lk_max_locks(60000);
         m_env->set_tx_max(60000);
         //m_env->repmgr_set_ack_policy(DB_REPMGR_ACKS_NONE);
         m_env->rep_set_timeout(DB_REP_ACK_TIMEOUT, 50 * 1000); //50ms
         m_env->rep_set_timeout(DB_REP_CHECKPOINT_DELAY, 0);
         //m_env->rep_set_timeout(DB_REP_CONNECTION_RETRY, 30 * 1000 * 1000); // 30 seconds
         m_env->rep_set_timeout(DB_REP_ELECTION_TIMEOUT, 1 * 1000 * 1000); // 5 seconds
         m_env->rep_set_timeout(DB_REP_FULL_ELECTION_TIMEOUT, 5 * 1000 * 1000); // 5 seconds
         m_env->rep_set_timeout(DB_REP_CONNECTION_RETRY, 5 * 1000 * 1000);
         //m_env->rep_set_timeout(DB_REP_ELECTION_RETRY, 10 * 1000 * 1000); //10 seconds
         //m_env->rep_set_timeout(DB_REP_HEARTBEAT_MONITOR, 80 * 1000 * 1000); //80 seconds
         //m_env->rep_set_timeout(DB_REP_HEARTBEAT_SEND, 500 * 1000); //500 milli seconds
         //The minimum number of microseconds a client waits before requesting retransmission
         u_int32_t rep_req_min = 40000; //40 000 microsec = 40 mili
         //The maximum number of microseconds a client waits before requesting retransmission
         u_int32_t rep_req_max = 1280000;// 1 280 000 microsec = 1.28 sec
         u_int32_t rep_limit_gbytes = 0;
         u_int32_t rep_limit_bytes = 100 * 1024 * 1024; // 100MB
         m_env->rep_set_request(rep_req_min, rep_req_max);
         m_env->rep_set_limit(rep_limit_gbytes, rep_limit_bytes);
         cur_env.open(app_config->home, DB_CREATE | DB_RECOVER |
         DB_THREAD | DB_INIT_REP | DB_INIT_LOCK | DB_INIT_LOG |
         DB_INIT_MPOOL | DB_INIT_TXN , 0);
         //keep old function for chain
         //old_rep_process_message=cur_env.get_DB_ENV()->rep_process_message;
         //derouting
         //cur_env.get_DB_ENV()->rep_process_message=my_rep_process_message;
         /*int _i;
         cur_env.log_get_config(DB_LOG_DIRECT, &_i);printf ("DB_LOG_DIRECT = %d\n",_i);
         cur_env.log_get_config(DB_LOG_DSYNC, &_i);printf ("DB_LOG_DSYNC = %d\n",_i);
         cur_env.log_get_config(DB_LOG_AUTO_REMOVE, &_i);printf ("DB_LOG_AUTO_REMOVE = %d\n",_i);
         cur_env.log_get_config(DB_LOG_IN_MEMORY, &_i);printf ("DB_LOG_IN_MEMORY = %d\n",_i);
         cur_env.log_get_config(DB_LOG_ZERO,&_i);printf ("DB_LOG_ZERO = %d\n",_i);
         // Start checkpoint and log archive support threads.
         (void)thread_create(&ckp_thr, NULL, checkpoint_thread, &cur_env);
         (void)thread_create(&lga_thr, NULL, log_archive_thread, &cur_env);
         (void)thread_create(&dmy_thr, NULL, dummy_write_thread, &cur_env);
         cur_env.repmgr_start(3, app_config->start_policy);
    }

    int RepQuoteExample::terminate() {
         try {
              // Wait for checkpoint and log archive threads to finish.
              // Windows does not allow NULL pointer for exit code variable.
              thread_exit_status_t exstat;
              (void)thread_join(lga_thr, &exstat);
              (void)thread_join(ckp_thr, &exstat);
              (void)thread_join(dmy_thr, &exstat);
              // We have used the DB_TXN_NOSYNC environment flag for
              // improved performance without the usual sacrifice of
              // transactional durability, as discussed in the
              // "Transactional guarantees" page of the Reference
              // Guide: if one replication site crashes, we can
              // expect the data to exist at another site. However,
              // in case we shut down all sites gracefully, we push
              // out the end of the log here so that the most
              // recent transactions don't mysteriously disappear.
              cur_env.log_flush(NULL);
              cur_env.close(0);
         } catch (DbException dbe) {
              cout << "error closing environment: " << dbe.what() << endl;
         return 0;
    void RepQuoteExample::prompt() {
         cout << "QUOTESERVER";
         if (!app_data.is_master)
              cout << "(read-only)";
         cout << "> " << flush;
    void log(const char *msg) {
    time_t currentTime;
    // get and print the current time
    time (&currentTime); // fill now with the current time
         char buff[255];
         strncpy(buff,ctime(&currentTime),sizeof(buff));
         char *p;
         for(p =buff ; *p != '\n'; p++);
         *p = '\0';
         cerr << buff << " - " << msg << endl;
    // Simple command-line user interface:
    // - enter "<stock symbol> <price>" to insert or update a record in the
    //     database;
    // - just press Return (i.e., blank input line) to print out the contents of
    //     the database;
    // - enter "quit" or "exit" to quit.
    void RepQuoteExample::doloop() {
         DbHolder dbh1(&cur_env,DATABASE);
         DbHolder dbh2(&cur_env,DATABASE2);
         DbHolder *dbh=&dbh1;
         DbTxn *txn;
         string input;
    bool truncate = false;
         char *c;
         using_history();
         g_repquote=*dbh;
         int loop_rate = 0;
         int txn_rate = 500;
         while (prompt(), /*getline(cin, input)*/c=readline(NULL)) {
              input=std::string(c);
              add_history(c);
              free(c);
              int start_loop = 0;
              int end_loop = 0;
              int start_loop_d = 0;
              int end_loop_d = 0;
              istringstream is(input);
              string token1, token2, token3;
    truncate = false;
    start_loop = 0;
    end_loop = 0;
              // Read 0, 1 or 2 tokens from the input.
              int count = 0;
              if (is >> token1) {
                   count++;
                   if (is >> token2)
                   count++;
                   if (is >> token3)
                   count++;
              if (count == 1) {
         if (token1 == "truncate" ) {
                        truncate = true;     
                   else if (token1 == "env" ){
                        print_env(&cur_env);
                        continue;
         else if (token1 == "verbose" ) {
                        app_config->verbose = !app_config->verbose;
                        if (app_config->verbose)
                             cur_env.set_verbose(DB_VERB_REPLICATION, 1);
                             cur_env.set_verbose(DB_VERB_REPMGR_MISC, 1);
                             cur_env.set_verbose(DB_VERB_RECOVERY, 1);
                             cur_env.set_verbose(DB_VERB_REP_ELECT, 1);
                             cur_env.set_verbose(DB_VERB_REP_LEASE, 1);
                             cur_env.set_verbose(DB_VERB_REP_SYNC, 1);
                             cur_env.set_verbose(DB_VERB_REPMGR_MISC, 1);
                             log("verbose is on");
                        else
                             cur_env.set_verbose(DB_VERB_REPLICATION, 0);
                             cur_env.set_verbose(DB_VERB_REPMGR_MISC, 0);
                             cur_env.set_verbose(DB_VERB_RECOVERY, 0);
                             cur_env.set_verbose(DB_VERB_REP_ELECT, 0);
                             cur_env.set_verbose(DB_VERB_REP_LEASE, 0);
                             cur_env.set_verbose(DB_VERB_REP_SYNC, 0);
                             cur_env.set_verbose(DB_VERB_REPMGR_MISC, 0);
                             log("verbose is off");
                        continue;
         else if (token1 == "print" ) {
                   print_stocks(*dbh);
                        count = 0;      
         else if (token1 == "db1" ) {
                        dbh=&dbh1;
                        g_repquote=*dbh;
                        log( "switch to Db1");
                        count = 0;      
         else if (token1 == "db2" ) {
                        dbh=&dbh2;
                        g_repquote=*dbh;
                        log( "switch to Db2");
                        count = 0;      
                   else if (token1 == "exit" || token1 == "quit") {
                        app_data.app_finished = 1;
                        break;
                   } else {
                        log("Format: <stock> <price>");
                        continue;
    else if (count == 2)
                   if (token1 == "loop_rate" ){
         loop_rate = atoi(token2.c_str());
                        continue;
                   if (token1 == "txn_rate" ){
         txn_rate = atoi(token2.c_str());
                        continue;
    else if (count == 3)
    if (token1 == "loop" ) {
    start_loop = atoi(token2.c_str());
    end_loop = start_loop + atoi(token3.c_str());
    if (token1 == "delete" ) {
    start_loop_d = atoi(token2.c_str());
    end_loop_d = start_loop_d + atoi(token3.c_str());
              // Here we know count is either 0 or 2, so we're about to try a
              // DB operation.
              // Open database with DB_CREATE only if this is a master
              // database. A client database uses polling to attempt
              // to open the database without DB_CREATE until it is
              // successful.
              // This DB_CREATE polling logic can be simplified under
              // some circumstances. For example, if the application can
              // be sure a database is already there, it would never need
              // to open it with DB_CREATE.
              if (!dbh->ensure_open(app_data.is_master))
                   continue;
              try {
                   if (count == 0)
                        if (app_data.in_client_sync)
                             log( "Cannot read data during client initialization - please try again.");
                        else
                             print_stocks_size(*dbh);
                   else if (!app_data.is_master)
                        log("Can't update at client");
                   else {
                        if (truncate)
    u_int32_t no_remove;
                        txn = NULL;
    cur_env.txn_begin(NULL, &txn, DB_TXN_NOWAIT);
                             try
              (*dbh)->truncate(txn, &no_remove, 0);
    // commit
    txn->commit(0);
    txn = NULL;
    } catch (DbException &e) {
    std::cout << "Error on txn commit: " << e.what() << std::endl;
                        //     } catch (DbDeadlockException &) {
                        if (txn != NULL)
                             (void)txn->abort();
    // std::cout << "Error on txn commit: " << std::endl;
    else if (start_loop)
    int j=0;
    for (int i=start_loop; i<=end_loop; i=i+txn_rate)
    //transaction begin
                   txn = NULL;
                   cur_env.txn_begin(NULL, &txn, 0);
    for (j=i; j<=end_loop && j<=(i+txn_rate); j++)
                                  Dbt key, value;
         std::string key1, value1;
         std::stringstream sstrm;
         sstrm << "key" << j << ends;
         key1 = sstrm.str();
                   key.set_data((void *)key1.c_str());
                   key.set_size((u_int32_t)strlen(key1.c_str()));
         sstrm.str("");
         int payload = rand() + j;
                                  sstrm << "price" << payload << ends;
         value1 = sstrm.str();
                   value.set_data((void *)value1.c_str());
                   value.set_size((u_int32_t)strlen(value1.c_str()));
         // Perform the database put
         (*dbh)->put(txn, &key, &value, 0);
                             printf("Kill me !!\n");
                             kill(getpid(),-9);
                             exit(0);
         try
                                  // commit
                        txn->commit(0);
                        txn = NULL;
                   } catch (DbException &e) {
                        std::cout << "Error on txn commit: " << e.what() << std::endl;
                             if (loop_rate>0)
                                  usleep(txn_rate * 1000 * 1000 / loop_rate);
                        else if (start_loop_d)
    int j=0;
    for (int i=start_loop_d; i<=end_loop_d; i=i+100)
    //transaction begin
                   txn = NULL;
                   cur_env.txn_begin(NULL, &txn, 0);
    for (j=i; j<=end_loop_d && j<=(i+100); j++)
                                  Dbt key, value;
         std::string key1, value1;
         std::stringstream sstrm;
         sstrm << "key" << j << ends;
         key1 = sstrm.str();
                   key.set_data((void *)key1.c_str());
                   key.set_size((u_int32_t)strlen(key1.c_str()));
         // Perform the database put
         (*dbh)->del(txn, &key, 0);
         try
                                  // commit
                        txn->commit(0);
                        txn = NULL;
                   } catch (DbException &e) {
                        std::cout << "Error on txn commit: " << e.what() << std::endl;
                        else
                             const char *symbol = token1.c_str();
                             StringDbt key(const_cast<char*>(symbol));
                             const char *price = token2.c_str();
                             StringDbt data(const_cast<char*>(price));
                             (*dbh)->put(NULL, &key, &data, 0);
              } catch (DbDeadlockException e) {
                   log("please retry the operation");
                   dbh->close();
              } catch (DbRepHandleDeadException e) {
                   log("please retry the operation");
                   dbh->close();
              } catch (DbException e) {
                   if (e.get_errno() == DB_REP_LOCKOUT) {
                   log("please retry the operation");
                   dbh->close();
                   } else
                   throw;
         dbh->close();
    void RepQuoteExample::event_callback(DbEnv* dbenv, u_int32_t which, void *info)
         static char buf[256];
         APP_DATA app = (APP_DATA)dbenv->get_app_private();
         info = NULL;          /* Currently unused. */
         switch (which) {
         case DB_EVENT_REP_CLIENT:
              app->is_master = 0;
              app->in_client_sync = 1;
              sprintf(buf,"%s - %s",progname,"CLIENT");
              //EZ->dbenv->set_errpfx(buf);
              log("DB_EVENT_REP_CLIENT.");
              break;
         case DB_EVENT_REP_MASTER:
              app->is_master = 1;
              app->in_client_sync = 0;
              sprintf(buf,"%s - %s",progname,"MASTER");
              //EZ->dbenv->set_errpfx(buf);
              log("DB_EVENT_REP_MASTER.");
              break;
         case DB_EVENT_REP_NEWMASTER:
              log("DB_EVENT_REP_NEWMASTER.");
              app->in_client_sync = 1;
              break;
         case DB_EVENT_REP_PERM_FAILED:
              // Did not get enough acks to guarantee transaction
              // durability based on the configured ack policy. This
              // transaction will be flushed to the master site's
              // local disk storage for durability.
              log("DB_EVENT_REP_PERM_FAILED.");
              log("Insufficient acknowledgements to guarantee transaction durability.");
              break;
         case DB_EVENT_REP_STARTUPDONE:
              app->in_client_sync = 0;
              log("DB_EVENT_REP_STARTUPDONE.");
              break;
         case DB_EVENT_REP_ELECTION_FAILED:
              log("DB_EVENT_REP_ELECTION_FAILED.");
              //g_runner->init(g_config);
              printf("Kill me !!\n");
              kill(getpid(),-9);
              exit(0);
              break;
         case DB_EVENT_REP_DUPMASTER:
              log("DB_EVENT_REP_DUPMASTER.");
              break;
         default:
              dbenv->errx("ignoring event %d", which);
    void RepQuoteExample::print_stocks_size(Db *dbp) {
         DB_BTREE_STAT *statp;
    dbp->stat(NULL, &statp, 0);
         log("db_stat");
    cout << "***************************************** >>>>>>>>>>> : database contains " << (u_long)statp->bt_ndata << " records\n";
    void RepQuoteExample::print_env(DbEnv *dbenv) {
         dbenv->stat_print(DB_STAT_ALL);
    void RepQuoteExample::print_stocks(Db *dbp) {
         StringDbt key, data;
    #define     MAXKEYSIZE     10
    #define     MAXDATASIZE     20
         char keybuf[MAXKEYSIZE + 1], databuf[MAXDATASIZE + 1];
         char kbuf, dbuf;
         memset(&key, 0, sizeof(key));
         memset(&data, 0, sizeof(data));
         kbuf = keybuf;
         dbuf = databuf;
         DbcAuto dbc(dbp, 0, 0);
         cout << "\tSymbol\tPrice" << endl
              << "\t======\t=====" << endl;
    int no_records =0;
         for (int ret = dbc->get(&key, &data, DB_FIRST);
              ret == 0;
              ret = dbc->get(&key, &data, DB_NEXT)) {
              key.get_string(&kbuf, MAXKEYSIZE);
              data.get_string(&dbuf, MAXDATASIZE);
    no_records++;
              cout << "\t" << keybuf << "\t" << databuf << endl;
    cout << "********************** NO Records " << no_records << endl;
         cout << endl << flush;
         dbc.close();
    static void usage() {
         cerr << "usage: " << progname << " -h home -l host:port [-CM]"
         << "[-r host:port][-R host:port]" << endl
         << " [-a all|quorum][-b][-n nsites][-p priority][-v]" << endl;
         cerr << "\t -h home (required; h stands for home directory)" << endl
         << "\t -l host:port (required; l stands for local)" << endl
         << "\t -C or -M (optional; start up as client or master)" << endl
         << "\t -r host:port (optional; r stands for remote; any "
         << "number of these" << endl
         << "\t may be specified)" << endl
         << "\t -R host:port (optional; R stands for remote peer; only "
         << "one of" << endl
         << "\t these may be specified)" << endl
         << "\t -a all|quorum (optional; a stands for ack policy)" << endl
         << "\t -b (optional; b stands for bulk)" << endl
         << "\t -n nsites (optional; number of sites in replication "
         << "group; defaults " << endl
         << "\t     to 0 to try to dynamically compute nsites)" << endl
         << "\t -p priority (optional; defaults to 100)" << endl
         << "\t -v (optional; v stands for verbose)" << endl;
         exit(EXIT_FAILURE);
    int main(int argc, char **argv) {
         RepConfigInfo config;
         char ch, portstr, tmphost;
         int tmpport;
         bool tmppeer;
         config.no_dummy_wr = false;
         // Extract the command line parameters
         while ((ch = getopt(argc, argv, "E:a:bCh:l:Mn:p:R:r:vw")) != EOF) {
              tmppeer = false;
              switch (ch) {
              case 'a':
                   if (strncmp(optarg, "all", 3) == 0)
                        config.ack_policy = DB_REPMGR_ACKS_ALL;
                   else if (strncmp(optarg, "quorum", 6) != 0)
                        usage();
                   break;
              case 'b':
                   config.bulk = true;
                   break;
              case 'C':
                   config.start_policy = DB_REP_CLIENT;
                   break;
              case 'E':
    config.start_policy = DB_REP_ELECTION;
    break;
              case 'h':
                   config.home = optarg;
                   break;
              case 'l':
                   config.this_host.host = strtok(optarg, ":");
                   if ((portstr = strtok(NULL, ":")) == NULL) {
                        cerr << "Bad host specification." << endl;
                        usage();
                   config.this_host.port = (unsigned short)atoi(portstr);
                   config.got_listen_address = true;
                   break;
              case 'M':
                   config.start_policy = DB_REP_MASTER;
                   break;
              case 'n':
                   config.totalsites = atoi(optarg);
                   break;
              case 'p':
                   config.priority = atoi(optarg);
                   break;
              case 'R':
                   tmppeer = true; // FALLTHROUGH
              case 'r':
                   tmphost = strtok(optarg, ":");
                   if ((portstr = strtok(NULL, ":")) == NULL) {
                        cerr << "Bad host specification." << endl;
                        usage();
                   tmpport = (unsigned short)atoi(portstr);
                   config.addOtherHost(tmphost, tmpport, tmppeer);
                   break;
              case 'v':
                   config.verbose = true;
                   break;
              case 'w':
                   config.no_dummy_wr = true;
                   //config.priority = 2;
                   break;
              case '?':
              default:
                   usage();
         // Error check command line.
         if ((!config.got_listen_address) || config.home == NULL)
              usage();
         RepQuoteExample runner;
         g_runner=&runner;
         g_config=&config;
         try {
              runner.init(&config);
              runner.doloop();
         } catch (DbException dbe) {
              cerr << "Caught an exception during initialization or"
                   << " processing: " << dbe.what() << endl;
         runner.terminate();
         return 0;
    // This is a very simple thread that performs checkpoints at a fixed
    // time interval. For a master site, the time interval is one minute
    // plus the duration of the checkpoint_delay timeout (30 seconds by
    // default.) For a client site, the time interval is one minute.
    void checkpoint_thread(void args)
         DbEnv *env;
         APP_DATA *app;
         int i, ret;
         env = (DbEnv *)args;
         app = (APP_DATA *)env->get_app_private();
         for (;;) {
              // Wait for one minute, polling once per second to see if
              // application has finished. When application has finished,
              // terminate this thread.
              for (i = 0; i < 60; i++) {
                   sleep(1);
                   if (app->app_finished == 1)
                        return ((void *)EXIT_SUCCESS);
              // Perform a checkpoint.
              // original line
              if ((ret = env->txn_checkpoint(0, 0, 0)) != 0) {
              //if ((ret = env->txn_checkpoint(0, 0, DB_FORCE)) != 0) {
                   env->err(ret, "Could not perform checkpoint.\n");
                   return ((void *)EXIT_FAILURE);
    // This is a simple log archive thread. Once per minute, it removes all but
    // the most recent 3 logs that are safe to remove according to a call to
    // DBENV->log_archive().
    // Log cleanup is needed to conserve disk space, but aggressive log cleanup
    // can cause more frequent client initializations if a client lags too far
    // behind the current master. This can happen in the event of a slow client,
    // a network partition, or a new master that has not kept as many logs as the
    // previous master.
    // The approach in this routine balances the need to mitigate against a
    // lagging client by keeping a few more of the most recent unneeded logs
    // with the need to conserve disk space by regularly cleaning up log files.
    // Use of automatic log removal (DBENV->log_set_config() DB_LOG_AUTO_REMOVE
    // flag) is not recommended for replication due to the risk of frequent
    // client initializations.
    void log_archive_thread(void args)
         DbEnv *env;
         APP_DATA *app;
         char **begin, **list;
         int i, listlen, logs_to_keep, minlog, ret;
         env = (DbEnv *)args;
         app = (APP_DATA *)env->get_app_private();
         logs_to_keep = 3;
         for (;;) {
              // Wait for one minute, polling once per second to see if
              // application has finished. When application has finished,
              // terminate this thread.
              for (i = 0; i < 60; i++) {
                   sleep(1);
                   if (app->app_finished == 1)
                        return ((void *)EXIT_SUCCESS);
              // Get the list of unneeded log files.
              if ((ret = env->log_archive(&list, DB_ARCH_ABS)) != 0) {
                   env->err(ret, "Could not get log archive list.");
                   return ((void *)EXIT_FAILURE);
              if (list != NULL) {
                   listlen = 0;
                   // Get the number of logs in the list.
                   for (begin = list; *begin != NULL; begin++, listlen++);
                   // Remove all but the logs_to_keep most recent
                   // unneeded log files.
                   minlog = listlen - logs_to_keep;
                   for (begin = list, i= 0; i < minlog; list++, i++) {
                        if ((ret = unlink(*list)) != 0) {
                             env->err(ret,
                             "logclean: remove %s", *list);
                             env->errx(
                             "logclean: Error remove %s", *list);
                             free(begin);
                             return ((void *)EXIT_FAILURE);
                   free(begin);
    #define DATABASE_DUMMY "dummy.db"
    void create_dummy_db(DB_ENV env, DB *dbp)
    DB_ENV *dbenv=env;
    int ret;
    u_int32_t db_flags;
    if ((ret = db_create(dbp, dbenv, 0)) != 0)
    dbenv->err(dbenv, ret, "create_dummy_db: db_create");
    db_flags = DB_AUTO_COMMIT | DB_CREATE;
    //if ((ret = (*dbp)->open(*dbp,NULL, DATABASE, NULL, DB_BTREE, db_flags, 0)) != 0)
    if ((ret = (*dbp)->open(*dbp,NULL, NULL, DATABASE_DUMMY, DB_BTREE, db_flags, 0)) != 0)
    dbenv->err(dbenv, ret, "create_dummy_db: DB->open");
    void reopen_dummy_db(DB_ENV env, DB *dbp)
    DB_ENV *dbenv=env;
    int ret;
    u_int32_t db_flags;
    if ((ret = db_create(dbp, dbenv, 0)) != 0)
    dbenv->err(dbenv, ret, "create_dummy_db: db_create");
    db_flags = DB_AUTO_COMMIT | DB_CREATE;
    //if ((ret = (*dbp)->open(*dbp,NULL, DATABASE, NULL, DB_BTREE, db_flags, 0)) != 0)
    if ((ret = (*dbp)->open(*dbp,NULL, NULL, DATABASE_DUMMY, DB_BTREE, db_flags, 0)) != 0)
    dbenv->err(dbenv, ret, "reopen_dummy_db: DB->open");
    void perform_db_operation(DB_ENV env, DB *dbp, bool bRead)
    //main loop
    //DB *dbp=NULL;
    DB_ENV *dbenv=env;
    int ret;
    u_int32_t db_flags;
    DBT key, data;
    char buf[20]="dummy", *rbuf;
    rbuf=buf;
    if (*dbp == NULL)
    create_dummy_db(dbenv, dbp);
    if (! bRead)
         memset(&key, 0, sizeof(key));
         memset(&data, 0, sizeof(data));
         key.data = buf;
         key.size = (u_int32_t)strlen(buf);
         data.data = rbuf;
         data.size = (u_int32_t)strlen(rbuf);
         if ((ret = (*dbp)->put(*dbp, NULL, &key, &data, 0)) != 0)
              if (ret == DB_REP_HANDLE_DEAD)
                   //create_dummy_db(dbenv, dbp);
                   reopen_dummy_db(dbenv, dbp);
                   (*dbp)->err(*dbp, ret, "DB->put :");
              else
              if (ret != DB_KEYEXIST)
                   (*dbp)->err(*dbp, ret, "perform_db_operation: DB->put");
         else
              DB_BTREE_STAT *statp;
              (*dbp)->stat(*dbp,NULL, &statp, 0);
              std::cout<<"dbp read stats: key#"<< statp->bt_nkeys <<std::endl;
    void dummy_write_thread(void args)
         DbEnv *env;
         APP_DATA *app;
         char **begin, **list;
         int i, listlen, logs_to_keep, minlog, ret;
         DB *m_dbp; // a pointer
         env = (DbEnv *)args;
         app = (APP_DATA *)env->get_app_private();
         logs_to_keep = 3;
         for (;;) {
              if (! app->no_dummy_wr)
                   if (app->is_master)
                   perform_db_operation(env->get_DB_ENV(),&m_dbp,false);
                        //env->txn_checkpoint(0, 0, DB_FORCE);
              usleep(1 * 1000 * 1000);
              else
                   if (app->is_master)
                        //DB *db_quote=g_repquote->get_DB();
                        //perform_db_operation(env->get_DB_ENV(),&db_quote,true);
                        //if (g_repquote)
                        //     g_runner->print_stocks_size(g_repquote);
                        //env->txn_checkpoint(0, 0, DB_FORCE);
                        //perform_db_operation(env->get_DB_ENV(),&m_dbp,false);
                        env->rep_flush();
              usleep(4 * 1000 * 1000);
    my script to simulate the split brain
    #!/bin/sh
    [ -z "$node1" ] && node1=10.10.32.121
    [ -z "$node2" ] && node2=10.10.32.91
    trap myend 0 1 2 3 6 9 14 15
    myend()
         echo "Receive signal to stop test..."
         un_split_brain
         echo "done"
         exit 1
    split_brain()
         echo -n "Split-Brain at node $node..."
         snmpset -m ALL -v 2c -c svil 10.10.0.100 ifAdminStatus.41 i 2 >/dev/null 2>&1
         echo "done"
    un_split_brain()
         echo -n "Undo Split-Brain at node $node..."
         snmpset -m ALL -v 2c -c svil 10.10.0.100 ifAdminStatus.41 i 1 >/dev/null 2>&1
         echo "done"
    is_slave()
         local r=$(ssh root@$1 "tail -2 /tmp/BDB.log" | grep -c CLIENT)
         [ $r -gt 1 ] && ret=1 || ret=0
         return $ret
    is_master()
         local r=$(ssh root@$1 "tail -2 /tmp/BDB.log" | grep -c MASTER)
         [ $r -gt 1 ] && ret=1 || ret=0
         return $ret
    wait_for_master()
         echo -n "Waiting for MASTER at node $node ... "
         is_master $node
         r=$?
         while ( [ ! $r -eq 1 ] )
         do
         usleep 500000
         is_master $node
         r=$?
         echo -n "."
         done
         echo "done"
    wait_for_slave()
         local r
         local tm
         tm=0
         echo -n "Waiting for SLAVE at node $node ... "
         is_slave $node
         r=$?
         while ( [ ! $r -eq 1 ] )
         do
              usleep 500000
              is_slave $node
              r=$?
              echo -n "."
              tm=$((tm+1))
              [ $tm -gt 120 ] && break
         done
         [ $tm -gt 120 ] && ret=0 || ret=1
         echo "done"
         return $ret
    run_test_split_brain()
         local nt
         nt=1
         nfails=0
         x=4
         [ -z "$1" ] && node=$node2
         while ((1))
         do
              printf "*************** TEST [%02d] ********************\n" $nt
              split_brain
              wait_for_master
              x=$((RANDOM%9))
              echo -n " waiting $x sec ..."
              sleep $x
              echo "done"
              un_split_brain
              wait_for_slave
              r=$?
              [ ! $r -eq 1 ] && echo "`date` - test [$nt] - fails ..." || echo "`date` - test [$nt] - OK ."
              [ ! $r -eq 1 ] && nfails=$((nfails+1))
              perc_failure=$(echo "100.0 - $nfails / $nt * 100.0" | bc -l)
              echo "************************************************ [% Success test $perc_failure % ]"
              nt=$((nt+1))
              x=$((RANDOM%9))
              echo -n " waiting $x sec ..."
              sleep $x
         done
    run_test_split_brain
    here is the makefile to run to two environments
    i run:
    - make run
    and in another window sh test_split_brain.sh
    node1?=10.10.32.121
    node2?=10.10.32.91
    nsite?=2
    debug?=0
    all: RepQuoteExampleEric install
    RepConfigInfo.o: RepConfigInfo.cpp RepConfigInfo.h
         g++ -I/usr/local/BerkeleyDB.5.1/include/ -g -O0 -c RepConfigInfo.cpp -o RepConfigInfo.o
    RepQuoteExampleEric: RepQuoteExampleEric.cpp RepConfigInfo.o
         g++ -I/usr/local/BerkeleyDB.5.1/include/ -g -O0 RepQuoteExampleEric.cpp RepConfigInfo.o -o RepQuoteExampleEric -L /usr/local/BerkeleyDB.5.1/lib/ -lreadline -lcurses -ldb_cxx
    kill:
         -ssh -X root@$(node1) "killall -9 /root/RepQuoteExampleEric"
         -ssh -X root@$(node2) "killall -9 /root/RepQuoteExampleEric"
    run: RepQuoteExampleEric kill install clean_env
         ssh -X root@$(node1) "xterm -geom 100x20+100+100 -e \"LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib/ /root/RepQuoteExampleEric -h /opt/bdb/ -l 2.0.0.110:12345 -r 2.0.0.210:12345 -a quorum -b -n $(nsite) -v | tee /tmp/BDB.log\"" &
         ssh -X root@$(node2) "xterm -geom 100x20+800+100 -e \"LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib/ /root/RepQuoteExampleEric -h /opt/bdb/ -l 2.0.0.210:12345 -r 2.0.0.110:12345 -a quorum -b -n $(nsite) -v -w | tee /tmp/BDB.log\"" &
    run_node2: clean_env2
         ssh -X root@$(node2) "xterm -geom 100x20+800+100 -e \"LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib/ /root/RepQuoteExampleEric -h /opt/bdb/ -l 2.0.0.210:12345 -r 2.0.0.110:12345 -a quorum -b -n $(nsite) -v -w | tee /tmp/BDB.log\"" &
    debug_node2: clean_env2
         ssh -X root@$(node2) "xterm -geom 100x20+800+100 -e \"LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib/ /root/RepQuoteExampleEric -h /opt/bdb/ -l 2.0.0.210:12345 -r 2.0.0.110:12345 -a quorum -b -n $(nsite) -v -w | tee /tmp/BDB.log\"" &
         sleep 3
         ssh -X root@$(node2) /sbin/pidof RepQuoteExampleEric >/tmp/pid
         ssh -X root@$(node2) ~/kdbg /root/db-5.1.19/examples/cxx/excxx_repquote/RepQuoteExampleEric -p `cat /tmp/pid`
    run_debug_node1: RepQuoteExampleEric kill install clean_env
         ssh -X root@$(node1) "xterm -geom 100x20+100+100 -e \"LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib/ /root/kdbg /root/RepQuoteExampleEric\" " &
         ssh -X root@$(node2) "xterm -geom 100x20+800+100 -e \"LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib/ /root/RepQuoteExampleEric -h /opt/bdb/ -l 2.0.0.210:12345 -r 2.0.0.110:12345 -a quorum -b -n $(nsite) -v\"" &
    run_debug_node2: RepQuoteExampleEric kill install clean_env
         ssh -X root@$(node1) "xterm -geom 100x20+100+100 -e \"LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib/ /root/RepQuoteExampleEric -h /opt/bdb/ -l 2.0.0.110:12345 -r 2.0.0.210:12345 -a quorum -b -n $(nsite) -v\" " &
         ssh -X root@$(node2) "xterm -geom 100x20+800+100 -e \"LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib/ /root/kdbg /root/RepQuoteExampleEric\"" &
    install: RepQuoteExampleEric
         scp RepQuoteExampleEric root@$(node1):~
         scp RepQuoteExampleEric root@$(node2):~
    clean_env: clean_env1 clean_env2
    clean_env1:
         ssh -X root@$(node1) rm -rf /opt/bdb/*
    clean_env2:
         ssh -X root@$(node2) rm -rf /opt/bdb/*

  • How to Separate Management Servers for Ease of Administration?

    Hello,
    I am fairly new to SCOM, though have been charged with creating a monitoring solution for a particular group of customers and integrating it as far as possible into our existing corporate SCOM implementation, so any help, tips and so on would be greatly
    appreciated. 
    The customer monitoring requirements will be very different to those of our fairly standard corporate environment - we will need to monitor very different technologies, with some systems sat in different domains or a DMZ. Our central servicedesk will still
    need to monitor and action alerts and events for both environments as seamlessly as possible. 
    At the same time, I would like to separate the environments as the configuration of the management servers for the customer environment will be quite different from our corporate one, and I want to avoid having to make changes to all our corporate servers
    every time I need to change something on the customer environment - so things like management pack installs, certificate admin, static DNS config and so on. 
    How would I go about this please? Would it be better to create a separate management group, with servers dedicated to the customer environment, then connect this to the corporate management group so that the servicedesk can still monitor it, or is there
    another way of doing it? Perhaps using resource pools? Time will be a factor here, though ultimately the goal is ease of administration going forward. 
    Thanks

    Using resource pools will not allow you to separate configuration such as MP installs, security, etc. as they are all part of the same management group.  From Technet, "A resource pool is a collection of management servers used to distribute
    work amongst themselves and take over work from a failed member."  If configuration needs to be completely separate from the base configuration perspective, you could use separate connected management groups. 
    Another option is to separate the configuration within the management group.  For example, if you need to monitor SQL computers in your corp environment but not the customer environment, simply create a group containing customer computers and override
    the SQL discovery.  This applies to other technologies as well.  You can even group computers by environment (corp/customer) by using reg key attributes like Kevin Holman describes here: (While my account is being verified
    I can't post links but you can search "Creating custom dynamic computer groups based on registry keys on agents").  If you are familiar with MP authoring, you could create a new MP with a new Windows Computer based class instead of extending
    the Windows Computer class.  From a capabilities perspective, you can certainly monitor corporate, customer, DMZ, and other domains in the same management group.  If the domain is untrusted or in the case of the DMZ, workgroups computers, you can
    utilize gateway servers with certificate authentication which will be configured for each domain/dmz gateway.
    Ease of administration is a tricky concept here...if you utilize separate management groups, administration will have to be handled completely separate in 2 separate consoles.  If there are separate SCOM admins per management group, this is
    of no issue, but if 1 team/person is managing both, this can be difficult.  Alternatively, there will be some up front work to using groups to separate the environments using groups, discoveries, etc.
     

  • Set the descriptio​n value for a step by using the TestStand API

    Hi,
    to read the description of a step there is provided a method:
    Step.GetDescriptionEx
    What about setting this value via API?
    I didn't found any method like 'SetDescriptionEx' !
    Regards,
    Sunny

    There is no set method because the description is dynamically computed by evaluating the DescriptionExpr property of the step's steptype.
    If you want to make a custom step type with a settable description, add a step type subproperty of type string named MyDescription. Then set the step type's Step Description Expression to Step.MyDescription.
    Now, for any instance of your step type, you can set the Step.MyDescription property to change the description.

  • Sample for use of parameters in Forms

    Problem: database has data for several years. i want to select a year to calculate data. the year must be a parameter, the calculation is a program unit. can anayone send me an example how to pass the paramnter (year).
    i'll be glad too with a description "how to solve".

    Hi John & Luis,
    The standard solution is the <i>Application Integrator</i> :
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sapportals.km.docs/documents/a1-8-4/the application integrator in ep 6.0
    A flexible way of providing parameters to it (if the standard options described in the above document are not enough) is to write a <i>Customer Parameter Provider</i> :
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.km.cm.docs/library/ep/how to start transaction iviews with a dynamically computed language.pdf
    Hope that helps,
    Yoav.

  • Use of Parameters in URL iViews

    I'm looking for information/documentation/examples of using parameters in URL iViews.  In particular, I'm hoping that we can pick up some portal runtime info to include as parameters in the URL  for a URL iView.
    For example, here at my customer, Kodak, we plan to have country specific roles.  The US Role will have a US specific Welcome Page which has a URL iView that points to a Content Management document for the US Welcome Page.  The problem is that I could have one US user who's preferred language (and Portal Language Preference) is English and another who's preference is Spanish.  Thus, I would need to point to the correct language version for the user.  To do this, I would like to be able to pick up the language preference in the current Portal session and include it in the URL.
    Is this possible?  Is it standard stuff? What types of user or session context information or parameters can we pick up to use in the target URL of a URL iView and how would I use or code it in the iView.
    Thanks for you help.

    Hi John & Luis,
    The standard solution is the <i>Application Integrator</i> :
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sapportals.km.docs/documents/a1-8-4/the application integrator in ep 6.0
    A flexible way of providing parameters to it (if the standard options described in the above document are not enough) is to write a <i>Customer Parameter Provider</i> :
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.km.cm.docs/library/ep/how to start transaction iviews with a dynamically computed language.pdf
    Hope that helps,
    Yoav.

  • Confused about projects after moving from iPhoto

    Hi
    I recently moved 13k+ photos and 347 projects from iPhoto to A3 primarily for the better editing capabilities of A3.  I shoot for fun , not professionally
    i am reading the A3 manual and their screenshots seem to show another structure in place then mine (see image).
    basically, under the Projects & Albums, I have a duplication of every project that is seen in the Aperture 3 Library, Projects view i.e. a long list of 347 projects  Is this normal?
    if so, I think what is confusing me is why the redundancy since in iPhoto, all i used were Events/Projects and keywords to organize and not sure why each project also appears seperately below in the Projects and Albums section
    I think I understand smart albums and will create using keywords since albums are just a collection of aliases (correct?) so I can create, delete as needed, just like in iTunes
    that being the case, why would I use folders?  often one of my projects could consist of multiple activities (ex. vacation which has hiking, camping, water shots, wildlife, etc) so I am not sure how or why I would use folders.
    I guess I could have a folder labeled Vacations and stick projects in that or could i just also assign a keyword "vacations" and then I could search for photos that are vacations and wildlife?
    If i use folders, then when i import a project, i guess I would need to assign it to a folder?
    Also a project could contain multiple folders and albums?
    maybe i am confused because there too many choices
    thanks for any advice

    Yes, now that we can see your your screenshot it is easier to understand what you are asking. Kirby's brief naming essay will have given you already a very good introduction to the library structure, and I am sure he will elaborate on that when he returns to this thread. Just a few additional pointers  to the different sections of the Inspector window; for coming from iPhoto you might be puzzled; everything seems to be there twice, which can be confusing.
    The upper part of the Inspector panel (With the Heading "Aperture 3 Library and with Projects, Faces, Places, Photos ...) offers different views of your Library: Each view projects (like the vies of a database) the metadata of your images and groups the images in a specific way: in the "Faces View" you can assign names to the faces and browse the images grouped according to persons, in the Places View you assign locations and group according to locations, etc. You use these views for specific tasks.
    The lower part, with the headline "Projects & Albums" organizes your storage structure, like Kirby described in his post.
    A flat structure with 300 projects at the same level will make the access difficult, even if you use smart albums - for you, and or Aperture as well.
    If you think about it, the folder structure is static and created once, when you import your images. That does not need  much processing on Aperture's side when you reopen a Aperture Library.
    The smart albums are dynamic - computed each time you change or assign a metadata tag. And if your smart albums are defined in the scope of the whole library, then each time you change a keyword all of your library has to be processed. So if you are not too fond of watching the beachball spinning, it is wise to be frugal with the use of smart albums and don't use them for tasks that can easily be solved by the static organisation. Also folders can be used to limit the scope of smart albums - why search for images of grizzlies in your Hawaii projects; if all your Alaska projects are contained in one folder, you can define a smart album of bears inside that folder, and thus avoid searching the anniversary images and other vacation shots.
    Bummer - none of the iPhoto keywords seen to have come across
    That really is a bummer - how did you import your iPhoto library?
    Regards
    Léonie

  • Date Type programming

    We need to write an ABAP program, which includes getting access to the Dates in a Transaction.  These Dates are dynamically computed at run time, based on Date Rules, which are created when configuring Date Management in the IMG.  Has anyone does this?  Are there Function Modules, which are delivered to assist?
    The way it works is that a date is entered, such as Start Date, then a Date Rule is chosen for End Date, adn teh system automatically computes the End Date and displays it in the transaction.
    Our specific case is to get to the CRM system Opportunity Milestone dates; however, since IMG Date Management and Configuration is available in all SAP systems, I assume there are also other transactions in other SAP systems (R3, etc) which also dynamically calculate dates based on teh cofigured rules - so that is why I open this question out to anyone who may have been called upon to do similar Date calcluation programming.

    SG_PS_GET_LAST_DAY_OF_MONTH
    BKK_GET_MONTH_LASTDAY     
    SLS_MISC_GET_LAST_DAY_OF_MONTH
    RE_LAST_DAY_OF_MONTH     
    check the above FM's.
    Regards
    vijay

  • Registry Based Discoverying not working

    Good day, I try to discovery a server which has a unique / special registry key (service name) . not sure why the discoverying is not working...
    Here is the xml of the management pack
    <?xml version="1.0" encoding="utf-8"?>
    <ManagementPack SchemaVersion="2.0" ContentReadable="true" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Manifest>
        <Identity>
          <ID>Test.First</ID>
          <Version>1.0.0.12</Version>
        </Identity>
        <Name>Test First</Name>
        <References>
          <Reference Alias="InstanceGroup">
            <ID>Microsoft.SystemCenter.InstanceGroup.Library</ID>
            <Version>7.5.8501.0</Version>
            <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
          </Reference>
          <Reference Alias="SC">
            <ID>Microsoft.SystemCenter.Library</ID>
            <Version>7.0.8433.0</Version>
            <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
          </Reference>
          <Reference Alias="Windows">
            <ID>Microsoft.Windows.Library</ID>
            <Version>7.5.8501.0</Version>
            <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
          </Reference>
          <Reference Alias="Health">
            <ID>System.Health.Library</ID>
            <Version>7.0.8433.0</Version>
            <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
          </Reference>
          <Reference Alias="System">
            <ID>System.Library</ID>
            <Version>7.5.8501.0</Version>
            <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
          </Reference>
        </References>
      </Manifest>
      <TypeDefinitions>
        <EntityTypes>
          <ClassTypes>
            <ClassType ID="Test.First.Group.Servers" Base="InstanceGroup!Microsoft.SystemCenter.InstanceGroup" Accessibility="Public" Abstract="false" Hosted="false" Singleton="true"
    />
            <ClassType ID="Test.First.Class.Role" Base="Windows!Microsoft.Windows.ComputerRole" Accessibility="Public" Abstract="false" Hosted="true" Singleton="false"
    />
          </ClassTypes>
        </EntityTypes>
      </TypeDefinitions>
      <Monitoring>
        <Discoveries>
          <Discovery ID="Test.First.Discovery.Servers" Target="Test.First.Group.Servers" Enabled="true" ConfirmDelivery="false" Remotable="true" Priority="Normal">
            <Category>Discovery</Category>
            <DiscoveryTypes>
              <DiscoveryRelationship TypeID="InstanceGroup!Microsoft.SystemCenter.InstanceGroupContainsEntities" />
            </DiscoveryTypes>
            <DataSource ID="Discovery" TypeID="SC!Microsoft.SystemCenter.GroupPopulator">
              <RuleId>$MPElement$</RuleId>
              <GroupInstanceId>$MPElement[Name="Test.First.Group.Servers"]$</GroupInstanceId>
              <MembershipRules>
                <MembershipRule>
                  <MonitoringClass>$MPElement[Name='Windows!Microsoft.Windows.Computer']$</MonitoringClass>
                  <RelationshipClass>$MPElement[Name="InstanceGroup!Microsoft.SystemCenter.InstanceGroupContainsEntities"]$</RelationshipClass>
                  <Expression>
                    <Contains>
                      <MonitoringClass>$MPElement[Name='Test.First.Class.Role']$</MonitoringClass>
                    </Contains>
                  </Expression>
                </MembershipRule>
              </MembershipRules>
            </DataSource>
          </Discovery>
          <Discovery ID="Test.First.Discovery.Role" Target="Windows!Microsoft.Windows.Computer" Enabled="true" ConfirmDelivery="false" Remotable="true" Priority="Normal">
            <Category>Discovery</Category>
            <DiscoveryTypes>
              <DiscoveryClass TypeID="Test.First.Class.Role" />
            </DiscoveryTypes>
            <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.FilteredRegistryDiscoveryProvider">
              <ComputerName>$Target/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
              <RegistryAttributeDefinitions>
                <RegistryAttributeDefinition>
                  <AttributeName>Installed</AttributeName>
                  <Path>SYSTEM\CurrentControlSet\services\DCM_Bauteiltest</Path>
                  <PathType>0</PathType>
                  <AttributeType>0</AttributeType>
                </RegistryAttributeDefinition>
              </RegistryAttributeDefinitions>
              <Frequency>120</Frequency>
              <ClassId>$MPElement[Name="Test.First.Class.Role"]$</ClassId>
              <InstanceSettings>
                <Settings>
                  <Setting>
                    <Name>$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Name>
                    <Value>$Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
                  </Setting>
                  <Setting>
                    <Name>$MPElement[Name="System!System.Entity"]/DisplayName$</Name>
                    <Value>First Role ($Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$)</Value>
                  </Setting>
                </Settings>
              </InstanceSettings>
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Values/Installed</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">True</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </DataSource>
          </Discovery>
        </Discoveries>
        <Monitors>
          <AggregateMonitor ID="Test.First.Monitor.Services.Availability" Accessibility="Internal" Enabled="true" Target="Test.First.Class.Role" ParentMonitorID="Health!System.Health.AvailabilityState"
    Remotable="true" Priority="Normal">
            <Category>AvailabilityHealth</Category>
            <Algorithm>WorstOf</Algorithm>
          </AggregateMonitor>
          <UnitMonitor ID="Test.First.Monitor.Service.DCM_Bauteiletest" Accessibility="Public" Enabled="true" Target="Test.First.Class.Role" ParentMonitorID="Test.First.Monitor.Services.Availability"
    Remotable="true" Priority="Normal" TypeID="Windows!Microsoft.Windows.CheckNTServiceStateMonitorType" ConfirmDelivery="false" Comment="First DCM_Bauteiletest">
            <Category>AvailabilityHealth</Category>
            <AlertSettings AlertMessage="Test.First.Monitor.Service.DCM_Bauteiletest.AlertMessage">
              <AlertOnState>Error</AlertOnState>
              <AutoResolve>true</AutoResolve>
              <AlertPriority>Normal</AlertPriority>
              <AlertSeverity>Error</AlertSeverity>
              <AlertParameters>
                <AlertParameter1>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetbiosComputerName$</AlertParameter1>
              </AlertParameters>
            </AlertSettings>
            <OperationalStates>
              <OperationalState ID="Running" MonitorTypeStateID="Running" HealthState="Success" />
              <OperationalState ID="NotRunning" MonitorTypeStateID="NotRunning" HealthState="Error" />
            </OperationalStates>
            <Configuration>
              <ComputerName />
              <ServiceName>DCM_Bauteiletest</ServiceName>
              <CheckStartupType />
            </Configuration>
          </UnitMonitor>
        </Monitors>
      </Monitoring>
      <Presentation>
        <Views>
          <View ID="Test.First.View.Alerts" Accessibility="Public" Enabled="true" Target="Test.First.Class.Role" TypeID="SC!Microsoft.SystemCenter.AlertViewType" Visible="true">
            <Category>Custom</Category>
            <Criteria>
              <ResolutionState>
                <StateRange Operator="NotEquals">255</StateRange>
              </ResolutionState>
            </Criteria>
          </View>
          <View ID="Test.First.View.Performance" Accessibility="Public" Enabled="true" Target="Test.First.Class.Role" TypeID="SC!Microsoft.SystemCenter.PerformanceViewType" Visible="true">
            <Category>Custom</Category>
            <Criteria />
          </View>
          <View ID="Test.First.View.Roles" Accessibility="Public" Enabled="true" Target="Test.First.Class.Role" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
            <Category>Custom</Category>
            <Criteria />
            <Presentation>
              <ColumnInfo Index="0" SortIndex="0" Width="100" Grouped="false" Sorted="true" IsSortable="true" Visible="true" SortOrder="Descending">
                <Name>State</Name>
                <Id>Test.First.Class.Role</Id>
              </ColumnInfo>
              <ColumnInfo Index="1" SortIndex="-1" Width="23" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Maintenance Mode</Name>
                <Id>InMaintenanceMode</Id>
              </ColumnInfo>
              <ColumnInfo Index="2" SortIndex="-1" Width="200" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Name</Name>
                <Id>Name</Id>
              </ColumnInfo>
              <ColumnInfo Index="3" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Path</Name>
                <Id>Path</Id>
              </ColumnInfo>
            </Presentation>
          </View>
          <View ID="Test.First.View.Servers" Accessibility="Public" Enabled="true" Target="Test.First.Class.Role" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
            <Category>Custom</Category>
            <Criteria />
            <Presentation>
              <ColumnInfo Index="0" SortIndex="0" Width="100" Grouped="false" Sorted="true" IsSortable="true" Visible="true" SortOrder="Descending">
                <Name>State</Name>
                <Id>Microsoft.Windows.Computer</Id>
              </ColumnInfo>
              <ColumnInfo Index="1" SortIndex="-1" Width="23" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Maintenance Mode</Name>
                <Id>InMaintenanceMode</Id>
              </ColumnInfo>
              <ColumnInfo Index="2" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Name</Name>
                <Id>Name</Id>
              </ColumnInfo>
              <ColumnInfo Index="3" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Path</Name>
                <Id>Path</Id>
              </ColumnInfo>
            </Presentation>
            <Target>$MPElement[Name="Test.First.Group.Servers"]$</Target>
          </View>
        </Views>
        <Folders>
          <Folder ID="Test.First.Folder.Role" Accessibility="Public" ParentFolder="SC!Microsoft.SystemCenter.Monitoring.ViewFolder.Root" />
        </Folders>
        <FolderItems>
          <FolderItem ElementID="Test.First.View.Alerts" Folder="Test.First.Folder.Role" ID="Id_Role_1" />
          <FolderItem ElementID="Test.First.View.Performance" Folder="Test.First.Folder.Role" ID="Id_Role_2" />
          <FolderItem ElementID="Test.First.View.Roles" Folder="Test.First.Folder.Role" ID="Id_Role_3" />
          <FolderItem ElementID="Test.First.View.Servers" Folder="Test.First.Folder.Role" ID="Id_Role_4" />
        </FolderItems>
        <StringResources>
          <StringResource ID="Test.First.Monitor.Service.DCM_Bauteiletest.AlertMessage" />
        </StringResources>
      </Presentation>
      <LanguagePacks>
        <LanguagePack ID="ENU" IsDefault="true">
          <DisplayStrings>
            <DisplayString ElementID="Test.First.Group.Servers">
              <Name>Test First Servers</Name>
              <Description>Test First server group</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.Class.Role">
              <Name>First Server Role</Name>
              <Description>First Server Role</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.Discovery.Servers">
              <Name>Discover First Servers Group</Name>
              <Description>Discover First Servers Group</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.Discovery.Role">
              <Name>First Server Role Discovery</Name>
              <Description>Discovers a First Server role</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.Monitor.Services.Availability">
              <Name>Services</Name>
              <Description>First role services</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.Monitor.Service.DCM_Bauteiletest">
              <Name>First DCM_Bauteiletest</Name>
              <Description>First DCM_Bauteiletest</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.Monitor.Service.DCM_Bauteiletest.AlertMessage">
              <Name>First DCM_Bauteiletest</Name>
              <Description>The First DCM_Bauteiletest Service is not running on host '{0}'.</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.Monitor.Service.DCM_Bauteiletest" SubElementID="Running">
              <Name>Running</Name>
              <Description>Running</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.Monitor.Service.DCM_Bauteiletest" SubElementID="NotRunning">
              <Name>NotRunning</Name>
              <Description>NotRunning</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First">
              <Name>Test First</Name>
              <Description>Monitoring Management Pack: Test First</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.Folder.Role">
              <Name>Test First</Name>
              <Description>Test First root folder</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.View.Alerts">
              <Name>Alerts</Name>
              <Description>Test Enterprise Alert Alerts</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.View.Performance">
              <Name>Performance</Name>
              <Description>Test First Performance</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.View.Roles">
              <Name>Roles</Name>
              <Description>Test Enterprise Alert roles state view</Description>
            </DisplayString>
            <DisplayString ElementID="Test.First.View.Servers">
              <Name>Servers</Name>
              <Description>Test First server state view</Description>
            </DisplayString>
          </DisplayStrings>
          <KnowledgeArticles></KnowledgeArticles>
        </LanguagePack>
      </LanguagePacks>
    </ManagementPack>

    Hello Martin,
    How you create you registry discovery?
    You can follow this blog post to do this: http://blogs.technet.com/b/kevinholman/archive/2009/06/10/creating-custom-dynamic-computer-groups-based-on-registry-keys-on-agents.aspx

Maybe you are looking for