| 561 | } |
| 562 | |
| 563 | ACTOR template <class DB> |
| 564 | Future<ConfigurationResult> autoConfig(Reference<DB> db, ConfigureAutoResult conf) { |
| 565 | state Reference<typename DB::TransactionT> tr = db->createTransaction(); |
| 566 | state Key versionKey = BinaryWriter::toValue(deterministicRandom()->randomUniqueID(), Unversioned()); |
| 567 | |
| 568 | if (!conf.address_class.size()) |
| 569 | return ConfigurationResult::INCOMPLETE_CONFIGURATION; // FIXME: correct return type |
| 570 | |
| 571 | loop { |
| 572 | try { |
| 573 | tr->setOption(FDBTransactionOptions::ACCESS_SYSTEM_KEYS); |
| 574 | tr->setOption(FDBTransactionOptions::PRIORITY_SYSTEM_IMMEDIATE); |
| 575 | tr->setOption(FDBTransactionOptions::LOCK_AWARE); |
| 576 | tr->setOption(FDBTransactionOptions::USE_PROVISIONAL_PROXIES); |
| 577 | |
| 578 | state typename DB::TransactionT::template FutureT<RangeResult> processClassesF; |
| 579 | state typename DB::TransactionT::template FutureT<RangeResult> processDataF; |
| 580 | std::vector<ProcessData> workers = wait(getWorkers(tr, processClassesF, processDataF)); |
| 581 | std::map<NetworkAddress, Optional<Standalone<StringRef>>> address_processId; |
| 582 | for (auto& w : workers) { |
| 583 | address_processId[w.address] = w.locality.processId(); |
| 584 | } |
| 585 | |
| 586 | for (auto& it : conf.address_class) { |
| 587 | if (it.second.classSource() == ProcessClass::CommandLineSource) { |
| 588 | tr->clear(processClassKeyFor(address_processId[it.first].get())); |
| 589 | } else { |
| 590 | tr->set(processClassKeyFor(address_processId[it.first].get()), processClassValue(it.second)); |
| 591 | } |
| 592 | } |
| 593 | |
| 594 | if (conf.address_class.size()) |
| 595 | tr->set(processClassChangeKey, deterministicRandom()->randomUniqueID().toString()); |
| 596 | |
| 597 | if (conf.auto_logs != conf.old_logs) |
| 598 | tr->set(configKeysPrefix.toString() + "auto_logs", format("%d", conf.auto_logs)); |
| 599 | |
| 600 | if (conf.auto_commit_proxies != conf.old_commit_proxies) |
| 601 | tr->set(configKeysPrefix.toString() + "auto_commit_proxies", format("%d", conf.auto_commit_proxies)); |
| 602 | |
| 603 | if (conf.auto_grv_proxies != conf.old_grv_proxies) |
| 604 | tr->set(configKeysPrefix.toString() + "auto_grv_proxies", format("%d", conf.auto_grv_proxies)); |
| 605 | |
| 606 | if (conf.auto_resolvers != conf.old_resolvers) |
| 607 | tr->set(configKeysPrefix.toString() + "auto_resolvers", format("%d", conf.auto_resolvers)); |
| 608 | |
| 609 | if (conf.auto_replication != conf.old_replication) { |
| 610 | std::vector<StringRef> modes; |
| 611 | modes.push_back(conf.auto_replication); |
| 612 | std::map<std::string, std::string> m; |
| 613 | auto r = buildConfiguration(modes, m); |
| 614 | if (r != ConfigurationResult::SUCCESS) |
| 615 | return r; |
| 616 | |
| 617 | for (auto& kv : m) |
| 618 | tr->set(kv.first, kv.second); |
| 619 | } |
| 620 |
no test coverage detected