SDS developer guide. Develop distributed and parallel applications in Java. Nathanaël Cottin. version

Similar documents
Android Services. Lecture 4. Operating Systems Practical. 26 October 2016

Lecture on Sensor Networks

Troubleshooting Replication and Geodata Service Issues

Introduction to Computing II (ITI1121) FINAL EXAMINATION

Outline. PeerSim: Informal introduction. Resources. What is PeerSim? Alberto Montresor Gianluca Ciccarelli

Introduction to ArcGIS Server Development

Outline F eria AADL behavior 1/ 78

Actors for Reactive Programming. Actors Origins

Extensibility Patterns: Extension Access

Our Problem. Model. Clock Synchronization. Global Predicate Detection and Event Ordering

CMSC 132, Object-Oriented Programming II Summer Lecture 6:

Lecture 5: Sep. 23 &25

ECEN 651: Microprogrammed Control of Digital Systems Department of Electrical and Computer Engineering Texas A&M University

Java Programming. Final Examination on December 13, 2015 Fall 2015

Distributed Systems Principles and Paradigms

Distributed Algorithms Time, clocks and the ordering of events

Slides for Chapter 14: Time and Global States

1 Trees. Listing 1: Node with two child reference. public class ptwochildnode { protected Object data ; protected ptwochildnode l e f t, r i g h t ;

Distributed Systems Principles and Paradigms. Chapter 06: Synchronization

Figure 10.1 Skew between computer clocks in a distributed system

Design Patterns and Refactoring

13 Concurrent Programming using Tasks and Services

High Performance Computing

Clojure Concurrency Constructs, Part Two. CSCI 5828: Foundations of Software Engineering Lecture 13 10/07/2014

First Design: Weather Station. Observer Design Pattern Event-Driven Design. Motivating Problem. Implementing the First Design (1)

CMSC 132, Object-Oriented Programming II Summer Lecture 12

ArcGIS Enterprise: Administration Workflows STUDENT EDITION

ArcGIS 9 ArcGIS StreetMap Tutorial

Time is an important issue in DS

TECDIS and TELchart ECS Weather Overlay Guide

Yes, the Library will be accessible via the new PULSE and the existing desktop version of PULSE.

Observer Design Pattern Event-Driven Design

Observer Design Pattern Event-Driven Design

Coordination. Failures and Consensus. Consensus. Consensus. Overview. Properties for Correct Consensus. Variant I: Consensus (C) P 1. v 1.

Distributed Computing. Synchronization. Dr. Yingwu Zhu

Account Setup. STEP 1: Create Enhanced View Account

Trivadis Integration Blueprint V0.1

Cuts. Cuts. Consistent cuts and consistent global states. Global states and cuts. A cut C is a subset of the global history of H

Geodatabase: Best Practices. Robert LeClair, Senior Instructor

An object-oriented design process. Weather system description. Layered architecture. Process stages. System context and models of use

cs/ee/ids 143 Communication Networks

ArcGIS Pro: Essential Workflows STUDENT EDITION

Android Security Mechanisms

Sequential Circuit Timing. Young Won Lim 11/6/15

A subtle problem. An obvious problem. An obvious problem. An obvious problem. No!

Geodatabase Best Practices. Dave Crawford Erik Hoel

Matrix Transformation (2A) Young Won Lim 11/10/12

Techniques of Java Programming

Shared Memory vs Message Passing

Robustness the art of preparing for the unexpected

Portal for ArcGIS: An Introduction. Catherine Hynes and Derek Law

Weather Research and Forecasting (WRF) Performance Benchmark and Profiling. July 2012

Leveraging Web GIS: An Introduction to the ArcGIS portal

ON SITE SYSTEMS Chemical Safety Assistant

ArcGIS Enterprise: What s New. Philip Heede Shannon Kalisky Melanie Summers Shreyas Shinde

European Commission STUDY ON INTERIM EVALUATION OF EUROPEAN MARINE OBSERVATION AND DATA NETWORK. Executive Summary

In the Stone Age. Stephan Holzer. Yuval Emek - Technion Roger Wattenhofer - ETH Zürich

On Equilibria of Distributed Message-Passing Games

Lecture 5: Jun. 10, 2015

ST-Links. SpatialKit. Version 3.0.x. For ArcMap. ArcMap Extension for Directly Connecting to Spatial Databases. ST-Links Corporation.

Capacitor and Inductor

Capacitor and Inductor

Object Modeling Approach! Object Modeling Approach!

Lists, Stacks, and Queues (plus Priority Queues)

Efficient Notification Ordering for Geo-Distributed Pub/Sub Systems

Esri UC2013. Technical Workshop.

Chapter 11 Time and Global States

GPS Mapping with Esri s Collector App. What We ll Cover

Administrivia. Course Objectives. Overview. Lecture Notes Week markem/cs333/ 2. Staff. 3. Prerequisites. 4. Grading. 1. Theory and application

Digital Control of Electric Drives

WeatherHub2 Quick Start Guide

Relations (3A) Young Won Lim 3/27/18

Introduction to Programming (Java) 3/12

General CORDIC Description (1A)

Administering your Enterprise Geodatabase using Python. Jill Penney

Clock Synchronization

Section 3.3: Discrete-Event Simulation Examples

Logical Time. 1. Introduction 2. Clock and Events 3. Logical (Lamport) Clocks 4. Vector Clocks 5. Efficient Implementation

Please click the link below to view the YouTube video offering guidance to purchasers:

public void run ( ) { i f ( this. id == 0) System. out. p r i n t ( 3 ) ; bro. j o i n ( ) ; else System. out. p r i n t ( 2 ) ;

Orbit Support Pack for Excel. user manual

Introduction to Portal for ArcGIS. Hao LEE November 12, 2015

CPSA and Formal Security Goals

Recursive InterNetworking Architecture (RINA) Boston University Prototype Programming Manual (version 1.0)

M o n i t o r i n g O c e a n C o l o u r P y t h o n p r o c e d u r e f o r d o w n l o a d

NATO Headquarters The Situation Center GIS experience.

Time in Distributed Systems: Clocks and Ordering of Events

General Vector Space (2A) Young Won Lim 11/4/12

Black-Box Testing Techniques III

CMSC 132, Object-Oriented Programming II Summer Lecture 11:

Troubleshooting Replication and Geodata Services. Liz Parrish & Ben Lin

Frequently Asked Questions

SuperCELL Data Programmer and ACTiSys IR Programmer User s Guide

ArcGIS Enterprise: What s New. Philip Heede Shannon Kalisky Melanie Summers Sam Williamson

Socket Programming. Daniel Zappala. CS 360 Internet Programming Brigham Young University

Blocking Synchronization: Streams Vijay Saraswat (Dec 10, 2012)

Agreement. Today. l Coordination and agreement in group communication. l Consensus

Distributed Architectures

Audio Signal Generation. Young Won Lim 2/2/18

Audio Signal Generation. Young Won Lim 1/29/18

Transcription:

SDS developer guide Develop distributed and parallel applications in Java Nathanaël Cottin sds@ncottin.net http://sds.ncottin.net version 0.0.3

Copyright 2007 - Nathanaël Cottin Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

Abstract This guide is provided to help developers integrate SDS to build distributed and parallel applications as well as mobile agents. Keywords: distributed, parallel, mobile, java

CONTENTS Contents 1 Introduction 2 2 SDS overview 2 3 Daemons discovery 2 3.1 Step 1: daemons references publication............... 3 3.2 Step 2: daemons references list access............... 3 3.3 Step 3: daemons references access.................. 3 3.4 Step 4: daemons references storage................. 5 4 Message delivery steps 6 4.1 Step 1: required architectural components............. 6 4.2 Step 2: distributed object delivery................. 6 4.3 Step 3: distributed object construction............... 6 4.4 Step 4: reference callback...................... 8 4.5 Step 5: recipient reference knowledge................ 8 4.6 Step 6: distributed object call.................... 9 5 SDS security implementation 9 6 Transactional exchanges 9 7 Examples 9 7.1 Feedback distributed algorithm.................. 9 7.1.1 Description.......................... 9 7.1.2 Message tags source code.................. 10 7.1.3 Algorithm implementation source code........... 11 7.1.4 Main program source code.................. 14 8 Known limitations 17 Nathanaël Cottin 1 SDS developer guide

3 DAEMONS DISCOVERY 1 Introduction Simple Distributed system (SDS to be pronounced sudes ) is an open-source Java implementation of a network asynchronous messaging system. It is designed taking scalability, efficiency and security considerations in concern (although version 1.0.0 defines a limited security implementation based on nonces). SDS is primarily developped to build distributed and parallel systems and design mobile agents. This guide refers to SDS version 1.0.0 beta 2. 2 SDS overview SDS is event-driven, which means that distributed objects implementations can perform their tasks while receiving asynchronous messages. SDS defines the following services, depicted by figure 1: A manager used to register distributed objects and collect their network references A daemon called by managers, takes distributed objects life cycle management. Particularly, this service loads and activates distributed objects on its local host (i.e. distant host from managers perspective) and allows to terminate managed distributed objects. 3 Daemons discovery SDS provides two ways to discover daemons using one of a manager s registerdaemons() operations: Giving already known daemons references (not described here) Providing a URL, as described hereafter. SDS managers are able to retrieve daemons references via URLs. A list of root URLs can be set. Each root URL points to a list of references URLs. These references must be updated by daemons when launched. Nathanaël Cottin 2 SDS developer guide

3 DAEMONS DISCOVERY Figure 1: SDS architecture overview 3.1 Step 1: daemons references publication Figure 2 indicates two daemons running on distant hosts (from the main program s perspective) publish their references (using getreference()) on downloadable URLs. These locations (pointing to daemons references) are gathered together in a single URL (one reference URL per line) called references list. Thus this main URL returns two references URLs. Daemons do not implement the singleton design principle. Two or more daemons can run on a single host. 3.2 Step 2: daemons references list access The main program instantiates a manager which consults the references list URL (figure 3). At this stage, the manager knows that two daemons are supposed to be running and owns the URLs to read their references. 3.3 Step 3: daemons references access The manager iterates through the references list URLs to obtain the dameons references (figure 4). Nathanaël Cottin 3 SDS developer guide

3 DAEMONS DISCOVERY Figure 2: Daemons discovery step 1 Figure 3: Daemons discovery step 2 Nathanaël Cottin 4 SDS developer guide

3 DAEMONS DISCOVERY Figure 4: Daemons discovery step 3 3.4 Step 4: daemons references storage The manager locally stores the collected daemons references (adding to previously registered daemons references) and returns a copy back to the caller. Figure 5: Daemons discovery step 4 Nathanaël Cottin 5 SDS developer guide

4 MESSAGE DELIVERY STEPS 4 Message delivery steps Asynchronous and non-blocking message delivery is one of the core concepts of SDS, though it also allows to block until a well-identified message is received. 4.1 Step 1: required architectural components A manager (from sds.services package) has knowledge of a demon s network reference (this is depicted by a dashed line on figure 6). The manager and the daemon may reside on different hosts, as far as the latter are visible (ping succeeds). Furthermore, the manager has read access to a distributed object s bytecode (.class file). The daemon currently waits for interactions with a manager. No distributed object is running the daemon s host. Figure 6: Message delivery step 1 4.2 Step 2: distributed object delivery When the manager is asked to register a distributed object on one of its known daemons, it creates a message containing the distributed object s bytecode and sends it to the specified daemon (figure 7). This message include transactional information as the manager expects a response from the daemon (in step 4). 4.3 Step 3: distributed object construction As depicted by figure 8, the daemon receives a registration request from the manager. It builds the distributed object class and generates an instance. If the distributed object runs as a server, the daemon starts this object on a selected port number. Nathanaël Cottin 6 SDS developer guide

4 MESSAGE DELIVERY STEPS Figure 7: Message delivery step 2 Figure 8: Message delivery step 3 Nathanaël Cottin 7 SDS developer guide

4 MESSAGE DELIVERY STEPS 4.4 Step 4: reference callback The daemon sends a reply to the manager to indicate the activated distributed object s reference (figure 9). The manager, which was waiting for this answer, gives this reference in return of the registration process. Figure 9: Message delivery step 4 4.5 Step 5: recipient reference knowledge Another distributed object able to access the manager s registration result can read this reference (figure 10) to deliver a message to the newly (distant) created distributed object. Figure 10: Message delivery step 5 Note that each distributed object activated by a daemon holds its source manager reference. Nathanaël Cottin 8 SDS developer guide

7 EXAMPLES 4.6 Step 6: distributed object call The distant distributed object is dynamically invoked as far as the message sender provides a valid recipient reference in the transmitted message (figure 11). As all messages deliveries are asynchronous, this message may enclose transactional information if a reply is needed. Figure 11: Message delivery step 6 5 SDS security implementation As is stands, SDS implements security by means of nonces and does not include cryptographic operations on messages. This will be part of a future release. 6 Transactional exchanges Although SDS is asynchronous, it provides the ability to set transactional identifiers to request messages and wait for adequate returned messages. The waiting process can be either synchronous (blocking) or asynchronous (main tasks keep running). 7 Examples 7.1 Feedback distributed algorithm 7.1.1 Description This distributed algorithm aims at transmitting an information to a graph. A special node, called initiator receives a start message from the environment (i.e. Nathanaël Cottin 9 SDS developer guide

7 EXAMPLES main program). The feedback of all other nodes allowes the initiator to inform the environment about transmission process termination. The following tags are used: NEIGHBOURS TAG: used by the manager to send direct neighbours references to each node. INIT TAG: starts the distributed algorithm on a single node (the initiator). This message contains the information to transmit to all nodes. MESSAGE TAG: indicates the information reception (sent by another node). RETURN TAG: when a node has delivered the information to all direct neighbours, it sends this this tag to its parent node (i.e. the node which first sent the information). END TAG: used by the initiator to notify the manager that the information transmission process (the algorithm) is finished. The main operation of this example runs a daemon and creates a feedback manager which connects to the daemon to send 3 feedback servers. This is an all-to-one example and real world applications require to run daemons and managers separately. The source code is available on SDS website (in the examples section). 7.1.2 Message tags source code 1 / Copyright 2007 Nathanael Cottin / package t e s t ; 6 / @author n c o t t i n / public f i n a l class FeedbackTags { 11 public static f i n a l int NEIGHBOURS TAG = 0 ; public static f i n a l int INIT TAG = 1 ; public static f i n a l int MESSAGE TAG = 2 ; public static f i n a l int RETURN TAG = 3 ; public static f i n a l int END TAG = 4 ; 16 Nathanaël Cottin 10 SDS developer guide

7 EXAMPLES 7.1.3 Algorithm implementation source code 1 / Copyright 2007 Nathanael Cottin / 4 package t e s t ; import java. u t i l. C o l l e c t i o n ; import sds. D i s t r i b u t e d S e r v e r O b j e c t ; 9 import sds. data. Message ; import sds. data. Reference ; import sds. e r r o r. SdsException ; 14 19 public f i n a l class FeedbackServer extends D i s t r i b u t e d S e r v e r O b j e c t { private Message initmsg = null ; private C o l l e c t i o n <Reference > remainingneighbours = null ; private Reference parent = null ; private S t r i n g value = null ; public FeedbackServer ( ) { super ( f a l s e ) ; 24 @Override public void execute ( ) { @Override 29 public void p r o c e s s E r r o r ( SdsException e r r o r ) { System. out. p r i n t l n ( Feedback s e r v e r : + g e t R e f e r e n c e ( ) ) ; e r r o r. printstacktrace ( ) ; 34 @SuppressWarnings ( unchecked ) @Override public boolean r e c e i v e ( Message msg) throws SdsException { switch (msg. gettag ( ) ) { case FeedbackTags. NEIGHBOURS TAG: { 39 C o l l e c t i o n <Reference > n = ( C o l l e c t i o n <Reference >) msg. getdata ( ) ; i f ( n!= null ) { remainingneighbours = n ; 44 Reference r e f = g e t R e f e r e n c e ( ) ; Nathanaël Cottin 11 SDS developer guide

7 EXAMPLES System. out. p r i n t l n ( r e f + r e c e i v e d + n. s i z e ( ) + neighbour ( s ) : ) ; for ( Reference r : n ) { System. out. p r i n t l n ( + r e f + > + r ) ; 49 Message tosend = msg. createresponse ( ) ; tosend. settag ( FeedbackTags. NEIGHBOURS TAG) ; d e l i v e r ( tosend, false, getmanager ( ) ) ; 54 // getmanager ( ) i s e q u a l to msg. g e t I s s u e r ( ) // in t h i s p a r t i c u l a r case return true ; case FeedbackTags. INIT TAG : { 59 // Save message ( to keep t r a n s a c t i o n a l information to // n o t i f y the end o f the a l g o r i t h m to t he f e e d b a c k manager ) // Please r e f e r to RETURN TAG case f o r initmsg use initmsg = msg ; value = ( S t r i n g ) msg. getdata ( ) ; 64 System. out. p r i n t l n ( g e t R e f e r e n c e ( ) + i n i t i a t e d \ + value + \ ) ; Message tosend = new Message ( ) ; tosend. settag ( FeedbackTags.MESSAGE TAG) ; tosend. setdata ( value ) ; 69 d e l i v e r ( tosend, false, remainingneighbours ) ; return true ; case FeedbackTags.MESSAGE TAG: { Message tosend = msg. createresponse ( ) ; 74 synchronized ( this ) { remainingneighbours. remove (msg. g e t I s s u e r ( ) ) ; i f ( value!= null ) { tosend. settag ( FeedbackTags.RETURN TAG) ; d e l i v e r ( tosend, false, msg. g e t I s s u e r ( ) ) ; 79 return true ; // Receiving v a l u e f o r the f i r s t time value = ( S t r i n g ) msg. getdata ( ) ; 84 System. out. p r i n t l n ( g e t R e f e r e n c e ( ) + r e c e i v e d + \ ) ; parent = msg. g e t I s s u e r ( ) ; 89 i f ( remainingneighbours. isempty ( ) ) { tosend. settag ( FeedbackTags.RETURN TAG) ; \ + value Nathanaël Cottin 12 SDS developer guide

7 EXAMPLES d e l i v e r (msg, false, parent ) ; return true ; 94 tosend. settag ( FeedbackTags.MESSAGE TAG) ; tosend. setdata ( value ) ; d e l i v e r ( tosend, false, remainingneighbours ) ; return true ; 99 case FeedbackTags.RETURN TAG: { boolean empty ; synchronized ( this ) { remainingneighbours. remove (msg. g e t I s s u e r ( ) ) ; 104 empty = remainingneighbours. isempty ( ) ; i f ( empty ) { i f ( parent == null ) { 109 // Respond to f e e d b a c k manager s i n i t i a l message Message tosend = initmsg. createresponse ( ) ; tosend. settag ( FeedbackTags.END TAG) ; d e l i v e r ( tosend, false, getmanager ( ) ) ; 114 else { Message tosend = msg. createresponse ( ) ; tosend. settag ( FeedbackTags.RETURN TAG) ; d e l i v e r ( tosend, false, parent ) ; 119 return true ; default : 124 return f a l s e ; @Override 129 public void t e r m i n a t e S e r v e r ( ) { Please note that distributed objects (graph nodes) are server-orientedas they must handle messages sent by other nodes. Nathanaël Cottin 13 SDS developer guide

7 EXAMPLES 7.1.4 Main program source code 1 / Copyright 2007 Nathanael Cottin / 4 package t e s t ; import java. u t i l. C o l l e c t i o n ; import java. u t i l. HashSet ; 9 import sds. data. Message ; import sds. data. Reference ; import sds. e r r o r. SdsException ; import sds. more. M i s c e l l a n e o u s ; import sds. s e r v i c e. Daemon ; 14 import sds. s e r v i c e. Manager ; public f i n a l c l a s s FeedbackManager extends Manager { private f i n a l boolean [ ] [ ] neighbours ; 19 private f i n a l Reference daemon ; public FeedbackManager ( boolean [ ] [ ] neighbours, Reference daemon ) { super ( f a l s e ) ; this. neighbours = neighbours ; 24 this. daemon = daemon ; @Override public void execute ( ) { 29 System. out. p r i n t l n ( Executing FeedbackManager : + g e t R e f e r e n c e ( ) ) ; System. out. p r i n t l n ( R e g i s t e r i n g + neighbours. l e n g t h + i n s t a n c e ( s ) ) ; C o l l e c t i o n <Reference > i n v a l i d R e f ; 34 try { i n v a l i d R e f = r e g i s t e r ( FeedbackServer. class, neighbours. length, true, daemon ) ; catch ( SdsException e ) { 39 p r o c e s s E r r o r ( e ) ; return ; System. out. p r i n t l n ( I n v a l i d r e f e r e n c e s : + i n v a l i d R e f. s i z e ( ) ) ; 44 for ( Reference r : i n v a l i d R e f ) { Nathanaël Cottin 14 SDS developer guide

7 EXAMPLES System. out. p r i n t l n ( r ) ; System. out. p r i n t l n ( \n \n ) ; 49 C o l l e c t i o n <Reference > r e f = g e t D i s t r i b u t e d O b j e c t R e f e r e n c e s ( FeedbackServer. class ) ; System. out. p r i n t l n ( R e g i s t e r e d r e f e r e n c e s : + r e f. s i z e ( ) ) ; for ( Reference r : r e f ) { System. out. p r i n t l n ( r ) ; 54 System. out. p r i n t l n ( \n \n ) ; Reference [ ] r e f s = M i s c e l l a n e o u s. toarray ( r e f ) ; System. out. p r i n t l n ( Sending neighbourhood to + r e f s. l e n g t h 59 + d i s t r i b u t e d o b j e c t ( s ) ) ; for ( int i = 0 ; i < r e f s. l e ngth ; i ++) { sendneighbours ( r e f s [ i ], getneighbours ( r e f s, neighbours [ i ] ) ) ; 64 System. out. p r i n t l n ( \n \n ) ; System. out. p r i n t l n ( I n i t i a l i z i n g algorithm ) ; Message msg = new Message ( ) ; msg. settag ( FeedbackTags. INIT TAG ) ; msg. setdata ( Message to d e l i v e r ) ; 69 d e l i v e r (msg, true, r e f s [ 0 ] ) ; System. out. p r i n t l n ( \n \n ) ; System. out. p r i n t l n ( End : k i l l i n g a l l d i s t a n t p r o c e s s e s ) ; k i l l A l l ( f a l s e ) ; 74 @Override public void p r o c e s s E r r o r ( SdsException e r r o r ) { System. out. p r i n t l n ( FeedbackManager encountered the f o l l o w i n g e r r o r : ) ; 79 e r r o r. printstacktrace ( ) ; @Override public boolean recv ( Message msg) throws SdsException { 84 switch (msg. gettag ( ) ) { case FeedbackTags. NEIGHBOURS TAG: // Response to b l o c k i n g neighbours d e l i v e r y return true ; case FeedbackTags. END TAG: { 89 // Response to b l o c k i n g d i s t r i b u t e d a l g o r i t h m e x e c u t i o n return true ; Nathanaël Cottin 15 SDS developer guide

7 EXAMPLES default : return f a l s e ; 94 private void sendneighbours ( Reference r e c i p i e n t, C o l l e c t i o n <Reference > n ) { 99 Message msg = new Message ( ) ; msg. settag ( FeedbackTags.NEIGHBOURS TAG) ; msg. setdata ( n ) ; d e l i v e r (msg, true, r e c i p i e n t ) ; 104 private C o l l e c t i o n <Reference > getneighbours ( Reference [ ] r e f s, boolean [ ] n ) { C o l l e c t i o n <Reference > r e s = new HashSet<Reference >(n. l e n g t h ) ; for ( int i = 0 ; i < n. l e n g t h ; i ++) { 109 i f ( n [ i ] ) { r e s. add ( r e f s [ i ] ) ; 114 return r e s ; @Override public void t e r m i n a t e S e r v e r ( ) { 119 public static void main ( S t r i n g [ ] args ) { try { // Graph i n c i d e n c e matrix with 3 nodes 124 boolean [ ] [ ] neighbours = { { false, true, f a l s e, { true, false, true, { true, false, f a l s e ; // Launch daemon on l o c a l h o s t and p o rt 666, and s e t d i s t r i b u t e d // o b j e c t s p o r t s from 1001 to 1004 129 Daemon daemon = new Daemon( false, 1001, 1001 + neighbours. length, Daemon. DEFAULT FIRST ID ) ; daemon. run (666, true ) ; Reference daemonreference = daemon. g e t R e f e r e n c e ( ) ; 134 FeedbackManager mgr = new FeedbackManager ( neighbours, daemonreference ) ; mgr. registerdaemons ( daemonreference ) ; Nathanaël Cottin 16 SDS developer guide

8 KNOWN LIMITATIONS mgr. run ( 1 0 0 0 ) ; 139 // Also terminate manager and daemon to l e a v e p r o p e r l y mgr. terminate ( ) ; daemon. terminate ( ) ; catch ( Exception e ) { 144 e. printstacktrace ( ) ; 8 Known limitations Please refer to SDS official website at http://sds.ncottin.net. Nathanaël Cottin 17 SDS developer guide