pione 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +14 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +94 -0
- data/Rakefile +118 -0
- data/bin/pione-broker +5 -0
- data/bin/pione-clean +5 -0
- data/bin/pione-client +5 -0
- data/bin/pione-eval +111 -0
- data/bin/pione-relay +5 -0
- data/bin/pione-relay-account-db +5 -0
- data/bin/pione-relay-client-db +5 -0
- data/bin/pione-search-log +30 -0
- data/bin/pione-syntax-checker +5 -0
- data/bin/pione-task-worker +5 -0
- data/bin/pione-tuple-space-provider +5 -0
- data/bin/pione-tuple-space-receiver +5 -0
- data/bin/pione-tuple-space-viewer +5 -0
- data/demo/demo.rb +311 -0
- data/demo/public/base.css +94 -0
- data/demo/public/demo.js +107 -0
- data/demo/public/index.html +91 -0
- data/demo/public/jquery-1.8.3.min.js +2 -0
- data/example/CountChar/CountChar.pione +64 -0
- data/example/CountChar/misc/CountChar.rb +22 -0
- data/example/CountChar/text/aidokushono_insho.txt +32 -0
- data/example/CountChar/text/aikokuka_shokan.txt +108 -0
- data/example/CountChar/text/carlyle_hakubutsukan.txt +58 -0
- data/example/CountChar/text/dark_minister.txt +2440 -0
- data/example/CountChar/text/kaikano_otto.txt +61 -0
- data/example/CountChar/text/kaikon.txt +30 -0
- data/example/CountChar/text/nagashimano_shi.txt +45 -0
- data/example/CountChar/text/saikachibuchi.txt +80 -0
- data/example/CountChar/text/saikonihonno_josei.txt +91 -0
- data/example/CountChar/text/taishojugonenno_bundan.txt +21 -0
- data/example/FeatureExample/FeatureExample.pione +7 -0
- data/example/Fib/Fib.pione +56 -0
- data/example/Fib/FibBC.pione +56 -0
- data/example/HelloWorld/HelloWorld.pione +5 -0
- data/example/LucasNumber/LucasNumber.pione +64 -0
- data/example/MakePair/MakePair.pione +14 -0
- data/example/MakePair/data/1.i +0 -0
- data/example/MakePair/data/2.i +0 -0
- data/example/MakePair/data/3.i +0 -0
- data/example/MakePair/data/4.i +0 -0
- data/example/MakePair/data/5.i +0 -0
- data/example/SieveOfEratosthenes/SieveOfEratosthenes.pione +61 -0
- data/example/SingleParticlesWithRef/Makefile +289 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRef.Makefile +153 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRef.pione +116 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRefFull.pione +400 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift.pdb +3381 -0
- data/example/SingleParticlesWithRef/data/all.ref2d +0 -0
- data/example/SingleParticlesWithRef/data/all.ref3d +0 -0
- data/example/Sum/Sum.pione +52 -0
- data/example/SyntaxError/call_rule_error.pione +6 -0
- data/example/SyntaxError/feature_line_error.pione +7 -0
- data/example/SyntaxError/flow_block_error.pione +5 -0
- data/example/SyntaxError/input_line_error.pione +6 -0
- data/example/SyntaxError/invalid_rule_name.pione +6 -0
- data/example/SyntaxError/param_line_error.pione +7 -0
- data/example/SyntaxError/variable-binding-error.pione +11 -0
- data/lib/pione.rb +241 -0
- data/lib/pione/agent/basic-agent.rb +333 -0
- data/lib/pione/agent/broker.rb +274 -0
- data/lib/pione/agent/command-listener.rb +47 -0
- data/lib/pione/agent/input-generator.rb +194 -0
- data/lib/pione/agent/logger.rb +65 -0
- data/lib/pione/agent/process-manager.rb +38 -0
- data/lib/pione/agent/rule-provider.rb +64 -0
- data/lib/pione/agent/task-worker.rb +274 -0
- data/lib/pione/agent/trivial-routine-worker.rb +28 -0
- data/lib/pione/agent/tuple-space-client.rb +146 -0
- data/lib/pione/agent/tuple-space-server-client-life-checker.rb +29 -0
- data/lib/pione/command-option/basic-option.rb +42 -0
- data/lib/pione/command-option/child-process-option.rb +17 -0
- data/lib/pione/command-option/common-option.rb +29 -0
- data/lib/pione/command-option/daemon-option.rb +12 -0
- data/lib/pione/command-option/presence-notifier-option.rb +15 -0
- data/lib/pione/command-option/task-worker-owner-option.rb +17 -0
- data/lib/pione/command-option/tuple-space-provider-option.rb +26 -0
- data/lib/pione/command-option/tuple-space-provider-owner-option.rb +16 -0
- data/lib/pione/command-option/tuple-space-receiver-option.rb +12 -0
- data/lib/pione/command/basic-command.rb +126 -0
- data/lib/pione/command/child-process.rb +43 -0
- data/lib/pione/command/daemon-process.rb +18 -0
- data/lib/pione/command/front-owner-command.rb +37 -0
- data/lib/pione/command/pione-broker.rb +53 -0
- data/lib/pione/command/pione-clean.rb +16 -0
- data/lib/pione/command/pione-client.rb +273 -0
- data/lib/pione/command/pione-relay-account-db.rb +85 -0
- data/lib/pione/command/pione-relay-client-db.rb +80 -0
- data/lib/pione/command/pione-relay.rb +47 -0
- data/lib/pione/command/pione-syntax-checker.rb +103 -0
- data/lib/pione/command/pione-task-worker.rb +123 -0
- data/lib/pione/command/pione-tuple-space-provider.rb +87 -0
- data/lib/pione/command/pione-tuple-space-receiver.rb +55 -0
- data/lib/pione/command/pione-tuple-space-viewer.rb +151 -0
- data/lib/pione/command/tuple-space-provider-owner.rb +6 -0
- data/lib/pione/front/basic-front.rb +64 -0
- data/lib/pione/front/broker-front.rb +30 -0
- data/lib/pione/front/client-front.rb +28 -0
- data/lib/pione/front/relay-front.rb +19 -0
- data/lib/pione/front/task-worker-front.rb +16 -0
- data/lib/pione/front/task-worker-owner.rb +42 -0
- data/lib/pione/front/tuple-space-provider-front.rb +22 -0
- data/lib/pione/front/tuple-space-provider-owner.rb +11 -0
- data/lib/pione/front/tuple-space-receiver-front.rb +18 -0
- data/lib/pione/model/assignment.rb +89 -0
- data/lib/pione/model/basic-model.rb +395 -0
- data/lib/pione/model/binary-operator.rb +80 -0
- data/lib/pione/model/block.rb +233 -0
- data/lib/pione/model/boolean.rb +138 -0
- data/lib/pione/model/call-rule.rb +69 -0
- data/lib/pione/model/data-expr.rb +360 -0
- data/lib/pione/model/feature-expr.rb +794 -0
- data/lib/pione/model/float.rb +107 -0
- data/lib/pione/model/integer.rb +140 -0
- data/lib/pione/model/list.rb +104 -0
- data/lib/pione/model/message.rb +80 -0
- data/lib/pione/model/package.rb +48 -0
- data/lib/pione/model/parameters.rb +282 -0
- data/lib/pione/model/rule-expr.rb +120 -0
- data/lib/pione/model/rule-io.rb +166 -0
- data/lib/pione/model/rule.rb +294 -0
- data/lib/pione/model/string.rb +111 -0
- data/lib/pione/model/undefined-value.rb +24 -0
- data/lib/pione/model/variable-table.rb +315 -0
- data/lib/pione/model/variable.rb +87 -0
- data/lib/pione/parser/block-parser.rb +83 -0
- data/lib/pione/parser/common-parser.rb +145 -0
- data/lib/pione/parser/document-parser.rb +58 -0
- data/lib/pione/parser/error-message.yml +4 -0
- data/lib/pione/parser/expr-parser.rb +266 -0
- data/lib/pione/parser/feature-expr-parser.rb +105 -0
- data/lib/pione/parser/flow-element-parser.rb +181 -0
- data/lib/pione/parser/literal-parser.rb +182 -0
- data/lib/pione/parser/rule-definition-parser.rb +163 -0
- data/lib/pione/parser/syntax-error.rb +61 -0
- data/lib/pione/patch/array-patch.rb +3 -0
- data/lib/pione/patch/drb-patch.rb +467 -0
- data/lib/pione/patch/monitor-patch.rb +16 -0
- data/lib/pione/patch/rinda-patch.rb +759 -0
- data/lib/pione/patch/uri-patch.rb +66 -0
- data/lib/pione/relay/receiver-socket.rb +69 -0
- data/lib/pione/relay/relay-account-db.rb +55 -0
- data/lib/pione/relay/relay-client-db.rb +53 -0
- data/lib/pione/relay/relay-socket.rb +215 -0
- data/lib/pione/relay/trampoline.rb +22 -0
- data/lib/pione/relay/transmitter-socket.rb +167 -0
- data/lib/pione/resource/basic-resource.rb +92 -0
- data/lib/pione/resource/dropbox-resource.rb +106 -0
- data/lib/pione/resource/ftp.rb +84 -0
- data/lib/pione/resource/local.rb +113 -0
- data/lib/pione/rule-handler/action-handler.rb +184 -0
- data/lib/pione/rule-handler/basic-handler.rb +217 -0
- data/lib/pione/rule-handler/flow-handler.rb +339 -0
- data/lib/pione/rule-handler/root-handler.rb +23 -0
- data/lib/pione/rule-handler/system-handler.rb +13 -0
- data/lib/pione/system/common.rb +22 -0
- data/lib/pione/system/config.rb +20 -0
- data/lib/pione/system/document.rb +81 -0
- data/lib/pione/system/file-cache.rb +150 -0
- data/lib/pione/system/global.rb +346 -0
- data/lib/pione/system/identifier.rb +61 -0
- data/lib/pione/system/init.rb +16 -0
- data/lib/pione/system/object.rb +35 -0
- data/lib/pione/transformer/block-transformer.rb +23 -0
- data/lib/pione/transformer/document-transformer.rb +36 -0
- data/lib/pione/transformer/expr-transformer.rb +89 -0
- data/lib/pione/transformer/feature-expr-transformer.rb +56 -0
- data/lib/pione/transformer/flow-element-transformer.rb +66 -0
- data/lib/pione/transformer/literal-transformer.rb +76 -0
- data/lib/pione/transformer/rule-definition-transformer.rb +62 -0
- data/lib/pione/transformer/transformer-module.rb +37 -0
- data/lib/pione/tuple-space/data-finder.rb +165 -0
- data/lib/pione/tuple-space/presence-notifier.rb +83 -0
- data/lib/pione/tuple-space/relay.rb +9 -0
- data/lib/pione/tuple-space/tuple-space-provider.rb +85 -0
- data/lib/pione/tuple-space/tuple-space-receiver.rb +140 -0
- data/lib/pione/tuple-space/tuple-space-server-interface.rb +60 -0
- data/lib/pione/tuple-space/tuple-space-server.rb +156 -0
- data/lib/pione/tuple-space/update-criteria.rb +96 -0
- data/lib/pione/tuple/agent-tuple.rb +10 -0
- data/lib/pione/tuple/attribute-tuple.rb +7 -0
- data/lib/pione/tuple/base-uri-tuple.rb +9 -0
- data/lib/pione/tuple/basic-tuple.rb +317 -0
- data/lib/pione/tuple/bye-tuple.rb +9 -0
- data/lib/pione/tuple/command-tuple.rb +9 -0
- data/lib/pione/tuple/data-tuple.rb +18 -0
- data/lib/pione/tuple/dry-run-tuple.rb +8 -0
- data/lib/pione/tuple/exception-tuple.rb +11 -0
- data/lib/pione/tuple/finished-tuple.rb +17 -0
- data/lib/pione/tuple/foreground-tuple.rb +7 -0
- data/lib/pione/tuple/log-tuple.rb +14 -0
- data/lib/pione/tuple/process-info-tuple.rb +9 -0
- data/lib/pione/tuple/request-rule-tuple.rb +9 -0
- data/lib/pione/tuple/rule-tuple.rb +10 -0
- data/lib/pione/tuple/shift-tuple.rb +13 -0
- data/lib/pione/tuple/task-tuple.rb +36 -0
- data/lib/pione/tuple/task-worker-resource-tuple.rb +9 -0
- data/lib/pione/tuple/working-tuple.rb +13 -0
- data/lib/pione/uri-scheme/basic-scheme.rb +40 -0
- data/lib/pione/uri-scheme/broadcast-scheme.rb +11 -0
- data/lib/pione/uri-scheme/dropbox-scheme.rb +9 -0
- data/lib/pione/uri-scheme/local-scheme.rb +28 -0
- data/lib/pione/util/error-report.rb +12 -0
- data/lib/pione/util/log.rb +79 -0
- data/lib/pione/util/message.rb +155 -0
- data/lib/pione/util/misc.rb +73 -0
- data/lib/pione/util/terminal.rb +78 -0
- data/lib/pione/util/waiter-table.rb +53 -0
- data/lib/pione/version.rb +3 -0
- data/misc/env.sh +2 -0
- data/misc/test-drb-stop-service.rb +34 -0
- data/misc/test-ensure-and-thread-kill.rb +40 -0
- data/misc/test-many-waiters-client.rb +56 -0
- data/misc/test-many-waiters-server.rb +14 -0
- data/misc/write_and_take_test.png +0 -0
- data/misc/write_and_take_test.rb +36 -0
- data/pione.gemspec +49 -0
- data/test/agent/spec_basic-agent.rb +170 -0
- data/test/agent/spec_broker.rb +36 -0
- data/test/agent/spec_command-listener.rb +30 -0
- data/test/agent/spec_input-generator.rb +123 -0
- data/test/agent/spec_logger.rb +71 -0
- data/test/agent/spec_rule-provider.rb +65 -0
- data/test/agent/spec_task-worker.rb +307 -0
- data/test/agent/spec_tuple-space-client.rb +30 -0
- data/test/model/spec_assignment.rb +51 -0
- data/test/model/spec_binary-operator.rb +39 -0
- data/test/model/spec_block.rb +154 -0
- data/test/model/spec_boolean.rb +115 -0
- data/test/model/spec_call-rule.rb +23 -0
- data/test/model/spec_data-expr.rb +312 -0
- data/test/model/spec_feature-expr.rb +359 -0
- data/test/model/spec_feature-expr.yml +16 -0
- data/test/model/spec_float.rb +141 -0
- data/test/model/spec_integer.rb +141 -0
- data/test/model/spec_list.rb +26 -0
- data/test/model/spec_message.rb +42 -0
- data/test/model/spec_package.rb +15 -0
- data/test/model/spec_parameters.rb +148 -0
- data/test/model/spec_rule-expr.rb +66 -0
- data/test/model/spec_rule-io.rb +32 -0
- data/test/model/spec_rule.rb +158 -0
- data/test/model/spec_string.rb +106 -0
- data/test/model/spec_variable-table.rb +117 -0
- data/test/model/spec_variable.rb +84 -0
- data/test/parser/spec_block-parser.rb +5 -0
- data/test/parser/spec_block-parser.yml +85 -0
- data/test/parser/spec_common-parser.rb +281 -0
- data/test/parser/spec_expr-parser.rb +6 -0
- data/test/parser/spec_expr-parser.yml +82 -0
- data/test/parser/spec_feature-expr-parser.rb +32 -0
- data/test/parser/spec_feature-expr-parser.yml +25 -0
- data/test/parser/spec_flow-element-parser.rb +5 -0
- data/test/parser/spec_flow-element-parser.yml +180 -0
- data/test/parser/spec_literal-parser.rb +5 -0
- data/test/parser/spec_literal-parser.yml +123 -0
- data/test/parser/spec_rule-definition-parser.rb +5 -0
- data/test/parser/spec_rule-definition-parser.yml +93 -0
- data/test/patch/spec_rinda-patch.rb +32 -0
- data/test/patch/spec_uri-patch.rb +23 -0
- data/test/rule-handler/spec_action-handler.rb +135 -0
- data/test/rule-handler/spec_flow-handler.rb +127 -0
- data/test/spec_common.rb +14 -0
- data/test/spec_data-finder.rb +88 -0
- data/test/spec_data-finder.yml +115 -0
- data/test/spec_document.rb +76 -0
- data/test/spec_identifier.rb +29 -0
- data/test/spec_log.rb +52 -0
- data/test/spec_object.rb +20 -0
- data/test/spec_resource.rb +73 -0
- data/test/spec_update-criteria.rb +83 -0
- data/test/test-util.rb +223 -0
- data/test/transformer/spec_block-transformer.rb +26 -0
- data/test/transformer/spec_expr-transformer.rb +106 -0
- data/test/transformer/spec_feature-expr-transformer.rb +21 -0
- data/test/transformer/spec_flow-element-transformer.rb +154 -0
- data/test/transformer/spec_literal-transformer.rb +58 -0
- data/test/transformer/spec_rule-definition-transformer.rb +168 -0
- data/test/tuple-space/spec_tuple-space-provider.rb +36 -0
- data/test/tuple-space/spec_tuple-space-receiver.rb +32 -0
- data/test/tuple-space/spec_tuple-space-server.rb +49 -0
- data/test/tuple/spec_basic-tuple.rb +87 -0
- data/test/tuple/spec_data-tuple.rb +85 -0
- data/test/tuple/spec_finished-tuple.rb +61 -0
- data/test/tuple/spec_task-tuple.rb +127 -0
- data/test/tuple/spec_working-tuple.rb +58 -0
- data/test/uri-scheme/spec_broadcast-scheme.rb +40 -0
- data/test/uri-scheme/spec_dropbox-scheme.rb +31 -0
- data/test/uri-scheme/spec_local-scheme.rb +69 -0
- metadata +660 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Agent
|
|
3
|
+
class Broker < BasicAgent
|
|
4
|
+
# Balancer is a base class for balancing task workers.
|
|
5
|
+
class Balancer < PioneObject
|
|
6
|
+
# Create a new balancer.
|
|
7
|
+
def initialize(broker)
|
|
8
|
+
@broker = broker
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def balance
|
|
12
|
+
raise NotImplementedError
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# EasyBalancer is a balancer by ratios of tuple space server and task worker.
|
|
17
|
+
class EasyBalancer < Balancer
|
|
18
|
+
# see Balancer.new
|
|
19
|
+
def initialize(broker)
|
|
20
|
+
@broker = broker
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Balances by killing a task worker in max tuple server.
|
|
24
|
+
def balance
|
|
25
|
+
ratios = calc_resource_ratios
|
|
26
|
+
min = ratios.values.min
|
|
27
|
+
max = ratios.values.max
|
|
28
|
+
min_server = ratios.key(min)
|
|
29
|
+
max_server = ratios.key(max)
|
|
30
|
+
|
|
31
|
+
return unless min_server
|
|
32
|
+
return unless max_server
|
|
33
|
+
|
|
34
|
+
if @broker.excess_task_workers > 0 and min_server
|
|
35
|
+
create_task_worker(min_server)
|
|
36
|
+
else
|
|
37
|
+
adjust_task_worker(min_server, max_server)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Calculates resource ratios of tuple space servers.
|
|
42
|
+
def calc_resource_ratios(revision={})
|
|
43
|
+
ratio = {}
|
|
44
|
+
# make ratio table
|
|
45
|
+
@broker.tuple_space_servers.each do |ts|
|
|
46
|
+
begin
|
|
47
|
+
rev = revision.has_key?(ts) ? revision[ts] : 0
|
|
48
|
+
current = timeout(1){ts.current_task_worker_size} + rev
|
|
49
|
+
resource = ts.task_worker_resource
|
|
50
|
+
# minimum resource is 1
|
|
51
|
+
resource = 1.0 unless resource > 0
|
|
52
|
+
ratio[ts] = current / resource.to_f
|
|
53
|
+
rescue Exception
|
|
54
|
+
# ignore
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
return ratio
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Creates a new task worker.
|
|
61
|
+
def create_task_worker(min_server)
|
|
62
|
+
@broker.create_task_worker(min_server)
|
|
63
|
+
|
|
64
|
+
if Pione.debug_mode?
|
|
65
|
+
puts "create a new task worker in #{min_server}"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Adjusts task worker size between tuple space servers.
|
|
70
|
+
def adjust_task_worker(min_server, max_server)
|
|
71
|
+
revision = {min_server => 1, max_server => -1}
|
|
72
|
+
new_ratios = calc_resource_ratios(revision)
|
|
73
|
+
|
|
74
|
+
return unless new_ratios.has_key?(min_server)
|
|
75
|
+
return unless new_ratios.has_key?(max_server)
|
|
76
|
+
|
|
77
|
+
if new_ratios[min_server] < new_ratios[max_server]
|
|
78
|
+
# move worker from max server to min server
|
|
79
|
+
max_workers = @broker.task_workers.select do |worker|
|
|
80
|
+
worker.tuple_space_server == max_server && worker.task_waiting?
|
|
81
|
+
end
|
|
82
|
+
if not(max_workers.empty?)
|
|
83
|
+
max_workers.first.terminate
|
|
84
|
+
|
|
85
|
+
# for degging
|
|
86
|
+
if Pione.debug_mode?
|
|
87
|
+
puts "worker #{worker.uuid} moved from #{max_server} to #{min_server}"
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
module BrokerMethod
|
|
95
|
+
# Adds the tuple space server.
|
|
96
|
+
def add_tuple_space_server(tuple_space_server)
|
|
97
|
+
@tuple_space_server_lock.synchronize do
|
|
98
|
+
@tuple_space_servers << tuple_space_server
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Gets a tuple space server by connection id.
|
|
103
|
+
def get_tuple_space_server(connection_id)
|
|
104
|
+
@assignment_table[connection_id]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Return excess number of workers belongs to this broker.
|
|
108
|
+
def excess_task_workers
|
|
109
|
+
@task_worker_resource - @task_workers.size
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Return task wainting workers.
|
|
113
|
+
def task_waiting_workers
|
|
114
|
+
@task_workers.select {|worker| worker.status.task_waiting?}
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Return task processing workers.
|
|
118
|
+
def task_processing_workers
|
|
119
|
+
@task_workers.select {|worker| worker.status.task_processing?}
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Return terminated task workers.
|
|
123
|
+
def terminated_task_workers
|
|
124
|
+
@task_workers.select {|worker| worker.status.terminated?}
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Create a task worker for the server.
|
|
128
|
+
def create_task_worker(tuple_space_server)
|
|
129
|
+
connection_id = Util.generate_uuid
|
|
130
|
+
@assignment_table[connection_id] = tuple_space_server
|
|
131
|
+
Agent[:task_worker].spawn(Global.front, connection_id)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Deletes unavilable tuple space servers.
|
|
135
|
+
def check_tuple_space_servers
|
|
136
|
+
@tuple_space_server_lock.synchronize do
|
|
137
|
+
@tuple_space_servers.select! do |ts|
|
|
138
|
+
begin
|
|
139
|
+
timeout(1) { ts.ping }
|
|
140
|
+
rescue Exception
|
|
141
|
+
false
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Update tuple space server list.
|
|
148
|
+
def update_tuple_space_servers(tuple_space_servers)
|
|
149
|
+
@tuple_space_server_lock.synchronize do
|
|
150
|
+
del_targets = @tuple_space_servers - tuple_space_servers
|
|
151
|
+
add_targets = tuple_space_servers - @tuple_space_servers
|
|
152
|
+
|
|
153
|
+
# bye
|
|
154
|
+
#del_targets.each do |ts_server|
|
|
155
|
+
# ts_server.write(Tuple[:bye].new(agent_type: agent_type, uuid: uuid))
|
|
156
|
+
#end
|
|
157
|
+
# hello
|
|
158
|
+
#add_targets.each do |ts_server|
|
|
159
|
+
# ts_server.write(Tuple[:agent].new(agent_type: agent_type, uuid: uuid))
|
|
160
|
+
#end
|
|
161
|
+
|
|
162
|
+
# update
|
|
163
|
+
@tuple_space_servers = tuple_space_servers
|
|
164
|
+
|
|
165
|
+
if Global.show_presence_notifier
|
|
166
|
+
timeout(1) do
|
|
167
|
+
puts "broker's tuple space servers: %s" % [@tuple_space_servers]
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
rescue Exception
|
|
172
|
+
check_tuple_space_servers
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
include BrokerMethod
|
|
177
|
+
|
|
178
|
+
set_agent_type :broker
|
|
179
|
+
|
|
180
|
+
define_state :count_tuple_space_servers
|
|
181
|
+
define_state :creating_task_worker
|
|
182
|
+
define_state :balancing_task_worker
|
|
183
|
+
define_state :sleeping
|
|
184
|
+
define_state :checking_tuple_space_servers
|
|
185
|
+
|
|
186
|
+
define_state_transition :initialized => :count_tuple_space_servers
|
|
187
|
+
define_state_transition :count_tuple_space_servers => lambda {|agent, res|
|
|
188
|
+
res > 0 ? :balancing_task_worker : :sleeping
|
|
189
|
+
}
|
|
190
|
+
define_state_transition :balancing_task_worker => :sleeping
|
|
191
|
+
define_state_transition :sleeping => :count_tuple_space_servers
|
|
192
|
+
define_state_transition :checking_tuple_space_servers => :count_tuple_space_servers
|
|
193
|
+
|
|
194
|
+
define_exception_handler Exception => :checking_tuple_space_servers
|
|
195
|
+
|
|
196
|
+
attr_accessor :task_workers
|
|
197
|
+
attr_reader :tuple_space_servers
|
|
198
|
+
attr_reader :task_worker_resource
|
|
199
|
+
|
|
200
|
+
# @api private
|
|
201
|
+
def initialize(data={})
|
|
202
|
+
super()
|
|
203
|
+
@task_workers = []
|
|
204
|
+
@tuple_space_servers = []
|
|
205
|
+
@task_worker_resource = data[:task_worker_resource] || 1
|
|
206
|
+
@sleeping_time = data[:sleeping_time] || 1
|
|
207
|
+
@assignment_table = {}
|
|
208
|
+
@tuple_space_server_lock = Mutex.new
|
|
209
|
+
|
|
210
|
+
# balancer
|
|
211
|
+
@balancer = EasyBalancer.new(self)
|
|
212
|
+
|
|
213
|
+
# start agents
|
|
214
|
+
@task_worker_checker = Agent::TrivialRoutineWorker.new(
|
|
215
|
+
Proc.new do
|
|
216
|
+
@task_workers.delete_if do |worker|
|
|
217
|
+
begin
|
|
218
|
+
timeout(3) { worker.terminated? }
|
|
219
|
+
rescue Exception
|
|
220
|
+
true
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
sleep 1
|
|
224
|
+
end
|
|
225
|
+
)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# @api private
|
|
229
|
+
def start
|
|
230
|
+
super
|
|
231
|
+
@task_worker_checker.start
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# Sends bye message to tuple space servers when the broker is destroyed.
|
|
235
|
+
def finalize
|
|
236
|
+
@tuple_space_server_lock.synchronize do
|
|
237
|
+
@tuple_space_servers.each do |ts_server|
|
|
238
|
+
begin
|
|
239
|
+
ts_server.bye
|
|
240
|
+
rescue Exception
|
|
241
|
+
# ignore
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
super
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
private
|
|
249
|
+
|
|
250
|
+
# @api private
|
|
251
|
+
def transit_to_initialized
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
def transit_to_count_tuple_space_servers
|
|
255
|
+
@tuple_space_servers.size
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def transit_to_balancing_task_worker
|
|
259
|
+
@balancer.balance
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def transit_to_checking_tuple_space_servers
|
|
263
|
+
check_tuple_space_servers
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# Transits to the state +sleeping+.
|
|
267
|
+
def transit_to_sleeping
|
|
268
|
+
sleep 1
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
set_agent Broker
|
|
273
|
+
end
|
|
274
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Agent
|
|
3
|
+
class CommandListener < TupleSpaceClient
|
|
4
|
+
set_agent_type :command_listener
|
|
5
|
+
|
|
6
|
+
define_state :waiting_command
|
|
7
|
+
define_state :doing_command
|
|
8
|
+
|
|
9
|
+
define_state_transition :initialized => :waiting_command
|
|
10
|
+
define_state_transition :waiting_command => :doing_command
|
|
11
|
+
define_state_transition :doing_command => :waiting_command
|
|
12
|
+
|
|
13
|
+
define_exception_handler Exception => :error
|
|
14
|
+
|
|
15
|
+
def hello
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def bye
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def initialize(tuple_space_server, target)
|
|
22
|
+
@target = target
|
|
23
|
+
super(tuple_space_server)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def transit_to_waiting_command
|
|
27
|
+
return read(Tuple[:command].any)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def transit_to_doing_command(cmd=nil)
|
|
31
|
+
return unless cmd # the case we got null command
|
|
32
|
+
return unless cmd.kind_of?(Tuple::Command)
|
|
33
|
+
case cmd.type
|
|
34
|
+
when "terminate"
|
|
35
|
+
@target.terminate
|
|
36
|
+
terminate
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def transit_to_error(e)
|
|
41
|
+
terminate
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
set_agent CommandListener
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Agent
|
|
3
|
+
class InputGenerator < TupleSpaceClient
|
|
4
|
+
set_agent_type :input_generator
|
|
5
|
+
|
|
6
|
+
InputData = Struct.new(:name, :uri, :time)
|
|
7
|
+
DOMAIN = "input"
|
|
8
|
+
|
|
9
|
+
# Base class for generator methods.
|
|
10
|
+
class GeneratorMethod
|
|
11
|
+
def initialize(ts_server)
|
|
12
|
+
@tuple_space_server = ts_server
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def now
|
|
16
|
+
@tuple_space_server.now
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Generates an input.
|
|
20
|
+
def generate
|
|
21
|
+
raise RuntimeError
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Return true if the generator is stream.
|
|
25
|
+
# @return [Boolean]
|
|
26
|
+
# true if the generator is stream mode
|
|
27
|
+
def stream?
|
|
28
|
+
return false
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Directory based generator.
|
|
33
|
+
class DirGeneratorMethod < GeneratorMethod
|
|
34
|
+
# Create a generator.
|
|
35
|
+
# @param [TupleSpaceServer] ts_server
|
|
36
|
+
# tuple space server
|
|
37
|
+
# @param [URI] dir_path
|
|
38
|
+
# directory URI for loading target
|
|
39
|
+
def initialize(ts_server, dir_path)
|
|
40
|
+
raise TypeError.new(dir_path) unless dir_path.kind_of?(URI) or dir_path.nil?
|
|
41
|
+
super(ts_server)
|
|
42
|
+
@dir_path = dir_path
|
|
43
|
+
if dir_path
|
|
44
|
+
@gen = Resource[@dir_path].entries.to_enum
|
|
45
|
+
else
|
|
46
|
+
@gen = [].each
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def generate
|
|
51
|
+
item = @gen.next
|
|
52
|
+
InputData.new(item.basename, item.uri, item.mtime)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# StreamGeneratorMethod handles stream inputs.
|
|
57
|
+
class StreamGeneratorMethod < GeneratorMethod
|
|
58
|
+
def initialize(ts_server, dir_path)
|
|
59
|
+
raise TypeError.new(dir_path) unless dir_path.kind_of?(URI) or dir_path.nil?
|
|
60
|
+
super(ts_server)
|
|
61
|
+
@dir_path = dir_path
|
|
62
|
+
@table = Hash.new
|
|
63
|
+
init
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def generate
|
|
67
|
+
item = @gen.next
|
|
68
|
+
if generate_new_file?(item.basename, item.mtime)
|
|
69
|
+
@table[item.basename] = item.mtime
|
|
70
|
+
return InputData.new(item.basename, item.uri, item.mtime)
|
|
71
|
+
else
|
|
72
|
+
return nil
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Initializes the generator. This method is called when root rule is
|
|
77
|
+
# requested in stream mode.
|
|
78
|
+
# @retrun [void]
|
|
79
|
+
def init
|
|
80
|
+
if @dir_path
|
|
81
|
+
@gen = Resource[@dir_path].entries.to_enum
|
|
82
|
+
else
|
|
83
|
+
@gen = [].each
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# @api private
|
|
88
|
+
def stream?
|
|
89
|
+
return true
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
# Return true if it is new file.
|
|
95
|
+
# return [Boolean]
|
|
96
|
+
# return true if the file is new.
|
|
97
|
+
def generate_new_file?(name, mtime)
|
|
98
|
+
return false if ['.', '..'].include?(name)
|
|
99
|
+
return true unless @table.has_key?(name)
|
|
100
|
+
mtime > @table[name]
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Create a input generator agent by simple method.
|
|
105
|
+
def self.start_by_simple(ts_server, *args)
|
|
106
|
+
start(ts_server, SimpleGeneratorMethod.new(ts_server, ts_server.base_uri, *args))
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Create a input generator agent by directory method.
|
|
110
|
+
def self.start_by_dir(ts_server, *args)
|
|
111
|
+
start(ts_server, DirGeneratorMethod.new(ts_server, *args))
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Create a input generator agent by stream method.
|
|
115
|
+
def self.start_by_stream(ts_server, *args)
|
|
116
|
+
start(ts_server, StreamGeneratorMethod.new(ts_server, *args))
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
define_state :generating
|
|
120
|
+
define_state :sleeping
|
|
121
|
+
define_state :stop_iteration
|
|
122
|
+
|
|
123
|
+
define_state_transition :initialized => :reading_base_uri
|
|
124
|
+
define_state_transition :reading_base_uri => :generating
|
|
125
|
+
define_state_transition :generating => :generating
|
|
126
|
+
define_state_transition :stop_iteration => lambda{|agent, res|
|
|
127
|
+
agent.stream? ? :sleeping : :terminated
|
|
128
|
+
}
|
|
129
|
+
define_state_transition :sleeping => :generating
|
|
130
|
+
|
|
131
|
+
define_exception_handler StopIteration => :stop_iteration
|
|
132
|
+
|
|
133
|
+
attr_reader :generator
|
|
134
|
+
|
|
135
|
+
# Initialize the agent.
|
|
136
|
+
def initialize(ts_server, generator)
|
|
137
|
+
raise ArgumentError unless generator.kind_of?(GeneratorMethod)
|
|
138
|
+
super(ts_server)
|
|
139
|
+
@generator = generator
|
|
140
|
+
@inputs = []
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Return true if generator of the agent is stream type.
|
|
144
|
+
def stream?
|
|
145
|
+
@generator.stream?
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
private
|
|
149
|
+
|
|
150
|
+
def transit_to_reading_base_uri
|
|
151
|
+
@base_uri = read(Tuple[:base_uri].any).uri
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# State generating generates a data from generator and puts it into tuple
|
|
155
|
+
# space.
|
|
156
|
+
def transit_to_generating
|
|
157
|
+
if input = @generator.generate
|
|
158
|
+
@inputs << input
|
|
159
|
+
# log
|
|
160
|
+
log do |msg|
|
|
161
|
+
msg.add_record(agent_type, "action", "generate_input_data")
|
|
162
|
+
msg.add_record(agent_type, "uuid", uuid)
|
|
163
|
+
msg.add_record(agent_type, "object", input.name)
|
|
164
|
+
end
|
|
165
|
+
# upload the file
|
|
166
|
+
input_uri = @base_uri + File.join("input", input.name)
|
|
167
|
+
Resource[input_uri].create(Resource[input.uri].read)
|
|
168
|
+
# make the tuple
|
|
169
|
+
write(Tuple[:data].new(DOMAIN, input.name, input_uri, input.time))
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# State stop_iteration. StopIteration exception is ignored because it
|
|
174
|
+
# means the input generation was completed.
|
|
175
|
+
def transit_to_stop_iteration(e)
|
|
176
|
+
# start root rule
|
|
177
|
+
if not(@inputs.empty?) or not(stream?)
|
|
178
|
+
write(Tuple[:command].new("start-root-rule", nil))
|
|
179
|
+
end
|
|
180
|
+
terminate unless stream?
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def transit_to_sleeping
|
|
184
|
+
sleep Global.input_generator_stream_check_timespan
|
|
185
|
+
|
|
186
|
+
# init stream generator
|
|
187
|
+
@generator.init
|
|
188
|
+
@inputs = []
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
set_agent InputGenerator
|
|
193
|
+
end
|
|
194
|
+
end
|