frontend/collections/operation_manager.h (38 lines of code) (raw):
//
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef THIRD_PARTY_CLOUD_SPANNER_EMULATOR_FRONTEND_COLLECTIONS_OPERATION_MANAGER_H_
#define THIRD_PARTY_CLOUD_SPANNER_EMULATOR_FRONTEND_COLLECTIONS_OPERATION_MANAGER_H_
#include <map>
#include <memory>
#include <string>
#include "absl/base/thread_annotations.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/synchronization/mutex.h"
#include "frontend/entities/operation.h"
#include "absl/status/status.h"
namespace google {
namespace spanner {
namespace emulator {
namespace frontend {
// OperationManager manages the set of long running operations in the emulator.
//
// The emulator does not actually have long running operations - all operations
// complete immediately. However, these operations are still recorded and are
// accessible via the longrunning operations api.
//
// Cloud Spanner currently has the following long running operations:
// - Create an instance
// - Update an instance
// - Create a database
// - Update a database
//
// The emulator implementation of these operations executes the operation
// synchronously, but returns an incomplete operation response. The completed
// operation is registered with this OperationManager. This ensures that
// applications developed against the emulator don't assume that the operations
// finish immediately and have to query the operations api to get the status of
// the operation.
//
// The interface below does not implement the Cancel and Wait operations. Cancel
// returns success at the handler level as there is nothing to cancel. Wait is
// not implemented by Cloud Spanner, so we don't need to implement it here.
//
// For more details on the long running operations api, see
// https://cloud.google.com/spanner/docs/reference/rpc/google.longrunning
class OperationManager {
public:
// A constant indicating that the operation id should be auto generated.
static const char kAutoGeneratedId[];
// Creates an operation. Some operations (like update database) allow the
// user to specify the operation id. If the user specifies an operation id,
// it is used as-is, otherwise a system generated operation id is used.
// System generated ids always start with "_auto".
absl::StatusOr<std::shared_ptr<Operation>> CreateOperation(
const std::string& resource_uri, const std::string& operation_id)
ABSL_LOCKS_EXCLUDED(mu_);
// Gets the operation with the specified URI, or returns NOT_FOUND if no such
// operation is registered with the manager.
absl::StatusOr<std::shared_ptr<Operation>> GetOperation(
const std::string& operation_uri) ABSL_LOCKS_EXCLUDED(mu_);
// Deletes the operation with the specified URI. Delete is idempotent - OK is
// returned even if the operation does not exist.
absl::Status DeleteOperation(const std::string& operation_uri)
ABSL_LOCKS_EXCLUDED(mu_);
// Lists all the operations registered with the operation manager.
absl::StatusOr<std::vector<std::shared_ptr<Operation>>> ListOperations(
const std::string& resource_uri) ABSL_LOCKS_EXCLUDED(mu_);
private:
// Mutex to guard state below.
absl::Mutex mu_;
// Counter for the system assigned operation id.
int next_operation_id_ ABSL_GUARDED_BY(mu_) = 0;
// Map from operation URI to actual operation.
std::map<std::string, std::shared_ptr<Operation>> operations_map_
ABSL_GUARDED_BY(mu_);
};
} // namespace frontend
} // namespace emulator
} // namespace spanner
} // namespace google
#endif // THIRD_PARTY_CLOUD_SPANNER_EMULATOR_FRONTEND_COLLECTIONS_OPERATION_MANAGER_H_