Code Monkey home page Code Monkey logo

hazelcast-cpp-client's Introduction

logo

Hazelcast C++ Client

Chat on Slack Follow on Twitter Chat on Slack


What is Hazelcast?

Hazelcast is a distributed computation and storage platform for consistently low-latency querying, aggregation and stateful computation against event streams and traditional data sources. It allows you to quickly build resource-efficient, real-time applications. You can deploy it at any scale from small edge devices to a large cluster of cloud instances.

A cluster of Hazelcast nodes share both the data storage and computational load which can dynamically scale up and down. When you add new nodes to the cluster, the data is automatically rebalanced across the cluster, and currently running computational tasks (known as jobs) snapshot their state and scale with processing guarantees.

For more info, check out Hazelcast repository.

Hazelcast C++ Client

hazelcast-cpp-client is the official C++ library API for using the Hazelcast in-memory database platform. It requires C++11 support.

Installation

Hazelcast

Hazelcast C++ client requires a working Hazelcast cluster to run. This cluster handles the storage and manipulation of the user data.

A Hazelcast cluster consists of one or more cluster members. These members generally run on multiple virtual or physical machines and are connected to each other via the network. Any data put on the cluster is partitioned to multiple members transparent to the user. It is therefore very easy to scale the system by adding new members as the data grows. Hazelcast cluster also offers resilience. Should any hardware or software problem causes a crash to any member, the data on that member is recovered from backups and the cluster continues to operate without any downtime.

The quickest way to start a single member cluster for development purposes is to use our Docker images.

docker run -p 5701:5701 hazelcast/hazelcast

This command fetches the latest Hazelcast version. You can find all available tags here.

You can also use our ZIP or TAR distributions as described here.

Client

Vcpkg Users

Hazelcast C++ client package is available for Vcpkg users. The package name is hazelcast-cpp-client.

Please see getting started on how to use Vcpkg package manager with your application. In summary,

If you use Linux or Mac:

git clone https://github.com/microsoft/vcpkg
./vcpkg/bootstrap-vcpkg.sh
./vcpkg/vcpkg install "hazelcast-cpp-client[openssl]" --recurse

If you use Windows:

git clone https://github.com/microsoft/vcpkg
.\vcpkg\bootstrap-vcpkg.bat
.\vcpkg\vcpkg install "hazelcast-cpp-client[openssl]:x64-windows" --recurse

The above code snippet will install hazelcast-cpp-client with its boost and openssl dependencies.

After the installation, the library is available for usage. For example, if you are using CMake for your builds, you can use the following cmake build command with the CMAKE_TOOLCHAIN_FILE cmake option to be the vcpkg.cmake.

cmake -B [build directory] -S . -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
cmake --build [build directory]
Other Methods

You can also install the hazelcast-cpp-client with conan and from source code. You can more information from Reference Manual.

Overview

Usage

There is an example project in sample_project directory. You can run the example as below:

If you use Linux or Mac:

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/client

If you use Windows:

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]\scripts\buildsystems\vcpkg.cmake && ^ 
cmake --build build && ^
.\build\Debug\client

The sample code creates a client, the client automatically connects to the cluster. It creates a map named personnel_map and puts the records inside it. It then gets all the entries from the cluster and prints them.

#include <hazelcast/client/hazelcast_client.h>
int main() {
    auto hz = hazelcast::new_client().get(); // Connects to the cluster

    auto personnel = hz.get_map("personnel_map").get();
    personnel->put<std::string, std::string>("Alice", "IT").get();
    personnel->put<std::string, std::string>("Bob", "IT").get();
    personnel->put<std::string, std::string>("Clark", "IT").get();
    std::cout << "Added IT personnel. Logging all known personnel" << std::endl;
    for (const auto &entry : personnel->entry_set<std::string, std::string>().get()) {
        std::cout << entry.first << " is in " << entry.second << " department." << std::endl;
    }
    
    return 0;
}

Features

  • Distributed, partitioned and queryable in-memory key-value store implementation, called Map
  • Eventually consistent cache implementation to store a subset of the Map data locally in the memory of the client, called Near Cache
  • Additional data structures and simple messaging constructs such as Set, MultiMap, Queue, Topic
  • Cluster-wide unique ID generator, called FlakeIdGenerator
  • Distributed, CRDT based counter, called PNCounter
  • Distributed concurrency primitives from CP Subsystem such as FencedLock, Semaphore, AtomicLong
  • Integration with Viridian (Hazelcast Cloud)
  • Support for serverless and traditional web service architectures with Unisocket and Smart operation modes
  • Ability to listen client lifecycle, cluster state and distributed data structure events
  • and many more.

Documentation

You can find the detailed documentation at the documentation site and the API reference.

Copyright

Copyright (c) 2008-2023, Hazelcast, Inc. All Rights Reserved.

Visit www.hazelcast.com for more information.

hazelcast-cpp-client's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hazelcast-cpp-client's Issues

Builds fail at windows

Builds failed at windows since we could not sleep enough time as expected in the test script:
https://hazelcast-l337.ci.cloudbees.com/job/cpp-pr-builder-windows/480/console

12:53:49 INFO: No tasks running with the specified criteria.
12:53:49 "Starting the java test server"
12:53:49 "Waiting for the test server to start. Timeout: 30 seconds"
12:53:49 "Sleeping 1 second. Remaining 30 seconds"
12:53:49 "Sleeping 1 second. Remaining 29 seconds"
12:53:49 "Sleeping 1 second. Remaining 28 seconds"
12:53:49 "Sleeping 1 second. Remaining 27 seconds"
12:53:49 "Sleeping 1 second. Remaining 26 seconds"
12:53:49 "Sleeping 1 second. Remaining 25 seconds"
12:53:49 "Sleeping 1 second. Remaining 24 seconds"
12:53:49 "Sleeping 1 second. Remaining 23 seconds"
12:53:49 "Sleeping 1 second. Remaining 22 seconds"
12:53:49 "Sleeping 1 second. Remaining 21 seconds"
12:53:49 "Sleeping 1 second. Remaining 20 seconds"
12:53:49 "Sleeping 1 second. Remaining 19 seconds"
12:53:49 "Sleeping 1 second. Remaining 18 seconds"
12:53:49 "Sleeping 1 second. Remaining 17 seconds"
12:53:49 "Sleeping 1 second. Remaining 16 seconds"
12:53:49 "Sleeping 1 second. Remaining 15 seconds"
12:53:50 "Sleeping 1 second. Remaining 14 seconds"
12:53:50 "Sleeping 1 second. Remaining 13 seconds"
12:53:50 "Sleeping 1 second. Remaining 12 seconds"
12:53:50 "Sleeping 1 second. Remaining 11 seconds"
12:53:50 "Sleeping 1 second. Remaining 10 seconds"
12:53:50 "Sleeping 1 second. Remaining 9 seconds"
12:53:50 "Sleeping 1 second. Remaining 8 seconds"
12:53:50 "Sleeping 1 second. Remaining 7 seconds"
12:53:50 "Sleeping 1 second. Remaining 6 seconds"
12:53:50 "Sleeping 1 second. Remaining 5 seconds"
12:53:50 "Sleeping 1 second. Remaining 4 seconds"
12:53:50 "Sleeping 1 second. Remaining 3 seconds"
12:53:50 "Sleeping 1 second. Remaining 2 seconds"
12:53:50 "Sleeping 1 second. Remaining 1 seconds"
12:53:50 "The test server did not start in 30 seconds. Test FAILED."
12:53:50
12:53:50 INFO: No tasks running with the specified criteria.

LoadTest.testIntMapDummyClientServerRestart sometimes fails on Windows

LoadTest.testIntMapDummyClientServerRestart sometimnes fails on Windows.

00:46:31 C:\jenkins\ope-fs-root\workspace\cpp_windows - maintenance - nightly\hazelcast\test\src\faulttolerance\LoadTest.cpp(61): error: Expected: val = map->get(i) doesn't throw an exception.
00:46:31   Actual: it throws.

https://hazelcast-l337.ci.cloudbees.com/job/cpp_windows%20-%20maintenance%20-%20nightly/83/consoleFull

https://hazelcast-l337.ci.cloudbees.com/job/cpp-linux-nightly-32-SHARED-Debug/121/testReport/junit/(root)/LoadTest/testIntMapDummyClientServerRestart/

ClientQueueTest.testTake sometimes causes segmentation fault

ClientQueueTest.testTake sometimes causes segmentation fault.
Log:
https://hazelcast-l337.ci.cloudbees.com/job/cpp-linux-nightly-64-STATIC-Release/69/console
https://hazelcast-l337.ci.cloudbees.com/job/cpp-linux-nightly-64-SHARED-Release/69/console
https://hazelcast-l337.ci.cloudbees.com/job/cpp-linux-nightly-64-STATIC-Release/69/console

06:03:26 [ RUN ] ClientQueueTest.testTake
06:03:26 Apr 06, 2016 12:49:27 PM CppClientListener
06:03:26 INFO: SHUTDOWN for instance 39 is completed.
06:03:26 START command received: NEW INSTANCE OPEN
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.instance.DefaultAddressPicker
06:03:26 INFO: [LOCAL] [dev] [3.7-SNAPSHOT] Interfaces is disabled, trying to pick one address from TCP-IP config addresses: [127.0.0.1]
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.instance.DefaultAddressPicker
06:03:26 INFO: [LOCAL] [dev] [3.7-SNAPSHOT] Picked Address[127.0.0.1]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.system
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Hazelcast 3.7-SNAPSHOT (20160405 - 68d2790) starting at Address[127.0.0.1]:5701
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.system
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Copyright (c) 2008-2016, Hazelcast, Inc. All Rights Reserved.
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.system
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Configured Hazelcast Serialization version : 1
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.spi.OperationService
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Backpressure is disabled
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.instance.Node
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Creating TcpIpJoiner
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.core.LifecycleService
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Address[127.0.0.1]:5701 is STARTING
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Starting with 2 generic operation threads and 2 partition operation threads.
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.nio.tcp.nonblocking.NonBlockingIOThreadingModel
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] TcpIpConnectionManager configured with Non Blocking IO-threading model: 3 input threads and 3 output threads
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.nio.tcp.InitConnectionTask
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Connecting to /127.0.0.1:5702, timeout: 0, bind-any: true
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.nio.tcp.InitConnectionTask
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Could not connect to: /127.0.0.1:5702. Reason: SocketException[Connection refused to address /127.0.0.1:5702]
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.cluster.impl.TcpIpJoiner
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Address[127.0.0.1]:5702 is added to the blacklist.
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.nio.tcp.InitConnectionTask
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Connecting to /127.0.0.1:5704, timeout: 0, bind-any: true
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.nio.tcp.InitConnectionTask
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Connecting to /127.0.0.1:5705, timeout: 0, bind-any: true
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.nio.tcp.InitConnectionTask
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Could not connect to: /127.0.0.1:5704. Reason: SocketException[Connection refused to address /127.0.0.1:5704]
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.cluster.impl.TcpIpJoiner
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Address[127.0.0.1]:5704 is added to the blacklist.
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.nio.tcp.InitConnectionTask
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Connecting to /127.0.0.1:5703, timeout: 0, bind-any: true
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.nio.tcp.InitConnectionTask
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Could not connect to: /127.0.0.1:5703. Reason: SocketException[Connection refused to address /127.0.0.1:5703]
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.cluster.impl.TcpIpJoiner
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Address[127.0.0.1]:5703 is added to the blacklist.
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.nio.tcp.InitConnectionTask
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Could not connect to: /127.0.0.1:5705. Reason: SocketException[Connection refused to address /127.0.0.1:5705]
06:03:26 Apr 06, 2016 12:49:27 PM com.hazelcast.cluster.impl.TcpIpJoiner
06:03:26 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Address[127.0.0.1]:5705 is added to the blacklist.
06:03:27 Apr 06, 2016 12:49:28 PM com.hazelcast.cluster.impl.TcpIpJoiner
06:03:27 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT]
06:03:27
06:03:27
06:03:27 Members [1] {
06:03:27 Member [127.0.0.1]:5701 this
06:03:27 }
06:03:27
06:03:27 Apr 06, 2016 12:49:28 PM com.hazelcast.core.LifecycleService
06:03:27 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Address[127.0.0.1]:5701 is STARTED
06:03:28 Apr 06, 2016 12:49:28 PM com.hazelcast.nio.tcp.SocketAcceptorThread
06:03:28 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Accepting socket connection from /127.0.0.1:60334
06:03:28 Apr 06, 2016 12:49:28 PM com.hazelcast.nio.tcp.TcpIpConnectionManager
06:03:28 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Established socket connection between /127.0.0.1:5701 and /127.0.0.1:60334
06:03:28 Apr 06, 2016 12:49:28 PM com.hazelcast.client.impl.protocol.task.AuthenticationMessageTask
06:03:28 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Received auth from Connection [/127.0.0.1:5701 -> /127.0.0.1:60334], endpoint=null, alive=true, type=CPP_CLIENT, successfully authenticated, principal : ClientPrincipal{uuid='aa1bb8b8-3414-4f84-99d5-71cf5c69a818', ownerUuid='bf1c1eed-10b7-45a3-b6c4-22a2017f3b0a'}, owner connection : true
06:03:29 Apr 06, 2016 12:49:29 PM com.hazelcast.nio.tcp.SocketAcceptorThread
06:03:29 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Accepting socket connection from /127.0.0.1:60335
06:03:29 Apr 06, 2016 12:49:29 PM com.hazelcast.nio.tcp.TcpIpConnectionManager
06:03:29 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Established socket connection between /127.0.0.1:5701 and /127.0.0.1:60335
06:03:29 Apr 06, 2016 12:49:29 PM com.hazelcast.client.impl.protocol.task.AuthenticationMessageTask
06:03:29 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Received auth from Connection [/127.0.0.1:5701 -> /127.0.0.1:60335], endpoint=null, alive=true, type=CPP_CLIENT, successfully authenticated, principal : ClientPrincipal{uuid='aa1bb8b8-3414-4f84-99d5-71cf5c69a818', ownerUuid='bf1c1eed-10b7-45a3-b6c4-22a2017f3b0a'}, owner connection : false
06:03:29 Apr 06, 2016 12:49:29 PM com.hazelcast.internal.partition.InternalPartitionService
06:03:29 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Initializing cluster partition table arrangement...
06:03:31 Apr 06, 2016 12:49:31 PM com.hazelcast.nio.tcp.TcpIpConnection
06:03:31 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Connection [Address[127.0.0.1]:60334] lost. Reason: java.io.EOFException[Remote socket closed!]
06:03:31 Apr 06, 2016 12:49:31 PM com.hazelcast.nio.tcp.nonblocking.NonBlockingSocketReader
06:03:31 WARNING: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] hz._hzInstance_40_dev.IO.thread-in-0 Closing socket to endpoint Address[127.0.0.1]:60334, Cause:java.io.EOFException: Remote socket closed!
06:03:31 Apr 06, 2016 12:49:31 PM com.hazelcast.nio.tcp.TcpIpConnection
06:03:31 INFO: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] Connection [Address[127.0.0.1]:60335] lost. Reason: java.io.IOException[Connection reset by peer]
06:03:31 Apr 06, 2016 12:49:31 PM com.hazelcast.nio.tcp.nonblocking.NonBlockingSocketReader
06:03:31 WARNING: [127.0.0.1]:5701 [dev] [3.7-SNAPSHOT] hz._hzInstance_40_dev.IO.thread-in-1 Closing socket to endpoint Address[127.0.0.1]:60335, Cause:java.io.IOException: Connection reset by peer
06:03:31 [WARNING]
06:03:31 java.lang.reflect.InvocationTargetException
06:03:31 testLinuxSingleCase.sh: line 106: 19275 Segmentation fault (core dumped) ${BUILD_DIR}/hazelcast/test/src/${EXECUTABLE_NAME} --gtest_output="xml:CPP_Client_Test_Report.xml"
06:03:31 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
06:03:31 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
06:03:31 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
06:03:31 at java.lang.reflect.Method.invoke(Method.java:497)
06:03:31 at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
06:03:31 at java.lang.Thread.run(Thread.java:745)
06:03:31 Caused by: java.io.EOFException
06:03:31 at java.io.DataInputStream.readInt(DataInputStream.java:392)
06:03:31 at CppClientListener.main(CppClientListener.java:229)
06:03:31 Test FAILED. Result:139
06:03:31 ... 6 more
06:03:31 cleanup is being performed.

C++ client connection problems when node is powered off

There are several Hazelcast servers running on different nodes in our test environment.

When I power off the node where one of the Hazelcast servers (3.6.2) is running, I occasionally encounter with two problems:

  1. The C++ client (3.6.3) might get stuck in printing the following message:
    Future.set_exception should not be called twice : details ExceptionMessage (Wait is timed out) at Future::get(timeInSeconds)

  2. The C++ client might get stuck in hazelcast::client::IMap::keySet(). The stack output:
    Thread1:

  • stlp_std::ostreambuf_iterator...:copy()
  • stlp_std::ostreambuf_iterator...:put_integer()
  • stlp_std::num_put::do_put(...)
  • stlp_std::priv::_put_number()
  • hazelcast::client::operator<<(...)
  • hazelcast::client::connection::CallFuture::get(long)
  • hazelcast::client::connection::CallFuture::get()
  • hazelcast::client::proxy::ProxyImpl:invoke(...)
  • hazelcast::client::proxy::IMapImpl:keySetData(...)
  • hazelcast::client::IMap<...>:keySet(...)

Thread3:

  • hazelcast::client::Socket:::send()
  • hazelcast::client::connection::OutputSocketStream::write()
  • hazelcast::client::connection::Connection::init()
  • hazelcast::client::connection::ConnectionManager::authenticate()
  • hazelcast::client::connection::ConnectionManager::connectTo()
  • hazelcast::client::connection::OwnerConnectionFuture::createNew()
  • hazelcast::client::connection::ConnectionManager::createOwnerConnection()
  • hazelcast::client::spi::ClusterService::connectToOne()
  • hazelcast::client::connection::ClusterListenerThread::run()
  • hazelcast::client::connection::ClusterListenerThread::staticRun()
  • hazelcast::util::Thread::controlledThread()

C++ client connection parameters:

  • ClientProperties::PROP_HEARTBEAT_INTERVAL=1
  • ClientProperties::PROP_HEARTBEAT_TIMEOUT=2
  • ClientProperties::PROP_REQUEST_RETRY_COUNT=0
  • ClientProperties::PROP_REQUEST_RETRY_WAIT_TIME=1
  • ConnectionTimeout=500
  • ConnectionAttemptLimit=0
  • AttemptPeriod=0

The OS is RHEL 6.6, the machine is virtual.

Usage of released includes and libraries

We need tests to make sure that the released zip folder is correct before it is released. For this purpose, we may use the examples built with the to-be-release folder. This is important for detecting any issues with the release in an earlier stage.

Unix system calls return values check

There are a number of places in the code where the unix system call return values are not checked during runtime(release build). Depending on debug time assert statements on the return value checks would not be a good choice. These should be handled. E.g.

ConditionVariable.cpp
Mutex.cpp
ServerSocket.cpp
...

Test failure ICountDownLatchTest.testLatch

ICountDownLatchTest.testLatch test sometimes fails for build cpp-linux-nightly-64-STATIC-Release.
https://hazelcast-l337.ci.cloudbees.com/job/cpp-linux-nightly-64-STATIC-Release/64/console

The test causes segmentation fault. When examined the core stack trace, I noticed that the test terminates before the thread finishes. The thread finishes when the await request gets the response from the server. One scenario in mind:

  1. The latch is decremented 20th time at the server side becoming 0.
  2. The response to await comes to the client before the response to countdown is received.

Hence, this may cause the test termination where the latch pointer becomes invalid memory and the latch thread accessing the invalid memory crashes.

Stack trace:
Program terminated with signal 11, Segmentation fault.
#0 0x000000000065ef70 in hazelcast::util::LockGuard::~LockGuard() ()

(gdb) info threads
7 Thread 0x2b3c94137250 (LWP 24821) 0x0000003388807c65 in pthread_join () from /lib64/libpthread.so.0
6 Thread 28071 0x0000003387cce172 in select () from /lib64/libc.so.6
5 Thread 28072 0x0000003387cce172 in select () from /lib64/libc.so.6
4 Thread 28073 0x000000338880b280 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
3 Thread 28074 0x000000338880de11 in recv () from /lib64/libpthread.so.0
2 Thread 28079 0x000000338880b280 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
1 Thread 28082 0x000000000065ef70 in hazelcast::util::LockGuard::~LockGuard() ()
(gdb) bt
#0 0x000000000065ef70 in hazelcast::util::LockGuard::~LockGuard() ()
#1 0x00000000006d0b9e in hazelcast::client::connection::CallFuture::get(long) ()
#2 0x00000000006d1115 in hazelcast::client::connection::CallFuture::get() ()
#3 0x0000000000628afe in hazelcast::client::proxy::ProxyImpl::invoke(std::auto_ptrhazelcast::client::protocol::ClientMessage, int) ()
#4 0x000000000061e78b in hazelcast::client::ICountDownLatch::countDown() ()
#5 0x0000000000527338 in hazelcast::client::test::testLatchThread(hazelcast::util::ThreadArgs&) ()
#6 0x000000000065ea93 in hazelcast::util::Thread::controlledThread(void*) ()
#7 0x000000338880683d in start_thread () from /lib64/libpthread.so.0
#8 0x0000003387cd4fdd in clone () from /lib64/libc.so.6

(gdb) thread 2
[Switching to thread 2 (Thread 28079)]#0 0x000000338880b280 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
(gdb) bt
#0 0x000000338880b280 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x000000000065b993 in hazelcast::util::ConditionVariable::waitFor(hazelcast::util::Mutex&, long) ()
#2 0x000000000065de85 in hazelcast::util::Thread::interruptibleSleep(int) ()
#3 0x00000000006ba30e in hazelcast::client::spi::PartitionService::runListener(hazelcast::util::Thread*) ()
#4 0x000000000065ea93 in hazelcast::util::Thread::controlledThread(void*) ()
#5 0x000000338880683d in start_thread () from /lib64/libpthread.so.0
#6 0x0000003387cd4fdd in clone () from /lib64/libc.so.6

(gdb) thread 3
[Switching to thread 3 (Thread 28074)]#0 0x000000338880de11 in recv () from /lib64/libpthread.so.0
(gdb) bt
#0 0x000000338880de11 in recv () from /lib64/libpthread.so.0
#1 0x000000000065675e in hazelcast::client::Socket::receive(void*, int, int) const ()
#2 0x000000000065fd9c in hazelcast::util::ByteBuffer::readFrom(hazelcast::client::Socket const&, int, int) ()
#3 0x00000000006cc697 in hazelcast::client::connection::Connection::readBlocking() ()
#4 0x0000000000617f6e in hazelcast::client::connection::ClusterListenerThread::listenMembershipEvents() ()
#5 0x000000000061848c in hazelcast::client::connection::ClusterListenerThread::run(hazelcast::util::Thread*) ()
#6 0x000000000065ea93 in hazelcast::util::Thread::controlledThread(void*) ()
#7 0x000000338880683d in start_thread () from /lib64/libpthread.so.0
#8 0x0000003387cd4fdd in clone () from /lib64/libc.so.6

(gdb) thread 4
[Switching to thread 4 (Thread 28073)]#0 0x000000338880b280 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
(gdb) bt
#0 0x000000338880b280 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x000000000065b993 in hazelcast::util::ConditionVariable::waitFor(hazelcast::util::Mutex&, long) ()
#2 0x000000000065de85 in hazelcast::util::Thread::interruptibleSleep(int) ()
#3 0x0000000000613356 in hazelcast::client::connection::HeartBeater::run(hazelcast::util::Thread*) ()
#4 0x000000000065ea93 in hazelcast::util::Thread::controlledThread(void*) ()
#5 0x000000338880683d in start_thread () from /lib64/libpthread.so.0
#6 0x0000003387cd4fdd in clone () from /lib64/libc.so.6

(gdb) thread 5
[Switching to thread 5 (Thread 28072)]#0 0x0000003387cce172 in select () from /lib64/libc.so.6
(gdb) bt
#0 0x0000003387cce172 in select () from /lib64/libc.so.6
#1 0x00000000006161ce in hazelcast::client::connection::OutSelector::listenInternal() ()
#2 0x0000000000614330 in hazelcast::client::connection::IOSelector::listen() ()
#3 0x000000000065ea93 in hazelcast::util::Thread::controlledThread(void*) ()
#4 0x000000338880683d in start_thread () from /lib64/libpthread.so.0
#5 0x0000003387cd4fdd in clone () from /lib64/libc.so.6

(gdb) thread 6
[Switching to thread 6 (Thread 28071)]#0 0x0000003387cce172 in select () from /lib64/libc.so.6
(gdb) bt
#0 0x0000003387cce172 in select () from /lib64/libc.so.6
#1 0x0000000000616a57 in hazelcast::client::connection::InSelector::listenInternal() ()
#2 0x0000000000614330 in hazelcast::client::connection::IOSelector::listen() ()
#3 0x000000000065ea93 in hazelcast::util::Thread::controlledThread(void*) ()
#4 0x000000338880683d in start_thread () from /lib64/libpthread.so.0
#5 0x0000003387cd4fdd in clone () from /lib64/libc.so.6

(gdb) thread 7
[Switching to thread 7 (Thread 0x2b3c94137250 (LWP 24821))]#0 0x0000003388807c65 in pthread_join () from /lib64/libpthread.so.0
(gdb) bt
#0 0x0000003388807c65 in pthread_join () from /lib64/libpthread.so.0
#1 0x000000000065e21e in hazelcast::util::Thread::~Thread() ()
#2 0x0000000000529ac1 in hazelcast::client::test::ICountDownLatchTest_testLatch_Test::TestBody() ()
#3 0x00000000006fc664 in void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test_, void (testing::Test::)(), char const*) ()
#4 0x0000000000704906 in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test
, void (testing::Test::)(), char const*) ()
#5 0x00000000006f23fb in testing::Test::Run() ()
#6 0x00000000006f26e6 in testing::TestInfo::Run() ()
#7 0x00000000006f2807 in testing::TestCase::Run() ()
#8 0x00000000006f510d in testing::internal::UnitTestImpl::RunAllTests() ()
#9 0x00000000006fc6f4 in bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl
, bool (testing::internal::UnitTestImpl::)(), char const*) ()
#10 0x00000000007043a9 in bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl
, bool (testing::internal::UnitTestImpl::_)(), char const*) ()
#11 0x00000000006f0fe7 in testing::UnitTest::Run() ()
#12 0x000000000052ac7a in main ()

(gdb)

Hash calculation test

We need a test to verify that the hash calculation produces the same result by all the clients on a set of data.

The client gets stuck on server restart

It has been observed that the client may be hung when the server is restarted. The stack trace shows:

(gdb) bt
#0 0x00007fe53a5f17ce in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
#1 0x00000000004c6de3 in hazelcast::util::ConditionVariable::waitFor(hazelcast::util::Mutex&, long) ()
#2 0x00000000004bd205 in hazelcast::client::connection::CallFuture::get(long) ()
#3 0x00000000004bdb25 in hazelcast::client::connection::CallFuture::get() ()
#4 0x000000000044317e in hazelcast::client::proxy::ProxyImpl::invoke(std::auto_ptrhazelcast::client::protocol::ClientMessage, int) ()
#5 0x0000000000449dc3 in hazelcast::client::proxy::IMapImpl::get(hazelcast::client::serialization::pimpl::Data const&) ()
#6 0x0000000000406dc1 in hazelcast::client::IMap<std::string, std::string>::get (this=0x7ffe02f39a10, key=...)

at ./hazelcast-cpp-client/Linux_64_3.6-RC1/hazelcast/include/hazelcast/client/IMap.h:85

Behaviour of client when cluster is shutdown

We need to check how the client behave when the cluster is down. Should it retry connecting to the configured ip addresses as it does on startup, or what?

Currently,when the last member goes down since no cluster update is received the last server exist in the member list and it is the only one tried for connections, is this correct behaviour?

Map interceptor API

Change map and raw map addInterceptor API to accept IdentifiedDataSerializable or Portable Interceptor interface classes instead of the templated method dependency. The API doc only allows for these two serialization types.

Remove seperate owner connection

Our other clients opens one connection to a node in cluster. Only C++ opens two connections two owner node. C++ code base needs to be updated and should be sync with other clients.

Also related code written to preserve backward compatibility on server side. (Client HeartBeat check )
should be updated accordingly after the fix.

Related issue leads to fix on server side hazelcast/hazelcast#5054
Related change on master hazelcast/hazelcast#7252
Related change on maintenance hazelcast/hazelcast#7253

Async API is missing

Current C++ API is missing the asyc API such as IMap::getAsync. Needs to be added for all containers for asynchronous operation.

Const codec methods

Codecs can be generated so that encode and decode methods are const methods. Furthermore, a lot of methods in IMap and other containers can be made const.

Invocation timeout not accounted correctly

hazelcast.client.invocation.timeout parameter at the Java client does not exist for C++ client. We need to add this feature. Only way for the invocation to finish is min(heartbeat-time, MAX_INT)=heartbeat-time

Eliminate temporary string construction

Some interfaces takes parameter as "const std::string &", this would cause temporary string object creation if we pass a const char *, hence we can change them to const char *, at least for internal implementation. E.g. "ProxyImpl(const std::string &serviceName, const std::string &objectName, spi::ClientContext *context);"

static const char srvName = "test";
static const char instanceName = "testInstance";
ProxyImpl(srvName, instanceName, context); // this line causes the temporary object creation

Elimination of getaddrinfo in Socket class

getaddrinfo, freeaddrinfo does name lookup, may cause problems in some closed networks, it may perform dns lookups and it somehow seems to use a lock which sometimes created problems. It may be possible to eliminate this since we already have the host name/ip and port.

Missing Distributed Object creation

HazelcastClient getMap should create a proxy as the Java client does.

Failing to send create distributed object causes the map initialize without adding any xml configured indexes and hence the indexes may not work as expected.

Doxygen doc

Integrate doxygen documentation generation into the build system.

Client Initialization may be blocked indefinitely

The hazelcast client initialization seems to be blocked on the getnameinfo call. The log: https://hazelcast-l337.ci.cloudbees.com/view/Clients/job/cpp-play/84/console

When looking at the thread stack traces we observe the following:

(gdb) info threads
5 Thread 0xf0ea9b90 (LWP 4459) 0xffffe410 in __kernel_vsyscall ()
4 Thread 0xf7cb3b90 (LWP 4460) 0xffffe410 in __kernel_vsyscall ()
3 Thread 0xf36abb90 (LWP 4461) 0xffffe410 in __kernel_vsyscall ()
2 Thread 0xf54adb90 (LWP 4462) 0xffffe410 in __kernel_vsyscall ()

  • 1 Thread 0xf7cb48e0 (LWP 3761) 0xffffe410 in __kernel_vsyscall ()
    (gdb) bt
    #0 0xffffe410 in __kernel_vsyscall ()
    #1 0x003f1776 in nanosleep () from /lib/libc.so.6
    #2 0x0042c7dc in usleep () from /lib/libc.so.6
    #3 0xf7ea037b in hazelcast::util::sleepmillis (milliseconds=1000) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/Util.cpp:54
    #4 0xf7ea0351 in hazelcast::util::sleep (seconds=1) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/Util.cpp:47
    #5 0xf7ea1a53 in hazelcast::util::CountDownLatch::await (this=0xffbd0234) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/CountDownLatch.cpp:54
    #6 0xf7e05f89 in hazelcast::client::spi::ClusterService::start (this=0xffbd0228) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/spi/ClusterService.cpp:52
    #7 0xf7df94e5 in hazelcast::client::spi::LifecycleService::start (this=0xffbcfed8) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/spi/LifecycleService.cpp:50
    #8 0xf7e24e7a in hazelcast::client::HazelcastClient::HazelcastClient (this=0xffbcfe00, config=...) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/HazelcastClient.cpp:49
    #9 0x0816fe52 in hazelcast::client::test::ClusterTest::testListenersWhenClusterDown (this=0xffbd1490) at /root/jenkins/workspace/cpp-play/hazelcast/test/cluster/ClusterTest.cpp:233
    #10 0x08116092 in iTest::iTestFixturehazelcast::client::test::ClusterTest::executeTests (this=0xffbd1490) at /root/jenkins/workspace/cpp-play/hazelcast/include/iTest/iTestFixture.h:97
    #11 0x08111cd6 in unitTests (address=0x818f1e7 "127.0.0.1") at /root/jenkins/workspace/cpp-play/hazelcast/test/main.cpp:65
    #12 0x08112880 in main (argc=1, argv=0xffbd18d4) at /root/jenkins/workspace/cpp-play/hazelcast/test/main.cpp:99

(gdb) thread 2
[Switching to thread 2 (Thread 0xf54adb90 (LWP 4462))]#0 0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0 0xffffe410 in __kernel_vsyscall ()
#1 0x004c8839 in __lll_lock_wait () from /lib/libpthread.so.0
#2 0x004c3e9f in _L_lock_885 () from /lib/libpthread.so.0
#3 0x004c3d66 in pthread_mutex_lock () from /lib/libpthread.so.0
#4 0xf7fcb50c in _nss_files_gethostbyaddr_r () from /lib/libnss_files.so.2
#5 0x004499f7 in gethostbyaddr_r@@GLIBC_2.1.2 () from /lib/libc.so.6
#6 0x00451efd in getnameinfo () from /lib/libc.so.6
#7 0xf7e9dd0e in hazelcast::client::Socket::getAddress (this=0x95ef148) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/Socket.cpp:170
#8 0xf7e2d550 in hazelcast::client::connection::Connection::connect (this=0x95ef100, timeoutInMillis=5000) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/Connection.cpp:69
#9 0xf7e358ab in hazelcast::client::connection::ConnectionManager::connectTo (this=0xffbcff98, address=..., ownerConnection=true) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/ConnectionManager.cpp:306
#10 0xf7e2f2c3 in hazelcast::client::connection::OwnerConnectionFuture::createNew (this=0xffbd01fc, address=...) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/OwnerConnectionFuture.cpp:42
#11 0xf7e33669 in hazelcast::client::connection::ConnectionManager::createOwnerConnection (this=0xffbcff98, address=...) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/ConnectionManager.cpp:98
#12 0xf7e06cc3 in hazelcast::client::spi::ClusterService::connectToOne (this=0xffbd0228) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/spi/ClusterService.cpp:170
#13 0xf7e42730 in hazelcast::client::connection::ClusterListenerThread::run (this=0xffbd022c, currentThread=0xf6c010a0) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/ClusterListenerThread.cpp:56
#14 0xf7e4268d in hazelcast::client::connection::ClusterListenerThread::staticRun (args=...) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/ClusterListenerThread.cpp:44
#15 0xf7ea3823 in hazelcast::util::Thread::controlledThread (args=0xf6c010d8) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/Thread.cpp:193
#16 0x004c1912 in start_thread () from /lib/libpthread.so.0
#17 0x0043347e in clone () from /lib/libc.so.6

(gdb) thread 3
[Switching to thread 3 (Thread 0xf36abb90 (LWP 4461))]#0 0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0 0xffffe410 in __kernel_vsyscall ()
#1 0x003f1776 in nanosleep () from /lib/libc.so.6
#2 0x0042c7dc in usleep () from /lib/libc.so.6
#3 0xf7ea037b in hazelcast::util::sleepmillis (milliseconds=10000) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/Util.cpp:54
#4 0xf7ea0351 in hazelcast::util::sleep (seconds=10) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/Util.cpp:47
#5 0xf7ea370f in hazelcast::util::Thread::interruptibleSleep (this=0xf6c0ab08, seconds=10) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/Thread.cpp:167
#6 0xf7e3c33e in hazelcast::client::connection::HeartBeater::run (this=0xffbd01cc, currentThread=0xf6c0ab08) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/HeartBeater.cpp:81
#7 0xf7e3c021 in hazelcast::client::connection::HeartBeater::staticStart (args=...) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/HeartBeater.cpp:54
#8 0xf7ea3823 in hazelcast::util::Thread::controlledThread (args=0xf6c01050) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/Thread.cpp:193
#9 0x004c1912 in start_thread () from /lib/libpthread.so.0
#10 0x0043347e in clone () from /lib/libc.so.6

(gdb) thread 4
[Switching to thread 4 (Thread 0xf7cb3b90 (LWP 4460))]#0 0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0 0xffffe410 in __kernel_vsyscall ()
#1 0x0042bf41 in select () from /lib/libc.so.6
#2 0xf7e3f4c0 in hazelcast::client::connection::OutSelector::listenInternal (this=0xffbd00b4) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/OutSelector.cpp:59
#3 0xf7e3cd48 in hazelcast::client::connection::IOSelector::listen (this=0xffbd00b4) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/IOSelector.cpp:68
#4 0xf7e3c7e7 in hazelcast::client::connection::IOSelector::staticListen (args=...) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/IOSelector.cpp:47
#5 0xf7ea3823 in hazelcast::util::Thread::controlledThread (args=0xf6c0aac8) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/Thread.cpp:193
#6 0x004c1912 in start_thread () from /lib/libpthread.so.0
#7 0x0043347e in clone () from /lib/libc.so.6

(gdb) thread 5
[Switching to thread 5 (Thread 0xf0ea9b90 (LWP 4459))]#0 0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0 0xffffe410 in __kernel_vsyscall ()
#1 0x0042bf41 in select () from /lib/libc.so.6
#2 0xf7e3fc4f in hazelcast::client::connection::InSelector::listenInternal (this=0xffbd000c) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/InSelector.cpp:51
#3 0xf7e3cd48 in hazelcast::client::connection::IOSelector::listen (this=0xffbd000c) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/IOSelector.cpp:68
#4 0xf7e3c7e7 in hazelcast::client::connection::IOSelector::staticListen (args=...) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/client/connection/IOSelector.cpp:47
#5 0xf7ea3823 in hazelcast::util::Thread::controlledThread (args=0xf6c0aa50) at /root/jenkins/workspace/cpp-play/hazelcast/src/hazelcast/util/Thread.cpp:193
#6 0x004c1912 in start_thread () from /lib/libpthread.so.0
#7 0x0043347e in clone () from /lib/libc.so.6

Long nightly builds, latest compilers, ubuntu

The windows nightly build runs 8 different platform combinations which is almost equal to 8 test runs and hence lasts about 80 minutes. We did separate the builds for linux nightly build. Let's do the same for windows and other builds.

Also, add docker builds for latest compiler version and ubuntu environment as well.

Windows thread cancellation

We need to write more tests and check to see if Thread destructor or cancellation works in Windows for all cases (e.g. when waiting on a select call)

Lazy deserialized interface

DataArray and DataEntry introduced the concept of lazy de-serialization. We can design the whole API with such structures to provide lazy deserialization. E.g. when we do map.put it returns the old value and we de-serialize it by default, but the user may not be interested in the old value at all.

Add stlport based builds

PR #140 introduces a minor portability fix for stlport based builds. We need to set docker image and builds for stlport based builds.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.